[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