Fix two bugs: one where a condition was mistakenly swapped, and another
authorChris Lattner <sabre@nondot.org>
Mon, 27 Sep 2004 19:29:18 +0000 (19:29 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 27 Sep 2004 19:29:18 +0000 (19:29 +0000)
where we folded (X & 254) -> X < 1 instead of X < 2.  These problems were
latent problems exposed by the latest patch.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index cdfdc34555b6aab1d15883f868366c0889385dbd..1e0e77dde7fa63b70ecebeef1b1157c2760216ab 100644 (file)
@@ -1522,7 +1522,7 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
               unsigned ShiftOp = Shift->getOpcode() == Instruction::Shl
                 ? Instruction::Shr : Instruction::Shl;
               Constant *NewCst = ConstantExpr::get(ShiftOp, CI, ShAmt);
-              
+
               // Check to see if we are shifting out any of the bits being
               // compared.
               if (ConstantExpr::get(Shift->getOpcode(), NewCst, ShAmt) != CI){
@@ -1545,7 +1545,8 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
           }
         }
         break;
-      case Instruction::Shr:         // shr: (setcc (shr X, ShAmt), CI)
+
+      case Instruction::Shr:         // (setcc (shr X, ShAmt), CI)
         if (ConstantUInt *ShAmt = dyn_cast<ConstantUInt>(LHSI->getOperand(1))) {
           unsigned ShAmtVal = ShAmt->getValue();
           
@@ -1721,31 +1722,27 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
               // If 'X' is not signed, insert a cast now...
               if (!BOC->getType()->isSigned()) {
                 const Type *DestTy = BOC->getType()->getSignedVersion();
-                CastInst *NewCI = new CastInst(X,DestTy,X->getName()+".signed");
-                InsertNewInstBefore(NewCI, I);
-                X = NewCI;
+                X = InsertCastBefore(X, DestTy, I);
               }
               return new SetCondInst(isSetNE ? Instruction::SetLT :
                                          Instruction::SetGE, X,
                                      Constant::getNullValue(X->getType()));
             }
             
-            // ((X & ~7) == 0) --> X < 7
+            // ((X & ~7) == 0) --> X < 8
             if (CI->isNullValue() && isHighOnes(BOC)) {
               Value *X = BO->getOperand(0);
-              Constant *NotX = ConstantExpr::getNot(BOC);
+              Constant *NegX = ConstantExpr::getNeg(BOC);
 
               // If 'X' is signed, insert a cast now.
-              if (!NotX->getType()->isSigned()) {
-                const Type *DestTy = NotX->getType()->getUnsignedVersion();
-                CastInst *NewCI = new CastInst(X, DestTy, X->getName()+".uns");
-                InsertNewInstBefore(NewCI, I);
-                X = NewCI;
-                NotX = ConstantExpr::getCast(NotX, DestTy);
+              if (NegX->getType()->isSigned()) {
+                const Type *DestTy = NegX->getType()->getUnsignedVersion();
+                X = InsertCastBefore(X, DestTy, I);
+                NegX = ConstantExpr::getCast(NegX, DestTy);
               }
 
               return new SetCondInst(isSetNE ? Instruction::SetGE :
-                                     Instruction::SetLT, X, NotX);
+                                     Instruction::SetLT, X, NegX);
             }
 
           }