aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/InstructionCombining.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-09-27 19:29:18 +0000
committerChris Lattner <sabre@nondot.org>2004-09-27 19:29:18 +0000
commit83c4ec0372ea689bdc842cc57c9f599eb92fba14 (patch)
tree5d28262e9df50bd5e7bfcd6e163cc3fe0e180c77 /lib/Transforms/Scalar/InstructionCombining.cpp
parentdffb4455035df1445891b7d6a657f4ccbb67ab0c (diff)
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
Diffstat (limited to 'lib/Transforms/Scalar/InstructionCombining.cpp')
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp25
1 files changed, 11 insertions, 14 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index cdfdc34555..1e0e77dde7 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<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);
}
}