Skip to content

Commit 31d219d

Browse files
committed
[InstCombine] Fold ((X - Y) - Z) to X - (Y + Z) (PR49858)
https://alive2.llvm.org/ce/z/67w-wQ We prefer `add`s over `sub`, and this particular xform allows further folds to happen: Fixes https://bugs.llvm.org/show_bug.cgi?id=49858
1 parent 5ab489d commit 31d219d

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,6 +1801,12 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
18011801
return BinaryOperator::CreateSub(XZ, YW);
18021802
}
18031803

1804+
// ((X - Y) - Op1) --> X - (Y + Op1)
1805+
if (match(Op0, m_OneUse(m_Sub(m_Value(X), m_Value(Y))))) {
1806+
Value *Add = Builder.CreateAdd(Y, Op1);
1807+
return BinaryOperator::CreateSub(X, Add);
1808+
}
1809+
18041810
auto m_AddRdx = [](Value *&Vec) {
18051811
return m_OneUse(m_Intrinsic<Intrinsic::vector_reduce_add>(m_Value(Vec)));
18061812
};

llvm/test/Transforms/InstCombine/abs-1.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,9 @@ define i32 @nabs_canonical_8(i32 %a) {
305305
define i32 @nabs_canonical_9(i32 %a, i32 %b) {
306306
; CHECK-LABEL: @nabs_canonical_9(
307307
; CHECK-NEXT: [[T1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
308-
; CHECK-NEXT: [[T2:%.*]] = sub i32 [[B]], [[A]]
309308
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[T1]], i1 false)
310-
; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[T2]], [[TMP1]]
309+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], [[A]]
310+
; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[B]], [[TMP2]]
311311
; CHECK-NEXT: ret i32 [[ADD]]
312312
;
313313
%t1 = sub i32 %a, %b

llvm/test/Transforms/InstCombine/sub-from-sub.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ declare void @use8(i8)
88
; Basic test
99
define i8 @t0(i8 %x, i8 %y, i8 %z) {
1010
; CHECK-LABEL: @t0(
11-
; CHECK-NEXT: [[I0:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
12-
; CHECK-NEXT: [[R:%.*]] = sub i8 [[I0]], [[Z:%.*]]
11+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
12+
; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
1313
; CHECK-NEXT: ret i8 [[R]]
1414
;
1515
%i0 = sub i8 %x, %y
@@ -20,8 +20,8 @@ define i8 @t0(i8 %x, i8 %y, i8 %z) {
2020
; No flags are propagated
2121
define i8 @t1_flags(i8 %x, i8 %y, i8 %z) {
2222
; CHECK-LABEL: @t1_flags(
23-
; CHECK-NEXT: [[O0:%.*]] = sub nuw nsw i8 [[X:%.*]], [[Y:%.*]]
24-
; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i8 [[O0]], [[Z:%.*]]
23+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
24+
; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
2525
; CHECK-NEXT: ret i8 [[R]]
2626
;
2727
%o0 = sub nuw nsw i8 %x, %y
@@ -47,8 +47,8 @@ define i8 @n2(i8 %x, i8 %y, i8 %z) {
4747

4848
define i8 @t3_c0(i8 %y, i8 %z) {
4949
; CHECK-LABEL: @t3_c0(
50-
; CHECK-NEXT: [[I0:%.*]] = sub i8 42, [[Y:%.*]]
51-
; CHECK-NEXT: [[R:%.*]] = sub i8 [[I0]], [[Z:%.*]]
50+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
51+
; CHECK-NEXT: [[R:%.*]] = sub i8 42, [[TMP1]]
5252
; CHECK-NEXT: ret i8 [[R]]
5353
;
5454
%i0 = sub i8 42, %y

0 commit comments

Comments
 (0)