Don't restrict the set of instructions where we try to constant-fold the
authorEli Friedman <eli.friedman@gmail.com>
Wed, 15 Jul 2009 22:13:34 +0000 (22:13 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 15 Jul 2009 22:13:34 +0000 (22:13 +0000)
operands; it's possible to end up with a constant-foldable operand to
most instructions, even those which can't trap.

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

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/fold-bin-operand.ll [new file with mode: 0644]

index 4160ee7dc1ecdfea0b1c86508fc76c6a480f564e..fd87e30f96303f52e31afb3ead51b19f089655bb 100644 (file)
@@ -13021,9 +13021,7 @@ bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {
       continue;
     }
 
-    if (TD &&
-        (I->getType()->getTypeID() == Type::VoidTyID ||
-         I->isTrapping())) {
+    if (TD) {
       // See if we can constant fold its operands.
       for (User::op_iterator i = I->op_begin(), e = I->op_end(); i != e; ++i)
         if (ConstantExpr *CE = dyn_cast<ConstantExpr>(i))
diff --git a/test/Transforms/InstCombine/fold-bin-operand.ll b/test/Transforms/InstCombine/fold-bin-operand.ll
new file mode 100644 (file)
index 0000000..e884e19
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep icmp
+
+define i1 @f(i1 %x) {
+       %b = and i1 %x, icmp eq (i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 2 to i8*))
+       ret i1 %b
+}
+
+; FIXME: This doesn't fold at the moment!
+; define i32 @f(i32 %x) {
+;      %b = add i32 %x, zext (i1 icmp eq (i8* inttoptr (i32 1000000 to i8*), i8* inttoptr (i32 2000000 to i8*)) to i32)
+;      ret i32 %b
+;}
+