Don't forget that strcpy and friends return a pointer to the destination, so
authorNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 01:55:59 +0000 (01:55 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 01:55:59 +0000 (01:55 +0000)
it's not a dead store if that pointer is used. Whoops!

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

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

index f96309eb4d178c93c93fe7a453a9a63e33756d2c..301ee2f663bebdff7dfe9fa1826c634d40d117ab 100644 (file)
@@ -266,8 +266,8 @@ static bool isRemovable(Instruction *I) {
     }
   }
 
-  if (CallSite(I))  // If we assume hasMemoryWrite(I) is true,
-    return true;    // then there's nothing left to check.
+  if (CallSite CS = I)
+    return CS.getInstruction()->use_empty();
 
   return false;
 }
index b83780b399d5425f2edcb8fb9c94ed6f6121f9d0..ffdf62b215039f233d072d43c3e385fdccbf3bca 100644 (file)
@@ -44,3 +44,13 @@ define void @test4(i8* %src) {
   ret void
 }
 
+define void @test5(i8* nocapture %src) {
+; CHECK: @test5
+  %dest = alloca [100 x i8], align 16
+  %arraydecay = getelementptr inbounds [100 x i8]* %dest, i64 0, i64 0
+  %call = call i8* @strcpy(i8* %arraydecay, i8* %src)
+; CHECK: %call = call i8* @strcpy
+  %arrayidx = getelementptr inbounds i8* %call, i64 10
+  store i8 97, i8* %arrayidx, align 1
+  ret void
+}