diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2008-08-17 19:58:24 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2008-08-17 19:58:24 +0000 |
commit | 91a0f782650b6fb22984501f844f85b7091785f7 (patch) | |
tree | b7b53eddf5767164f324c83261b628d6aabc2bec /lib | |
parent | b20d685c6f8b2e604d7c13a9110ea5d3c639e11c (diff) |
Consider the case where xor by -1 and xor by 128 have been combined already to
produce an xor by 127.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54906 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 32232a6588..defad26f8a 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -5503,8 +5503,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { return new ICmpInst(I.getPredicate(), Op0I->getOperand(0), Op1I->getOperand(0)); } else { - // icmp u/s (a ^ signbit), (b ^ signbit) --> icmp s/u a, b if (ConstantInt *CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) { + // icmp u/s (a ^ signbit), (b ^ signbit) --> icmp s/u a, b if (CI->getValue().isSignBit()) { ICmpInst::Predicate Pred = I.isSignedPredicate() ? I.getUnsignedPredicate() @@ -5512,6 +5512,17 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { return new ICmpInst(Pred, Op0I->getOperand(0), Op1I->getOperand(0)); } + + // icmp u/s (a ^ ~signbit), (b ^ ~signbit) --> icmp s/u b, a + if ((~CI->getValue()).isSignBit()) { + ICmpInst::Predicate Pred = I.isSignedPredicate() + ? I.getUnsignedPredicate() + : I.getSignedPredicate(); + Pred = I.getSwappedPredicate(Pred); + return new ICmpInst(Pred, Op0I->getOperand(0), + Op1I->getOperand(0)); + + } } } break; @@ -5818,6 +5829,17 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI, return new ICmpInst(Pred, LHSI->getOperand(0), ConstantInt::get(RHSV ^ SignBit)); } + + // (icmp u/s (xor A ~SignBit), C) -> (icmp ~s/u A, (xor C ~SignBit)) + if (!ICI.isEquality() && (~XorCST->getValue()).isSignBit()) { + const APInt &NotSignBit = XorCST->getValue(); + ICmpInst::Predicate Pred = ICI.isSignedPredicate() + ? ICI.getUnsignedPredicate() + : ICI.getSignedPredicate(); + Pred = ICI.getSwappedPredicate(Pred); + return new ICmpInst(Pred, LHSI->getOperand(0), + ConstantInt::get(RHSV ^ NotSignBit)); + } } break; case Instruction::And: // (icmp pred (and X, AndCST), RHS) |