]> granicus.if.org Git - llvm/commitdiff
[InstCombine] move code to remove repeated constant check; NFCI
authorSanjay Patel <spatel@rotateright.com>
Fri, 13 Oct 2017 20:29:11 +0000 (20:29 +0000)
committerSanjay Patel <spatel@rotateright.com>
Fri, 13 Oct 2017 20:29:11 +0000 (20:29 +0000)
Also, consolidate tests for this fold in one place.

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

lib/Transforms/InstCombine/InstCombineAddSub.cpp
test/Transforms/InstCombine/add.ll
test/Transforms/InstCombine/add2.ll

index 22538b402b82c9293e863ae35f0e8fb15b7aabdb..2962300a57ddf979e95100a9a71ae8d4ef1bd601 100644 (file)
@@ -960,10 +960,15 @@ Instruction *InstCombiner::foldAddWithConstant(BinaryOperator &Add) {
     return NV;
 
   Value *X;
-  if (match(Op0, m_ZExt(m_Value(X))) && X->getType()->getScalarSizeInBits() == 1)
-    // zext(bool) + C -> bool ? C + 1 : C
+  // zext(bool) + C -> bool ? C + 1 : C
+  if (match(Op0, m_ZExt(m_Value(X))) &&
+      X->getType()->getScalarSizeInBits() == 1)
     return SelectInst::Create(X, AddOne(Op1C), Op1);
 
+  // ~X + C --> (C-1) - X
+  if (match(Op0, m_Not(m_Value(X))))
+    return BinaryOperator::CreateSub(SubOne(Op1C), X);
+
   const APInt *C;
   if (!match(Op1, m_APInt(C)))
     return nullptr;
@@ -1117,12 +1122,6 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
   if (haveNoCommonBitsSet(LHS, RHS, DL, &AC, &I, &DT))
     return BinaryOperator::CreateOr(LHS, RHS);
 
-  if (Constant *CRHS = dyn_cast<Constant>(RHS)) {
-    Value *X;
-    if (match(LHS, m_Not(m_Value(X)))) // ~X + C --> (C-1) - X
-      return BinaryOperator::CreateSub(SubOne(CRHS), X);
-  }
-
   // FIXME: We already did a check for ConstantInt RHS above this.
   // FIXME: Is this pattern covered by another fold? No regression tests fail on
   // removal.
index e1fcbe0b1af1c97cd5011967da1909a2200fb1f7..3394bad084992abad27b88be3140a4bfab83bce2 100644 (file)
@@ -266,7 +266,6 @@ define i32 @test17(i32 %A) {
 ; CHECK-NEXT:    ret i32 [[C]]
 ;
   %B = xor i32 %A, -1
-  ; == sub int 0, %A
   %C = add i32 %B, 1
   ret i32 %C
 }
@@ -277,11 +276,20 @@ define i8 @test18(i8 %A) {
 ; CHECK-NEXT:    ret i8 [[C]]
 ;
   %B = xor i8 %A, -1
-  ; == sub ubyte 16, %A
   %C = add i8 %B, 17
   ret i8 %C
 }
 
+define <2 x i64> @test18vec(<2 x i64> %A) {
+; CHECK-LABEL: @test18vec(
+; CHECK-NEXT:    [[ADD:%.*]] = sub <2 x i64> <i64 1, i64 2>, %A
+; CHECK-NEXT:    ret <2 x i64> [[ADD]]
+;
+  %xor = xor <2 x i64> %A, <i64 -1, i64 -1>
+  %add = add <2 x i64> %xor, <i64 2, i64 3>
+  ret <2 x i64> %add
+}
+
 define i32 @test19(i1 %C) {
 ; CHECK-LABEL: @test19(
 ; CHECK-NEXT:    [[V:%.*]] = select i1 %C, i32 1123, i32 133
index 2fe9e8cadeb71b616619dd83ea68f159ba951933..59f757f862830e82e7bb8e8d141ee266574b95a1 100644 (file)
@@ -68,15 +68,6 @@ define <2 x i64> @test7(<2 x i64> %A) {
 ; CHECK-NEXT: ret <2 x i64> %add
 }
 
-define <2 x i64> @test8(<2 x i64> %A) {
-  %xor = xor <2 x i64> %A, <i64 -1, i64 -1>
-  %add = add <2 x i64> %xor, <i64 2, i64 3>
-  ret <2 x i64> %add
-; CHECK-LABEL: @test8(
-; CHECK-NEXT: %add = sub <2 x i64> <i64 1, i64 2>, %A
-; CHECK-NEXT: ret <2 x i64> %add
-}
-
 define i16 @test9(i16 %a) {
        %b = mul i16 %a, 2
        %c = mul i16 %a, 32767