isAllocLikeFn is allowed to return true for functions which read memory; make
authorEli Friedman <eli.friedman@gmail.com>
Wed, 8 Aug 2012 02:17:32 +0000 (02:17 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 8 Aug 2012 02:17:32 +0000 (02:17 +0000)
sure we account for that correctly in DeadStoreElimination.  Fixes a regression
from r158919.  PR13547.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161468 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DeadStoreElimination.cpp
test/Transforms/DeadStoreElimination/simple.ll

index 5eff0e5a361927f84c6dd3b1ce85f1f84b41e494..dcae458606e9d9241258c494ff83a83b7004ece0 100644 (file)
@@ -740,12 +740,19 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
       continue;
     }
 
-    if (isa<AllocaInst>(BBI) || isAllocLikeFn(BBI)) {
+    if (isa<AllocaInst>(BBI)) {
+      // Remove allocas from the list of dead stack objects; there can't be
+      // any references before the definition.
       DeadStackObjects.remove(BBI);
       continue;
     }
 
     if (CallSite CS = cast<Value>(BBI)) {
+      // Remove allocation function calls from the list of dead stack objects; 
+      // there can't be any references before the definition.
+      if (isAllocLikeFn(BBI))
+        DeadStackObjects.remove(BBI);
+
       // If this call does not access memory, it can't be loading any of our
       // pointers.
       if (AA->doesNotAccessMemory(CS))
@@ -771,7 +778,7 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
       // If all of the allocas were clobbered by the call then we're not going
       // to find anything else to process.
       if (DeadStackObjects.empty())
-        return MadeChange;
+        break;
 
       continue;
     }
index a38620695e71df3e271abbcb09d2c749fda37716..ed53ab7e6071e38615fa67574dbf172694f4e2fd 100644 (file)
@@ -276,3 +276,18 @@ define void @test22(i1 %i, i32 %k, i32 %m) nounwind {
 ; CHECK-NEXT: ret void
   ret void
 }
+
+; PR13547
+; CHECK: @test23
+; CHECK: store i8 97
+; CHECK: store i8 0
+declare noalias i8* @strdup(i8* nocapture) nounwind
+define noalias i8* @test23() nounwind uwtable ssp {
+  %x = alloca [2 x i8], align 1
+  %arrayidx = getelementptr inbounds [2 x i8]* %x, i64 0, i64 0
+  store i8 97, i8* %arrayidx, align 1
+  %arrayidx1 = getelementptr inbounds [2 x i8]* %x, i64 0, i64 1
+  store i8 0, i8* %arrayidx1, align 1
+  %call = call i8* @strdup(i8* %arrayidx) nounwind
+  ret i8* %call
+}