diff options
author | Chris Lattner <sabre@nondot.org> | 2003-07-23 17:02:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-07-23 17:02:11 +0000 |
commit | bc5d41482392d4ebd7fa2b992bbe89980ebd4f6c (patch) | |
tree | f40b505aefac8ffeb3372186f1c441edaaa076aa /lib | |
parent | f7b447eb69db5f3cd6abfecd94ecd3c06098dac9 (diff) |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 33de49d391..d9c6ccee8d 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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... |