Skip to content

Commit 0298cce

Browse files
committed
[AArch64] Add foldADCToCINC DAG combine.
Differential revision: https://reviews.llvm.org/D123781
1 parent d29fc6e commit 0298cce

File tree

5 files changed

+29
-12
lines changed

5 files changed

+29
-12
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15512,6 +15512,23 @@ static SDValue foldOverflowCheck(SDNode *Op, SelectionDAG &DAG, bool IsAdd) {
1551215512
CsetOp.getOperand(3));
1551315513
}
1551415514

15515+
// (ADC x 0 cond) => (CINC x HS cond)
15516+
static SDValue foldADCToCINC(SDNode *N, SelectionDAG &DAG) {
15517+
SDValue LHS = N->getOperand(0);
15518+
SDValue RHS = N->getOperand(1);
15519+
SDValue Cond = N->getOperand(2);
15520+
15521+
if (!isNullConstant(RHS))
15522+
return SDValue();
15523+
15524+
EVT VT = N->getValueType(0);
15525+
SDLoc DL(N);
15526+
15527+
// (CINC x cc cond) <=> (CSINC x x !cc cond)
15528+
SDValue CC = DAG.getConstant(AArch64CC::LO, DL, MVT::i32);
15529+
return DAG.getNode(AArch64ISD::CSINC, DL, VT, LHS, LHS, CC, Cond);
15530+
}
15531+
1551515532
static SDValue performAddSubCombine(SDNode *N,
1551615533
TargetLowering::DAGCombinerInfo &DCI,
1551715534
SelectionDAG &DAG) {
@@ -18721,7 +18738,9 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
1872118738
case AArch64ISD::ANDS:
1872218739
return performFlagSettingCombine(N, DCI, ISD::AND);
1872318740
case AArch64ISD::ADC:
18724-
return foldOverflowCheck(N, DAG, /* IsAdd */ true);
18741+
if (auto R = foldOverflowCheck(N, DAG, /* IsAdd */ true))
18742+
return R;
18743+
return foldADCToCINC(N, DAG);
1872518744
case AArch64ISD::SBC:
1872618745
return foldOverflowCheck(N, DAG, /* IsAdd */ false);
1872718746
case AArch64ISD::ADCS:

llvm/test/CodeGen/AArch64/adc.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ define i128 @test_imm(i128 %a) {
3030
; CHECK-LE-LABEL: test_imm:
3131
; CHECK-LE: ; %bb.0:
3232
; CHECK-LE-NEXT: adds x0, x0, #12
33-
; CHECK-LE-NEXT: adc x1, x1, xzr
33+
; CHECK-LE-NEXT: cinc x1, x1, hs
3434
; CHECK-LE-NEXT: ret
3535
;
3636
; CHECK-BE-LABEL: test_imm:
3737
; CHECK-BE: // %bb.0:
3838
; CHECK-BE-NEXT: adds x1, x1, #12
39-
; CHECK-BE-NEXT: adc x0, x0, xzr
39+
; CHECK-BE-NEXT: cinc x0, x0, hs
4040
; CHECK-BE-NEXT: ret
4141

4242
%val = add i128 %a, 12

llvm/test/CodeGen/AArch64/addcarry-crash.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ define i64 @foo(i64* nocapture readonly %ptr, i64 %a, i64 %b, i64 %c) local_unna
99
; CHECK-NEXT: lsr x9, x1, #32
1010
; CHECK-NEXT: cmn x3, x2
1111
; CHECK-NEXT: mul x8, x8, x9
12-
; CHECK-NEXT: adc x0, x8, xzr
12+
; CHECK-NEXT: cinc x0, x8, hs
1313
; CHECK-NEXT: ret
1414
entry:
1515
%0 = lshr i64 %a, 32

llvm/test/CodeGen/AArch64/atomicrmw-O0.ll

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,7 @@ define i128 @test_rmw_add_128(i128* %dst) {
219219
; NOLSE-NEXT: ldr x8, [sp, #32] // 8-byte Folded Reload
220220
; NOLSE-NEXT: ldr x13, [sp, #24] // 8-byte Folded Reload
221221
; NOLSE-NEXT: adds x14, x8, #1
222-
; NOLSE-NEXT: mov x9, xzr
223-
; NOLSE-NEXT: adc x15, x11, x9
222+
; NOLSE-NEXT: cinc x15, x11, hs
224223
; NOLSE-NEXT: .LBB4_2: // %atomicrmw.start
225224
; NOLSE-NEXT: // Parent Loop BB4_1 Depth=1
226225
; NOLSE-NEXT: // => This Inner Loop Header: Depth=2
@@ -271,14 +270,13 @@ define i128 @test_rmw_add_128(i128* %dst) {
271270
; LSE-NEXT: ldr x10, [sp, #72] // 8-byte Folded Reload
272271
; LSE-NEXT: ldr x8, [sp, #64] // 8-byte Folded Reload
273272
; LSE-NEXT: ldr x9, [sp, #56] // 8-byte Folded Reload
274-
; LSE-NEXT: adds x2, x8, #1
275-
; LSE-NEXT: mov x11, xzr
276-
; LSE-NEXT: adc x11, x10, x11
277-
; LSE-NEXT: // kill: def $x2 killed $x2 def $x2_x3
278-
; LSE-NEXT: mov x3, x11
279273
; LSE-NEXT: mov x0, x8
280274
; LSE-NEXT: mov x1, x10
281275
; LSE-NEXT: stp x0, x1, [sp, #8] // 16-byte Folded Spill
276+
; LSE-NEXT: adds x2, x8, #1
277+
; LSE-NEXT: cinc x11, x10, hs
278+
; LSE-NEXT: // kill: def $x2 killed $x2 def $x2_x3
279+
; LSE-NEXT: mov x3, x11
282280
; LSE-NEXT: caspal x0, x1, x2, x3, [x9]
283281
; LSE-NEXT: stp x0, x1, [sp, #24] // 16-byte Folded Spill
284282
; LSE-NEXT: mov x9, x1

llvm/test/CodeGen/AArch64/icmp-shift-opt.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ define i128 @opt_setcc_lt_power_of_2(i128 %a) nounwind {
1111
; CHECK-NEXT: .LBB0_1: // %loop
1212
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
1313
; CHECK-NEXT: adds x0, x0, #1
14-
; CHECK-NEXT: adc x1, x1, xzr
14+
; CHECK-NEXT: cinc x1, x1, hs
1515
; CHECK-NEXT: orr x8, x1, x0, lsr #60
1616
; CHECK-NEXT: cbnz x8, .LBB0_1
1717
; CHECK-NEXT: // %bb.2: // %exit

0 commit comments

Comments
 (0)