Skip to content

Commit ba11588

Browse files
authored
[DAGCombiner][AArch64] Make combineCarryDiamond avoid creating UADDO_CARRY with carry in larger than setcc result type. (#89121)
In the attach test case we were creating a UADDO_CARRY with i1 carry out and i41 carry in. i41 exceeds is larger than the setcc result type for AArch64 which is i32. i41 needs to be promoted to i64 since it is larger than i32. The type legalizer tried to use promoteTargetBoolean, but that can only promote from a type smaller than setcc result type. The easiest fix here is to force the carryin type to match the carryout type at the type of creation. This should ensure the node won't exceeed setcc result type as long as the output type doesn't. I think we should explore requiring the types to match for this node. Fixes #88966
1 parent d8a26ca commit ba11588

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3520,6 +3520,8 @@ static SDValue combineCarryDiamond(SelectionDAG &DAG, const TargetLowering &TLI,
35203520
return SDValue();
35213521

35223522
SDLoc DL(N);
3523+
CarryIn = DAG.getBoolExtOrTrunc(CarryIn, DL, Carry1->getValueType(1),
3524+
Carry1->getValueType(0));
35233525
SDValue Merged =
35243526
DAG.getNode(NewOp, DL, Carry1->getVTList(), Carry0.getOperand(0),
35253527
Carry0.getOperand(1), CarryIn);

llvm/test/CodeGen/AArch64/pr88966.ll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc < %s -mtriple=aarch64 | FileCheck %s
3+
4+
define i32 @f(ptr %arg, i41 %arg1, ptr %arg2) {
5+
; CHECK-LABEL: f:
6+
; CHECK: // %bb.0: // %bb
7+
; CHECK-NEXT: and w9, w1, #0x1
8+
; CHECK-NEXT: mov w10, #1 // =0x1
9+
; CHECK-NEXT: mov x8, x0
10+
; CHECK-NEXT: cmp w9, #1
11+
; CHECK-NEXT: mov w0, wzr
12+
; CHECK-NEXT: adc x9, xzr, x10
13+
; CHECK-NEXT: str x9, [x2]
14+
; CHECK-NEXT: str xzr, [x8]
15+
; CHECK-NEXT: ret
16+
bb:
17+
%new0 = and i41 %arg1, 1
18+
%last = trunc i41 %new0 to i1
19+
%i = add i64 0, 1
20+
%i3 = zext i1 %last to i64
21+
%i4 = add i64 %i, %i3
22+
%i5 = icmp ult i64 %i, 0
23+
%i6 = icmp ult i64 %i4, %i
24+
%i7 = and i1 %i5, %i6
25+
%i8 = zext i1 %i7 to i64
26+
store i64 %i4, ptr %arg2, align 8
27+
store i64 %i8, ptr %arg, align 8
28+
ret i32 0
29+
}

0 commit comments

Comments
 (0)