[llvm-commits] [llvm] r53445 - /llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner sabre at nondot.org
Thu Jul 10 22:08:55 PDT 2008


Author: lattner
Date: Fri Jul 11 00:08:55 2008
New Revision: 53445

URL: http://llvm.org/viewvc/llvm-project?rev=53445&view=rev
Log:
fold away (x <= cst) earlier, allowing us to not have to 
handle them in some code.

Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=53445&r1=53444&r2=53445&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Fri Jul 11 00:08:55 2008
@@ -5251,6 +5251,29 @@
       return new ICmpInst(I.getPredicate(), A, B);
     }
     
+    // If we have a icmp le or icmp ge instruction, turn it into the appropriate
+    // icmp lt or icmp gt instruction.  This allows us to rely on them being
+    // folded in the code below.
+    switch (I.getPredicate()) {
+    default: break;
+    case ICmpInst::ICMP_ULE:
+      if (CI->isMaxValue(false))                 // A <=u MAX -> TRUE
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      return new ICmpInst(ICmpInst::ICMP_ULT, Op0, AddOne(CI));
+    case ICmpInst::ICMP_SLE:
+      if (CI->isMaxValue(true))                  // A <=s MAX -> TRUE
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      return new ICmpInst(ICmpInst::ICMP_SLT, Op0, AddOne(CI));
+    case ICmpInst::ICMP_UGE:
+      if (CI->isMinValue(false))                 // A >=u MIN -> TRUE
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      return new ICmpInst( ICmpInst::ICMP_UGT, Op0, SubOne(CI));
+    case ICmpInst::ICMP_SGE:
+      if (CI->isMinValue(true))                  // A >=s MIN -> TRUE
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      return new ICmpInst(ICmpInst::ICMP_SGT, Op0, SubOne(CI));
+    }
+    
     switch (I.getPredicate()) {
     default: break;
     case ICmpInst::ICMP_ULT:                        // A <u MIN -> FALSE
@@ -5298,64 +5321,11 @@
       if (isMaxValueMinusOne(CI, true))           // A >s MAX-1 -> A == MAX
         return new ICmpInst(ICmpInst::ICMP_EQ, Op0, AddOne(CI));
       break;
-
-    case ICmpInst::ICMP_ULE:
-      if (CI->isMaxValue(false))                 // A <=u MAX -> TRUE
-        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-      if (CI->isMinValue(false))                 // A <=u MIN -> A == MIN
-        return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
-      if (isMaxValueMinusOne(CI,false))          // A <=u MAX-1 -> A != MAX
-        return new ICmpInst(ICmpInst::ICMP_NE, Op0, AddOne(CI));
-      break;
-
-    case ICmpInst::ICMP_SLE:
-      if (CI->isMaxValue(true))                  // A <=s MAX -> TRUE
-        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-      if (CI->isMinValue(true))                  // A <=s MIN -> A == MIN
-        return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
-      if (isMaxValueMinusOne(CI,true))           // A <=s MAX-1 -> A != MAX
-        return new ICmpInst(ICmpInst::ICMP_NE, Op0, AddOne(CI));
-      break;
-
-    case ICmpInst::ICMP_UGE:
-      if (CI->isMinValue(false))                 // A >=u MIN -> TRUE
-        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-      if (CI->isMaxValue(false))                 // A >=u MAX -> A == MAX
-        return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
-      if (isMinValuePlusOne(CI,false))           // A >=u MIN-1 -> A != MIN
-        return new ICmpInst(ICmpInst::ICMP_NE, Op0, SubOne(CI));
-      break;
-
-    case ICmpInst::ICMP_SGE:
-      if (CI->isMinValue(true))                  // A >=s MIN -> TRUE
-        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-      if (CI->isMaxValue(true))                  // A >=s MAX -> A == MAX
-        return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
-      if (isMinValuePlusOne(CI,true))            // A >=s MIN-1 -> A != MIN
-        return new ICmpInst(ICmpInst::ICMP_NE, Op0, SubOne(CI));
-      break;
     }
 
