]> granicus.if.org Git - llvm/commitdiff
[InstCombine] allow (0 - x) & 1 --> x & 1 for vectors
authorSanjay Patel <spatel@rotateright.com>
Sat, 15 Jul 2017 15:29:47 +0000 (15:29 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sat, 15 Jul 2017 15:29:47 +0000 (15:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308098 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
test/Transforms/InstCombine/and2.ll

index f044a6f1987231633a3420256258938f67de7804..e8560099f9df0321361d0ef934e2e882f45d26e1 100644 (file)
@@ -1284,6 +1284,11 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
   if (Value *V = SimplifyBSwap(I, Builder))
     return replaceInstUsesWith(I, V);
 
+  // (0 - x) & 1 --> x & 1
+  Value *X;
+  if (match(Op1, m_One()) && match(Op0, m_Sub(m_Zero(), m_Value(X))))
+    return BinaryOperator::CreateAnd(X, Op1);
+
   if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(Op1)) {
     const APInt &AndRHSMask = AndRHS->getValue();
 
@@ -1315,12 +1320,6 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
 
         break;
       }
-      case Instruction::Sub:
-        // -x & 1 -> x & 1
-        if (AndRHSMask.isOneValue() && match(Op0LHS, m_Zero()))
-          return BinaryOperator::CreateAnd(Op0RHS, AndRHS);
-
-        break;
 
       case Instruction::Shl:
       case Instruction::LShr:
index 001ac58891e46a7487198fd98992675576be004c..9b3bbfe4920f52767263153ad5466e7f97738f4e 100644 (file)
@@ -98,8 +98,7 @@ define i64 @test9(i64 %x) {
 ; combine -x & 1 into x & 1
 define <2 x i64> @test9vec(<2 x i64> %x) {
 ; CHECK-LABEL: @test9vec(
-; CHECK-NEXT:    [[SUB:%.*]] = sub nsw <2 x i64> zeroinitializer, [[X:%.*]]
-; CHECK-NEXT:    [[AND:%.*]] = and <2 x i64> [[SUB]], <i64 1, i64 1>
+; CHECK-NEXT:    [[AND:%.*]] = and <2 x i64> %x, <i64 1, i64 1>
 ; CHECK-NEXT:    ret <2 x i64> [[AND]]
 ;
   %sub = sub nsw <2 x i64> <i64 0, i64 0>, %x