From 83c4ec0372ea689bdc842cc57c9f599eb92fba14 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 27 Sep 2004 19:29:18 +0000 Subject: [PATCH] Fix two bugs: one where a condition was mistakenly swapped, and another 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 --- .../Scalar/InstructionCombining.cpp | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index cdfdc34555b..1e0e77dde7f 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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(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); } } -- 2.34.1