Treat a call of function pointer like a load of the pointer when considering
authorNick Lewycky <nicholas@mxc.ca>
Wed, 24 Nov 2010 22:04:20 +0000 (22:04 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Wed, 24 Nov 2010 22:04:20 +0000 (22:04 +0000)
whether the pointer can be replaced with the global variable it is a copy of.
Fixes PR8680.

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

lib/Transforms/Scalar/ScalarReplAggregates.cpp
test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll [new file with mode: 0644]

index 3d676b2b24655dbcf6028b0399ad39c19858efef..3b4f4439d4f0edb6527da2689efc8c971398db92 100644 (file)
@@ -1783,7 +1783,7 @@ static bool PointsToConstantGlobal(Value *V) {
 /// see any stores or other unknown uses.  If we see pointer arithmetic, keep
 /// track of whether it moves the pointer (with isOffset) but otherwise traverse
 /// the uses.  If we see a memcpy/memmove that targets an unoffseted pointer to
-/// the alloca, and if the source pointer is a pointer to a constant  global, we
+/// the alloca, and if the source pointer is a pointer to a constant global, we
 /// can optimize this.
 static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
                                            bool isOffset) {
@@ -1816,6 +1816,11 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
       // load and we can ignore it.
       if (CS.onlyReadsMemory())
         continue;
+
+      // If this is the function being called then we treat it like a load and
+      // ignore it.
+      if (CS.isCallee(UI))
+        continue;
       
       // If this is being passed as a byval argument, the caller is making a
       // copy, so it is only a read of the alloca.
diff --git a/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll b/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll
new file mode 100644 (file)
index 0000000..3e07b15
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: opt -scalarrepl -disable-output %s
+; PR8680
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+
+define void @main() nounwind {
+entry:
+  %memtmp = alloca i32, align 4
+  %0 = bitcast i32* %memtmp to void ()*
+  call void %0() nounwind
+  ret void
+}
+