[llvm-commits] [llvm] r120126 - in /llvm/trunk: lib/Transforms/Scalar/ScalarReplAggregates.cpp test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll

Nick Lewycky nicholas at mxc.ca
Wed Nov 24 14:04:20 PST 2010


Author: nicholas
Date: Wed Nov 24 16:04:20 2010
New Revision: 120126

URL: http://llvm.org/viewvc/llvm-project?rev=120126&view=rev
Log:
Treat a call of function pointer like a load of the pointer when considering
whether the pointer can be replaced with the global variable it is a copy of.
Fixes PR8680.

Added:
    llvm/trunk/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp?rev=120126&r1=120125&r2=120126&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Wed Nov 24 16:04:20 2010
@@ -1783,7 +1783,7 @@
 /// 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 @@
       // 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.

Added: llvm/trunk/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll?rev=120126&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll (added)
+++ llvm/trunk/test/Transforms/ScalarRepl/2010-11-24-IndirectVoid.ll Wed Nov 24 16:04:20 2010
@@ -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
+}
+





More information about the llvm-commits mailing list