enhance the "alloca is just a memcpy from constant global"
authorChris Lattner <sabre@nondot.org>
Thu, 18 Nov 2010 06:26:49 +0000 (06:26 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Nov 2010 06:26:49 +0000 (06:26 +0000)
to ignore calls that obviously can't modify the alloca
because they are readonly/readnone.

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

lib/Transforms/Scalar/ScalarReplAggregates.cpp
test/Transforms/ScalarRepl/memcpy-from-global.ll

index 6f4f17e20fb4481554b49cd22fbab42e433a93d3..fe40bcc22d5faf77e1194e9edae54cc7f20313eb 100644 (file)
@@ -34,6 +34,7 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Transforms/Utils/PromoteMemToReg.h"
 #include "llvm/Transforms/Utils/Local.h"
+#include "llvm/Support/CallSite.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
@@ -1810,6 +1811,12 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
       continue;
     }
     
+    // If this is a readonly/readnone call site, then we know it is just a load
+    // and we can ignore it.
+    if (CallSite CS = U)
+      if (CS.onlyReadsMemory())
+        continue;
+    
     // If this is isn't our memcpy/memmove, reject it as something we can't
     // handle.
     MemTransferInst *MI = dyn_cast<MemTransferInst>(U);
index e807177357bc647206f05efc4fb967dad4f71b93..68fc2a2c5814064027450ade08697f57a62dd7a8 100644 (file)
@@ -68,3 +68,16 @@ define void @test2() {
 }
 
 declare void @bar(i8*)
+
+
+;; Should be able to eliminate the alloca.
+define void @test3() {
+  %A = alloca %T
+  %a = bitcast %T* %A to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* bitcast (%T* @G to i8*), i64 124, i32 4, i1 false)
+  call void @bar(i8* %a) readonly
+; CHECK: @test3
+; CHECK-NEXT: %a = bitcast %T* @G to i8*
+; CHECK-NEXT: call void @bar(i8* %a)
+  ret void
+}