IC: (X & 5) == 13 --> false
authorChris Lattner <sabre@nondot.org>
Wed, 23 Jul 2003 17:02:11 +0000 (17:02 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 23 Jul 2003 17:02:11 +0000 (17:02 +0000)
IC: (X | 8) == 4  --> false

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 33de49d391d4916fc38f34517ed00591991cc0ba..d9c6ccee8d48fa0d31b7eaa58c48ebb659cd9c18 100644 (file)
@@ -697,15 +697,35 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
   // integers at the end of their ranges...
   //
   if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
-    if (CI->isNullValue()) {
-      if (I.getOpcode() == Instruction::SetNE)
-        return new CastInst(Op0, Type::BoolTy, I.getName());
-      else if (I.getOpcode() == Instruction::SetEQ) {
+    // Simplify seteq and setne instructions...
+    if (I.getOpcode() == Instruction::SetEQ ||
+        I.getOpcode() == Instruction::SetNE) {
+      bool isSetNE = I.getOpcode() == Instruction::SetNE;
+
+      if (CI->isNullValue()) {   // Simplify [seteq|setne] X, 0
+        CastInst *Val = new CastInst(Op0, Type::BoolTy, I.getName()+".not");
+        if (isSetNE) return Val;
+
         // seteq X, 0 -> not (cast X to bool)
-        Instruction *Val = new CastInst(Op0, Type::BoolTy, I.getName()+".not");
         InsertNewInstBefore(Val, I);
         return BinaryOperator::createNot(Val, I.getName());
       }
+
+      // If the first operand is (and|or) with a constant, and the second
+      // operand is a constant, simplify a bit.
+      if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Op0))
+        if (ConstantInt *BOC = dyn_cast<ConstantInt>(BO->getOperand(1)))
+          if (BO->getOpcode() == Instruction::Or) {
+            // If bits are being or'd in that are not present in the constant we
+            // are comparing against, then the comparison could never succeed!
+            if (!(*BOC & *~*CI)->isNullValue())
+              return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE));
+          } else if (BO->getOpcode() == Instruction::And) {
+            // If bits are being compared against that are and'd out, then the
+            // comparison can never succeed!
+            if (!(*CI & *~*BOC)->isNullValue())
+              return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE));
+          }
     }
 
     // Check to see if we are comparing against the minimum or maximum value...