Consider the case where xor by -1 and xor by 128 have been combined already to
authorNick Lewycky <nicholas@mxc.ca>
Sun, 17 Aug 2008 19:58:24 +0000 (19:58 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 17 Aug 2008 19:58:24 +0000 (19:58 +0000)
produce an xor by 127.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54906 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/2008-08-17-ICmpXorSignbit.ll

index 32232a6588913b7cbd2c84f78888226bfc2ef21d..defad26f8a1c33098e3af7a528b083e256754ee9 100644 (file)
@@ -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)
index 68ed3276e87ffe795175feb1b30fa02f65c47f2d..91264361d2d77813c733956cd98de56622a38fdb 100644 (file)
@@ -20,3 +20,22 @@ define i1 @test3(i8 %x) {
   ret i1 %tmp
 }
 
+define i1 @test4(i8 %x, i8 %y) {
+  %X = xor i8 %x, 127
+  %Y = xor i8 %y, 127
+  %tmp = icmp slt i8 %X, %Y
+  ret i1 %tmp
+}
+
+define i1 @test5(i8 %x, i8 %y) {
+  %X = xor i8 %x, 127
+  %Y = xor i8 %y, 127
+  %tmp = icmp ult i8 %X, %Y
+  ret i1 %tmp
+}
+
+define i1 @test6(i8 %x) {
+  %X = xor i8 %x, 127
+  %tmp = icmp uge i8 %X, 15
+  ret i1 %tmp
+}