diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -1199,6 +1199,7 @@ if (Current->getParent() == KillingDef->getParent()) return true; const Loop *CurrentLI = LI.getLoopFor(Current->getParent()); + if (!ContainsIrreducibleLoops && CurrentLI && CurrentLI == LI.getLoopFor(KillingDef->getParent())) return true; @@ -1216,7 +1217,7 @@ Ptr = GEP->getPointerOperand()->stripPointerCasts(); if (auto *I = dyn_cast(Ptr)) - return I->getParent()->isEntryBlock(); + return !ContainsIrreducibleLoops && !LI.getLoopFor(I->getParent()); return true; } diff --git a/llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll --- a/llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll +++ b/llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll @@ -846,7 +846,6 @@ ; CHECK-NEXT: br label [[FIRST:%.*]] ; CHECK: first: ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i32 [[I:%.*]] -; CHECK-NEXT: store i16 1, ptr [[ARRAYIDX]], align 1 ; CHECK-NEXT: br label [[DO_BODY:%.*]] ; CHECK: do.body: ; CHECK-NEXT: [[I_0:%.*]] = phi i16 [ 0, [[FIRST]] ], [ [[INC:%.*]], [[DO_BODY]] ] diff --git a/llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll --- a/llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll +++ b/llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll @@ -170,7 +170,6 @@ ; CHECK-NEXT: br i1 true, label [[BB2:%.*]], label [[BB3:%.*]] ; CHECK: bb2: ; CHECK-NEXT: [[M:%.*]] = call noalias ptr @malloc(i64 10) -; CHECK-NEXT: store i8 1, ptr [[M]], align 1 ; CHECK-NEXT: br label [[BB3]] ; CHECK: bb3: ; CHECK-NEXT: [[R:%.*]] = phi ptr [ null, [[BB1:%.*]] ], [ [[M]], [[BB2]] ]