-    // If we still have a icmp le or icmp ge instruction, turn it into the
-    // appropriate icmp lt or icmp gt instruction.  Since the border cases have
-    // already been handled above, this requires little checking.
-    //
-    switch (I.getPredicate()) {
-    default: break;
-    case ICmpInst::ICMP_ULE: 
-      return new ICmpInst(ICmpInst::ICMP_ULT, Op0, AddOne(CI));
-    case ICmpInst::ICMP_SLE:
-      return new ICmpInst(ICmpInst::ICMP_SLT, Op0, AddOne(CI));
-    case ICmpInst::ICMP_UGE:
-      return new ICmpInst( ICmpInst::ICMP_UGT, Op0, SubOne(CI));
-    case ICmpInst::ICMP_SGE:
-      return new ICmpInst(ICmpInst::ICMP_SGT, Op0, SubOne(CI));
-    }
-    
     // See if we can fold the comparison based on bits known to be zero or one
     // in the input.  If this comparison is a normal comparison, it demands all
     // bits, if it is a sign bit comparison, it only demands the sign bit.
-    
     bool UnusedBit;
     bool isSignBit = isSignBitCheck(I.getPredicate(), CI, UnusedBit);
     
@@ -5368,56 +5338,51 @@
       return &I;
         
     // Given the known and unknown bits, compute a range that the LHS could be
-    // in.
-    if ((KnownOne | KnownZero) != 0) {
-      // Compute the Min, Max and RHS values based on the known bits. For the
-      // EQ and NE we use unsigned values.
-      APInt Min(BitWidth, 0), Max(BitWidth, 0);
-      const APInt& RHSVal = CI->getValue();
-      if (ICmpInst::isSignedPredicate(I.getPredicate())) {
-        ComputeSignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, Min, 
-                                               Max);
-      } else {
-        ComputeUnsignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, Min, 
-                                                 Max);
-      }
-      switch (I.getPredicate()) {  // LE/GE have been folded already.
-      default: assert(0 && "Unknown icmp opcode!");
-      case ICmpInst::ICMP_EQ:
-        if (Max.ult(RHSVal) || Min.ugt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getFalse());
-        break;
-      case ICmpInst::ICMP_NE:
-        if (Max.ult(RHSVal) || Min.ugt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-        break;
-      case ICmpInst::ICMP_ULT:
-        if (Max.ult(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-        if (Min.uge(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getFalse());
-        break;
-      case ICmpInst::ICMP_UGT:
-        if (Min.ugt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-        if (Max.ule(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getFalse());
-        break;
-      case ICmpInst::ICMP_SLT:
-        if (Max.slt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-        if (Min.sgt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getFalse());
-        if (Max == RHSVal)  // A <s MAX -> A != MAX
-          return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
-        break;
-      case ICmpInst::ICMP_SGT: 
-        if (Min.sgt(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getTrue());
-        if (Max.sle(RHSVal))
-          return ReplaceInstUsesWith(I, ConstantInt::getFalse());
-        break;
-      }
+    // in.  Compute the Min, Max and RHS values based on the known bits. For the
+    // EQ and NE we use unsigned values.
+    APInt Min(BitWidth, 0), Max(BitWidth, 0);
+    const APInt& RHSVal = CI->getValue();
+    if (ICmpInst::isSignedPredicate(I.getPredicate()))
+      ComputeSignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, Min, Max);
+    else
+      ComputeUnsignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne,Min,Max);
+    
+    switch (I.getPredicate()) {  // LE/GE have been folded already.
+    default: assert(0 && "Unknown icmp opcode!");
+    case ICmpInst::ICMP_EQ:
+      if (Max.ult(RHSVal) || Min.ugt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getFalse());
+      break;
+    case ICmpInst::ICMP_NE:
+      if (Max.ult(RHSVal) || Min.ugt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      break;
+    case ICmpInst::ICMP_ULT:
+      if (Max.ult(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      if (Min.uge(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getFalse());
+      break;
+    case ICmpInst::ICMP_UGT:
+      if (Min.ugt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      if (Max.ule(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getFalse());
+      break;
+    case ICmpInst::ICMP_SLT:
+      if (Max.slt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      if (Min.sgt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getFalse());
+      if (Max == RHSVal)  // A <s MAX -> A != MAX
+        return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
+      break;
+    case ICmpInst::ICMP_SGT: 
+      if (Min.sgt(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getTrue());
+      if (Max.sle(RHSVal))
+        return ReplaceInstUsesWith(I, ConstantInt::getFalse());
+      break;
     }
           
     // Since the RHS is a ConstantInt (CI), if the left hand side is an 





More information about the llvm-commits mailing list