summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp15
-rw-r--r--llvm/test/Transforms/InstCombine/add.ll12
-rw-r--r--llvm/test/Transforms/InstCombine/add2.ll9
3 files changed, 17 insertions, 19 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index 22538b402b8..2962300a57d 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -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.
diff --git a/llvm/test/Transforms/InstCombine/add.ll b/llvm/test/Transforms/InstCombine/add.ll
index e1fcbe0b1af..3394bad0849 100644
--- a/llvm/test/Transforms/InstCombine/add.ll
+++ b/llvm/test/Transforms/InstCombine/add.ll
@@ -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
diff --git a/llvm/test/Transforms/InstCombine/add2.ll b/llvm/test/Transforms/InstCombine/add2.ll
index 2fe9e8cadeb..59f757f8628 100644
--- a/llvm/test/Transforms/InstCombine/add2.ll
+++ b/llvm/test/Transforms/InstCombine/add2.ll
@@ -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
OpenPOWER on IntegriCloud