[llvm-commits] [llvm] r55113 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll
Nick Lewycky
nicholas at mxc.ca
Wed Aug 20 22:56:11 PDT 2008
Author: nicholas
Date: Thu Aug 21 00:56:10 2008
New Revision: 55113
URL: http://llvm.org/viewvc/llvm-project?rev=55113&view=rev
Log:
Revert r54876 r54877 r54906 and r54907. Evan found that these caused a 20%
slowdown in bzip2.
Modified:
llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
llvm/trunk/test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll
Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=55113&r1=55112&r2=55113&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Thu Aug 21 00:56:10 2008
@@ -5492,60 +5492,35 @@
// See if it's the same type of instruction on the left and right.
if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) {
if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1)) {
- if (Op0I->getOpcode() == Op1I->getOpcode() &&
- Op0I->getOperand(1) == Op1I->getOperand(1)) {
- switch (Op0I->getOpcode()) {
+ if (Op0I->getOpcode() == Op1I->getOpcode() && Op0I->hasOneUse() &&
+ Op1I->hasOneUse() && Op0I->getOperand(1) == Op1I->getOperand(1) &&
+ I.isEquality()) {
+ switch (Op0I->getOpcode()) {
default: break;
case Instruction::Add:
case Instruction::Sub:
case Instruction::Xor:
- if (I.isEquality()) {
- // icmp eq/ne a+x, b+x --> icmp eq/ne a, b
- return new ICmpInst(I.getPredicate(), Op0I->getOperand(0),
- Op1I->getOperand(0));
- } else {
- 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()
- : I.getSignedPredicate();
- 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));
-
- }
- }
- }
+ // a+x icmp eq/ne b+x --> a icmp b
+ return new ICmpInst(I.getPredicate(), Op0I->getOperand(0),
+ Op1I->getOperand(0));
break;
case Instruction::Mul:
- // a * Cst icmp eq/ne b * Cst --> a & Mask icmp b & Mask
- // Mask = -1 >> count-trailing-zeros(Cst).
- if (Op0I->hasOneUse() && Op1I->hasOneUse() && I.isEquality()) {
- if (ConstantInt *CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
- if (!CI->isZero() && !CI->isOne()) {
- const APInt &AP = CI->getValue();
- ConstantInt *Mask =
- ConstantInt::get(APInt::getLowBitsSet(AP.getBitWidth(),
- AP.getBitWidth() -
+ if (ConstantInt *CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
+ // a * Cst icmp eq/ne b * Cst --> a & Mask icmp b & Mask
+ // Mask = -1 >> count-trailing-zeros(Cst).
+ if (!CI->isZero() && !CI->isOne()) {
+ const APInt &AP = CI->getValue();
+ ConstantInt *Mask = ConstantInt::get(
+ APInt::getLowBitsSet(AP.getBitWidth(),
+ AP.getBitWidth() -
AP.countTrailingZeros()));
- Instruction *And1 =
- BinaryOperator::CreateAnd(Op0I->getOperand(0), Mask);
- Instruction *And2 =
- BinaryOperator::CreateAnd(Op1I->getOperand(0), Mask);
- InsertNewInstBefore(And1, I);
- InsertNewInstBefore(And2, I);
- return new ICmpInst(I.getPredicate(), And1, And2);
- }
+ Instruction *And1 = BinaryOperator::CreateAnd(Op0I->getOperand(0),
+ Mask);
+ Instruction *And2 = BinaryOperator::CreateAnd(Op1I->getOperand(0),
+ Mask);
+ InsertNewInstBefore(And1, I);
+ InsertNewInstBefore(And2, I);
+ return new ICmpInst(I.getPredicate(), And1, And2);
}
}
break;
@@ -5820,27 +5795,6 @@
else
return new ICmpInst(ICmpInst::ICMP_SLT, CompareVal, AddOne(RHS));
}
-
- // (icmp u/s (xor A SignBit), C) -> (icmp s/u A, (xor C SignBit))
- if (!ICI.isEquality() && XorCST->getValue().isSignBit()) {
- const APInt &SignBit = XorCST->getValue();
- ICmpInst::Predicate Pred = ICI.isSignedPredicate()
- ? ICI.getUnsignedPredicate()
- : ICI.getSignedPredicate();
- return new ICmpInst(Pred, LHSI->getOperand(0),
- ConstantInt::get(RHSV ^ SignBit));
- }
-
- // (icmp u/s (xor A ~SignBit), C) -> (icmp s/u (xor C ~SignBit), A)
- 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)
Modified: llvm/trunk/test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll?rev=55113&r1=55112&r2=55113&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll Thu Aug 21 00:56:10 2008
@@ -1,4 +1,5 @@
-; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep -v xor
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep xor
+; XFAIL: *
define i1 @test1(i8 %x, i8 %y) {
%X = xor i8 %x, 128
More information about the llvm-commits
mailing list