aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-23 07:16:20 +0000
committerChris Lattner <sabre@nondot.org>2004-02-23 07:16:20 +0000
commitc5943fb186fabacd8f1ab0d135a103caa0a226ef (patch)
tree0b5170018fcd54247c6a20627ff519f59aa64bb8
parent3c4de7fbe08e26ad33af7222742da808dce4dc68 (diff)
Implement cast.ll::test14/15
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11742 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 8886364df3..105f2ae502 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -1378,6 +1378,43 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
default: break;
}
}
+ } else { // Not a SetEQ/SetNE
+ // If the LHS is a cast from an integral value of the same size,
+ if (CastInst *Cast = dyn_cast<CastInst>(Op0)) {
+ Value *CastOp = Cast->getOperand(0);
+ const Type *SrcTy = CastOp->getType();
+ unsigned SrcTySize = SrcTy->getPrimitiveSize();
+ if (SrcTy != Cast->getType() && SrcTy->isInteger() &&
+ SrcTySize == Cast->getType()->getPrimitiveSize()) {
+ assert((SrcTy->isSigned() ^ Cast->getType()->isSigned()) &&
+ "Source and destination signednesses should differ!");
+ if (Cast->getType()->isSigned()) {
+ // If this is a signed comparison, check for comparisons in the
+ // vicinity of zero.
+ if (I.getOpcode() == Instruction::SetLT && CI->isNullValue())
+ // X < 0 => x > 127
+ return BinaryOperator::create(Instruction::SetGT, CastOp,
+ ConstantUInt::get(SrcTy, (1ULL << (SrcTySize*8-1))-1));
+ else if (I.getOpcode() == Instruction::SetGT &&
+ cast<ConstantSInt>(CI)->getValue() == -1)
+ // X > -1 => x < 128
+ return BinaryOperator::create(Instruction::SetGT, CastOp,
+ ConstantUInt::get(SrcTy, 1ULL << (SrcTySize*8-1)));
+ } else {
+ ConstantUInt *CUI = cast<ConstantUInt>(CI);
+ if (I.getOpcode() == Instruction::SetLT &&
+ CUI->getValue() == 1ULL << (SrcTySize*8-1))
+ // X < 128 => X > -1
+ return BinaryOperator::create(Instruction::SetGT, CastOp,
+ ConstantSInt::get(SrcTy, -1));
+ else if (I.getOpcode() == Instruction::SetGT &&
+ CUI->getValue() == (1ULL << (SrcTySize*8-1))-1)
+ // X > 127 => X < 0
+ return BinaryOperator::create(Instruction::SetLT, CastOp,
+ Constant::getNullValue(SrcTy));
+ }
+ }
+ }
}
// Check to see if we are comparing against the minimum or maximum value...