IC: (X & 5) == 13 --> false

IC: (X | 8) == 4  --> false


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7257 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-07-23 17:02:11 +00:00
parent f7b447eb69
commit bc5d414823

View File

@ -697,15 +697,35 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
// integers at the end of their ranges...
//
if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
if (CI->isNullValue()) {
if (I.getOpcode() == Instruction::SetNE)
return new CastInst(Op0, Type::BoolTy, I.getName());
else if (I.getOpcode() == Instruction::SetEQ) {
// Simplify seteq and setne instructions...
if (I.getOpcode() == Instruction::SetEQ ||
I.getOpcode() == Instruction::SetNE) {
bool isSetNE = I.getOpcode() == Instruction::SetNE;
if (CI->isNullValue()) { // Simplify [seteq|setne] X, 0
CastInst *Val = new CastInst(Op0, Type::BoolTy, I.getName()+".not");
if (isSetNE) return Val;
// seteq X, 0 -> not (cast X to bool)
Instruction *Val = new CastInst(Op0, Type::BoolTy, I.getName()+".not");
InsertNewInstBefore(Val, I);
return BinaryOperator::createNot(Val, I.getName());
}
// If the first operand is (and|or) with a constant, and the second
// operand is a constant, simplify a bit.
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Op0))
if (ConstantInt *BOC = dyn_cast<ConstantInt>(BO->getOperand(1)))
if (BO->getOpcode() == Instruction::Or) {
// If bits are being or'd in that are not present in the constant we
// are comparing against, then the comparison could never succeed!
if (!(*BOC & *~*CI)->isNullValue())
return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE));
} else if (BO->getOpcode() == Instruction::And) {
// If bits are being compared against that are and'd out, then the
// comparison can never succeed!
if (!(*CI & *~*BOC)->isNullValue())
return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE));
}
}
// Check to see if we are comparing against the minimum or maximum value...