Skip to content

Commit babbdad

Browse files
authored
[AMDGPU] Handle non-register operands for S_SUB/ADD_U64_PSEUDO (#86104)
This pseudo uses SSrc_b64 so it allows both an immediate or a register, but the lowering crashed on immediate operands.
1 parent 373e77b commit babbdad

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4859,8 +4859,8 @@ MachineBasicBlock *SITargetLowering::EmitInstrWithCustomInserter(
48594859
if (Subtarget->hasScalarAddSub64()) {
48604860
unsigned Opc = IsAdd ? AMDGPU::S_ADD_U64 : AMDGPU::S_SUB_U64;
48614861
BuildMI(*BB, MI, DL, TII->get(Opc), Dest.getReg())
4862-
.addReg(Src0.getReg())
4863-
.addReg(Src1.getReg());
4862+
.add(Src0)
4863+
.add(Src1);
48644864
} else {
48654865
const SIRegisterInfo *TRI = ST.getRegisterInfo();
48664866
const TargetRegisterClass *BoolRC = TRI->getBoolRC();
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=finalize-isel -o - %s | FileCheck -check-prefix=GFX11 %s
3+
# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass=finalize-isel -o - %s | FileCheck -check-prefix=GFX12 %s
4+
5+
---
6+
name: reg_ops
7+
tracksRegLiveness: true
8+
body: |
9+
bb.0:
10+
; GFX11-LABEL: name: reg_ops
11+
; GFX11: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
12+
; GFX11-NEXT: [[DEF1:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
13+
; GFX11-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub0
14+
; GFX11-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub1
15+
; GFX11-NEXT: [[COPY2:%[0-9]+]]:sreg_32 = COPY [[DEF1]].sub0
16+
; GFX11-NEXT: [[COPY3:%[0-9]+]]:sreg_32 = COPY [[DEF1]].sub1
17+
; GFX11-NEXT: [[S_ADD_U32_:%[0-9]+]]:sreg_32 = S_ADD_U32 [[COPY]], [[COPY2]], implicit-def $scc
18+
; GFX11-NEXT: [[S_ADDC_U32_:%[0-9]+]]:sreg_32 = S_ADDC_U32 [[COPY1]], [[COPY3]], implicit-def $scc, implicit $scc
19+
; GFX11-NEXT: [[REG_SEQUENCE:%[0-9]+]]:sreg_64 = REG_SEQUENCE [[S_ADD_U32_]], %subreg.sub0, [[S_ADDC_U32_]], %subreg.sub1
20+
;
21+
; GFX12-LABEL: name: reg_ops
22+
; GFX12: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
23+
; GFX12-NEXT: [[DEF1:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
24+
; GFX12-NEXT: [[S_ADD_U64_:%[0-9]+]]:sreg_64 = S_ADD_U64 [[DEF]], [[DEF1]]
25+
%0:sreg_64 = IMPLICIT_DEF
26+
%1:sreg_64 = IMPLICIT_DEF
27+
%2:sreg_64 = S_ADD_U64_PSEUDO %0, %1, implicit-def $scc
28+
...
29+
30+
---
31+
name: lhs_imm
32+
tracksRegLiveness: true
33+
body: |
34+
bb.0:
35+
; GFX11-LABEL: name: lhs_imm
36+
; GFX11: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
37+
; GFX11-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub0
38+
; GFX11-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub1
39+
; GFX11-NEXT: [[S_ADD_U32_:%[0-9]+]]:sreg_32 = S_ADD_U32 6565, [[COPY]], implicit-def $scc
40+
; GFX11-NEXT: [[S_ADDC_U32_:%[0-9]+]]:sreg_32 = S_ADDC_U32 0, [[COPY1]], implicit-def $scc, implicit $scc
41+
; GFX11-NEXT: [[REG_SEQUENCE:%[0-9]+]]:sreg_64 = REG_SEQUENCE [[S_ADD_U32_]], %subreg.sub0, [[S_ADDC_U32_]], %subreg.sub1
42+
;
43+
; GFX12-LABEL: name: lhs_imm
44+
; GFX12: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
45+
; GFX12-NEXT: [[S_ADD_U64_:%[0-9]+]]:sreg_64 = S_ADD_U64 6565, [[DEF]]
46+
%0:sreg_64 = IMPLICIT_DEF
47+
%1:sreg_64 = S_ADD_U64_PSEUDO 6565, %0, implicit-def $scc
48+
...
49+
50+
---
51+
name: rhs_imm
52+
tracksRegLiveness: true
53+
body: |
54+
bb.0:
55+
; GFX11-LABEL: name: rhs_imm
56+
; GFX11: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
57+
; GFX11-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub0
58+
; GFX11-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY [[DEF]].sub1
59+
; GFX11-NEXT: [[S_ADD_U32_:%[0-9]+]]:sreg_32 = S_ADD_U32 [[COPY]], 6565, implicit-def $scc
60+
; GFX11-NEXT: [[S_ADDC_U32_:%[0-9]+]]:sreg_32 = S_ADDC_U32 [[COPY1]], 0, implicit-def $scc, implicit $scc
61+
; GFX11-NEXT: [[REG_SEQUENCE:%[0-9]+]]:sreg_64 = REG_SEQUENCE [[S_ADD_U32_]], %subreg.sub0, [[S_ADDC_U32_]], %subreg.sub1
62+
;
63+
; GFX12-LABEL: name: rhs_imm
64+
; GFX12: [[DEF:%[0-9]+]]:sreg_64 = IMPLICIT_DEF
65+
; GFX12-NEXT: [[S_ADD_U64_:%[0-9]+]]:sreg_64 = S_ADD_U64 [[DEF]], 6565
66+
%0:sreg_64 = IMPLICIT_DEF
67+
%1:sreg_64 = S_ADD_U64_PSEUDO %0, 6565, implicit-def $scc
68+
...

0 commit comments

Comments
 (0)