OSDN Git Service

Fix SCCP's handling of struct value loads and stores. SCCP doesn't
authorDan Gohman <gohman@apple.com>
Wed, 13 Aug 2008 21:22:48 +0000 (21:22 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 13 Aug 2008 21:22:48 +0000 (21:22 +0000)
track individual leaf values in such cases, so it needs to treat
struct values as normal values in this case.

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

lib/Transforms/Scalar/SCCP.cpp
test/Transforms/SCCP/empty-struct.ll [new file with mode: 0644]

index d52cef6..8c64d8f 100644 (file)
@@ -1583,7 +1583,6 @@ bool SCCP::runOnFunction(Function &F) {
       for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) {
         Instruction *Inst = BI++;
         if (Inst->getType() == Type::VoidTy ||
-            isa<StructType>(Inst->getType()) ||
             isa<TerminatorInst>(Inst))
           continue;
         
@@ -1760,7 +1759,6 @@ bool IPSCCP::runOnModule(Module &M) {
         for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) {
           Instruction *Inst = BI++;
           if (Inst->getType() == Type::VoidTy ||
-              isa<StructType>(Inst->getType()) ||
               isa<TerminatorInst>(Inst))
             continue;
           
diff --git a/test/Transforms/SCCP/empty-struct.ll b/test/Transforms/SCCP/empty-struct.ll
new file mode 100644 (file)
index 0000000..4e3dc69
--- /dev/null
@@ -0,0 +1,20 @@
+; RUN: llvm-as < %s > %t.bc
+; RUN: llvm-ld %t.bc -o %t.sh
+; PR2612
+
+@current_foo = internal global {  } zeroinitializer
+
+define i32 @main(...) {
+entry:
+        %retval = alloca i32            ; <i32*> [#uses=2]
+        store i32 0, i32* %retval
+        %local_foo = alloca {  }                ; <{  }*> [#uses=1]
+        load {  }* @current_foo         ; <{  }>:0 [#uses=1]
+        store {  } %0, {  }* %local_foo
+        br label %return
+
+return:         ; preds = %entry
+        load i32* %retval               ; <i32>:1 [#uses=1]
+        ret i32 %1
+}
+