[llvm-commits] CVS: llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp

Nick Lewycky nicholas at mxc.ca
Sun Mar 18 15:59:03 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

PredicateSimplifier.cpp updated: 1.59 -> 1.60
---
Log message:

Clean up this code and fix subtract miscompile.


---
Diffs of the changes:  (+22 -18)

 PredicateSimplifier.cpp |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)


Index: llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp
diff -u llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.59 llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.60
--- llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.59	Sat Mar 17 20:09:32 2007
+++ llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp	Sun Mar 18 17:58:46 2007
@@ -1543,13 +1543,26 @@
         // "%x = mul i32 %y, 0" then %x EQ 0
 
         Instruction::BinaryOps Opcode = BO->getOpcode();
+        const Type *Ty = BO->getType();
+        assert(!Ty->isFPOrFPVector() && "Float in work queue!");
+
+        Constant *Zero = Constant::getNullValue(Ty);
+        Constant *AllOnes = ConstantInt::getAllOnesValue(Ty);
 
         switch (Opcode) {
           default: break;
           case Instruction::Sub:
+            if (Op1 == Zero) {
+              add(BO, Op0, ICmpInst::ICMP_EQ, NewContext);
+              return;
+            }
+            break;
+          case Instruction::Or:
+            if (Op0 == AllOnes || Op1 == AllOnes) {
+              add(BO, AllOnes, ICmpInst::ICMP_EQ, NewContext);
+              return;
+            } // fall-through
           case Instruction::Add:
-          case Instruction::Or: {
-            Constant *Zero = Constant::getNullValue(BO->getType());
             if (Op0 == Zero) {
               add(BO, Op1, ICmpInst::ICMP_EQ, NewContext);
               return;
@@ -1557,9 +1570,8 @@
               add(BO, Op0, ICmpInst::ICMP_EQ, NewContext);
               return;
             }
-	  } break;
-          case Instruction::And: {
-            Constant *AllOnes = ConstantInt::getAllOnesValue(BO->getType());
+            break;
+          case Instruction::And:
             if (Op0 == AllOnes) {
               add(BO, Op1, ICmpInst::ICMP_EQ, NewContext);
               return;
@@ -1567,17 +1579,13 @@
               add(BO, Op0, ICmpInst::ICMP_EQ, NewContext);
               return;
             }
-          } break;
-          case Instruction::Mul: {
-            Constant *Zero = Constant::getNullValue(BO->getType());
-            if (Op0 == Zero) {
-              add(BO, Zero, ICmpInst::ICMP_EQ, NewContext);
-              return;
-            } else if (Op1 == Zero) {
+            // fall-through
+          case Instruction::Mul:
+            if (Op0 == Zero || Op1 == Zero) {
               add(BO, Zero, ICmpInst::ICMP_EQ, NewContext);
               return;
             }
-	  } break;
+            break;
         }
 
         // "%x = add i32 %y, %z" and %x EQ %y then %z EQ 0
@@ -1585,9 +1593,6 @@
         // 1. Repeat all of the above, with order of operands reversed.
         // "%x = udiv i32 %y, %z" and %x EQ %y then %z EQ 1
 
-        const Type *Ty = BO->getType();
-        assert(!Ty->isFPOrFPVector() && "Float in work queue!");
-
         Value *Known = Op0, *Unknown = Op1;
         if (Known != BO) std::swap(Known, Unknown);
         if (Known == BO) {
@@ -1596,8 +1601,7 @@
             case Instruction::Xor:
             case Instruction::Add:
             case Instruction::Sub:
-              add(Unknown, Constant::getNullValue(Ty), ICmpInst::ICMP_EQ,
-                  NewContext);
+              add(Unknown, Zero, ICmpInst::ICMP_EQ, NewContext);
               break;
             case Instruction::UDiv:
             case Instruction::SDiv:






More information about the llvm-commits mailing list