Skip to content

Commit ae05dbb

Browse files
authored
[NFC][AMDGPU] Add a test that can cause backend crash (llvm#145777)
The crash was reported downstream, but it has been fixed in upstream by 2bada41. This PR is to add the test case upstream. Note that there are some UBs in the IRs, such as load/store from/to a nullptr. The crash would not be reproducible if any of them is changed to something else.
1 parent 117ed65 commit ae05dbb

File tree

1 file changed

+193
-0
lines changed

1 file changed

+193
-0
lines changed
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a %s -o - | FileCheck %s
3+
4+
declare ptr @G()
5+
6+
define amdgpu_kernel void @foo(ptr addrspace(5) %ptr5, ptr %p0, double %v0, <4 x i32> %vec) {
7+
; CHECK-LABEL: foo:
8+
; CHECK: ; %bb.0: ; %entry
9+
; CHECK-NEXT: s_add_u32 flat_scratch_lo, s12, s17
10+
; CHECK-NEXT: s_addc_u32 flat_scratch_hi, s13, 0
11+
; CHECK-NEXT: v_mov_b32_e32 v40, v0
12+
; CHECK-NEXT: v_pk_mov_b32 v[0:1], 0, 0
13+
; CHECK-NEXT: flat_load_dword v42, v[0:1]
14+
; CHECK-NEXT: s_mov_b64 s[38:39], s[6:7]
15+
; CHECK-NEXT: s_mov_b64 s[48:49], s[4:5]
16+
; CHECK-NEXT: s_load_dwordx4 s[4:7], s[8:9], 0x8
17+
; CHECK-NEXT: s_load_dword s64, s[8:9], 0x0
18+
; CHECK-NEXT: s_add_u32 s0, s0, s17
19+
; CHECK-NEXT: s_addc_u32 s1, s1, 0
20+
; CHECK-NEXT: s_mov_b64 s[34:35], s[8:9]
21+
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
22+
; CHECK-NEXT: v_mov_b32_e32 v46, s6
23+
; CHECK-NEXT: v_mov_b32_e32 v47, s7
24+
; CHECK-NEXT: s_mov_b64 s[6:7], src_private_base
25+
; CHECK-NEXT: s_cmp_lg_u32 s64, -1
26+
; CHECK-NEXT: s_cselect_b32 s7, s7, 0
27+
; CHECK-NEXT: s_cselect_b32 s8, s64, 0
28+
; CHECK-NEXT: s_add_u32 s50, s34, 48
29+
; CHECK-NEXT: s_addc_u32 s51, s35, 0
30+
; CHECK-NEXT: v_pk_mov_b32 v[58:59], s[4:5], s[4:5] op_sel:[0,1]
31+
; CHECK-NEXT: s_getpc_b64 s[4:5]
32+
; CHECK-NEXT: s_add_u32 s4, s4, G@gotpcrel32@lo+4
33+
; CHECK-NEXT: s_addc_u32 s5, s5, G@gotpcrel32@hi+12
34+
; CHECK-NEXT: s_load_dwordx2 s[54:55], s[4:5], 0x0
35+
; CHECK-NEXT: s_mov_b32 s6, 0
36+
; CHECK-NEXT: v_pk_mov_b32 v[0:1], 0, 0
37+
; CHECK-NEXT: v_mov_b32_e32 v57, s7
38+
; CHECK-NEXT: s_mov_b32 s7, s6
39+
; CHECK-NEXT: s_mov_b32 s53, s14
40+
; CHECK-NEXT: v_accvgpr_write_b32 a33, v1
41+
; CHECK-NEXT: v_mov_b32_e32 v56, s8
42+
; CHECK-NEXT: v_pk_mov_b32 v[60:61], s[6:7], s[6:7] op_sel:[0,1]
43+
; CHECK-NEXT: s_mov_b64 s[4:5], s[48:49]
44+
; CHECK-NEXT: s_mov_b64 s[6:7], s[38:39]
45+
; CHECK-NEXT: s_mov_b64 s[8:9], s[50:51]
46+
; CHECK-NEXT: s_mov_b32 s12, s14
47+
; CHECK-NEXT: s_mov_b32 s13, s15
48+
; CHECK-NEXT: s_mov_b32 s14, s16
49+
; CHECK-NEXT: v_mov_b32_e32 v31, v40
50+
; CHECK-NEXT: s_mov_b32 s32, 0
51+
; CHECK-NEXT: s_mov_b32 s33, s16
52+
; CHECK-NEXT: s_mov_b32 s52, s15
53+
; CHECK-NEXT: s_mov_b64 s[36:37], s[10:11]
54+
; CHECK-NEXT: v_accvgpr_write_b32 a32, v0
55+
; CHECK-NEXT: flat_store_dwordx2 v[58:59], v[60:61]
56+
; CHECK-NEXT: ; kill: def $sgpr15 killed $sgpr15
57+
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
58+
; CHECK-NEXT: s_swappc_b64 s[30:31], s[54:55]
59+
; CHECK-NEXT: flat_load_dwordx2 v[62:63], v[58:59]
60+
; CHECK-NEXT: v_accvgpr_read_b32 v0, a32
61+
; CHECK-NEXT: v_mov_b32_e32 v44, 0
62+
; CHECK-NEXT: v_mov_b32_e32 v45, 0x3ff00000
63+
; CHECK-NEXT: v_accvgpr_read_b32 v1, a33
64+
; CHECK-NEXT: s_mov_b64 s[4:5], s[48:49]
65+
; CHECK-NEXT: s_mov_b64 s[6:7], s[38:39]
66+
; CHECK-NEXT: s_mov_b64 s[8:9], s[50:51]
67+
; CHECK-NEXT: s_mov_b64 s[10:11], s[36:37]
68+
; CHECK-NEXT: s_mov_b32 s12, s53
69+
; CHECK-NEXT: s_mov_b32 s13, s52
70+
; CHECK-NEXT: s_mov_b32 s14, s33
71+
; CHECK-NEXT: v_mov_b32_e32 v31, v40
72+
; CHECK-NEXT: flat_store_dwordx2 v[0:1], v[44:45]
73+
; CHECK-NEXT: flat_store_dwordx2 v[58:59], v[60:61]
74+
; CHECK-NEXT: s_waitcnt vmcnt(0)
75+
; CHECK-NEXT: ; kill: def $sgpr15 killed $sgpr15
76+
; CHECK-NEXT: s_swappc_b64 s[30:31], s[54:55]
77+
; CHECK-NEXT: flat_load_dwordx2 v[0:1], v[56:57] glc
78+
; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
79+
; CHECK-NEXT: v_mov_b32_e32 v0, s64
80+
; CHECK-NEXT: v_cmp_lt_i32_e32 vcc, 0, v42
81+
; CHECK-NEXT: flat_store_dwordx2 v[58:59], v[62:63]
82+
; CHECK-NEXT: s_waitcnt vmcnt(0)
83+
; CHECK-NEXT: flat_store_dwordx2 v[58:59], v[46:47]
84+
; CHECK-NEXT: buffer_store_dword v47, v0, s[0:3], 0 offen offset:4
85+
; CHECK-NEXT: buffer_store_dword v44, v0, s[0:3], 0 offen
86+
; CHECK-NEXT: ; implicit-def: $vgpr4
87+
; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc
88+
; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]
89+
; CHECK-NEXT: s_cbranch_execz .LBB0_4
90+
; CHECK-NEXT: ; %bb.1: ; %LeafBlock5
91+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 1, v42
92+
; CHECK-NEXT: v_mov_b32_e32 v4, 0
93+
; CHECK-NEXT: s_and_saveexec_b64 s[6:7], vcc
94+
; CHECK-NEXT: ; %bb.2: ; %sw.bb17.i.i.i.i
95+
; CHECK-NEXT: v_mov_b32_e32 v4, 1
96+
; CHECK-NEXT: ; %bb.3: ; %Flow
97+
; CHECK-NEXT: s_or_b64 exec, exec, s[6:7]
98+
; CHECK-NEXT: .LBB0_4: ; %Flow8
99+
; CHECK-NEXT: s_or_saveexec_b64 s[4:5], s[4:5]
100+
; CHECK-NEXT: v_pk_mov_b32 v[0:1], v[42:43], v[42:43] op_sel:[0,1]
101+
; CHECK-NEXT: v_pk_mov_b32 v[2:3], v[44:45], v[44:45] op_sel:[0,1]
102+
; CHECK-NEXT: s_xor_b64 exec, exec, s[4:5]
103+
; CHECK-NEXT: s_cbranch_execz .LBB0_8
104+
; CHECK-NEXT: ; %bb.5: ; %LeafBlock
105+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v42
106+
; CHECK-NEXT: v_pk_mov_b32 v[0:1], v[42:43], v[42:43] op_sel:[0,1]
107+
; CHECK-NEXT: v_pk_mov_b32 v[2:3], v[44:45], v[44:45] op_sel:[0,1]
108+
; CHECK-NEXT: s_and_saveexec_b64 s[6:7], vcc
109+
; CHECK-NEXT: ; %bb.6: ; %sw.bb.i.i.i.i
110+
; CHECK-NEXT: v_mov_b32_e32 v0, 0
111+
; CHECK-NEXT: ; %bb.7: ; %Flow7
112+
; CHECK-NEXT: s_or_b64 exec, exec, s[6:7]
113+
; CHECK-NEXT: v_mov_b32_e32 v4, 0
114+
; CHECK-NEXT: .LBB0_8: ; %bb.1
115+
; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]
116+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v4
117+
; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc
118+
; CHECK-NEXT: s_cbranch_execz .LBB0_10
119+
; CHECK-NEXT: ; %bb.9: ; %sw.bb.i.i.i.i.i
120+
; CHECK-NEXT: s_load_dwordx4 s[8:11], s[34:35], 0x20
121+
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
122+
; CHECK-NEXT: v_pk_mov_b32 v[0:1], s[8:9], s[8:9] op_sel:[0,1]
123+
; CHECK-NEXT: v_pk_mov_b32 v[2:3], s[10:11], s[10:11] op_sel:[0,1]
124+
; CHECK-NEXT: .LBB0_10: ; %bb.2
125+
; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]
126+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0
127+
; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc
128+
; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]
129+
; CHECK-NEXT: buffer_store_dword v42, off, s[0:3], 0
130+
; CHECK-NEXT: s_endpgm
131+
entry:
132+
%load.null = load i32, ptr null, align 8
133+
%insert = insertelement <4 x i32> zeroinitializer, i32 %load.null, i64 0
134+
%cast = addrspacecast ptr addrspace(5) %ptr5 to ptr
135+
store double 0.000000e+00, ptr %p0, align 8
136+
%call = tail call ptr @G()
137+
store double 1.000000e+00, ptr null, align 8
138+
%load.0 = load double, ptr %p0, align 8
139+
store volatile double 0.000000e+00, ptr %p0, align 8
140+
%call.1 = tail call ptr @G()
141+
%load.1 = load volatile double, ptr %cast, align 8
142+
store volatile double %load.0, ptr %p0, align 8
143+
store double %v0, ptr %p0, align 8
144+
%load.2 = load double, ptr %p0, align 8
145+
store double %load.2, ptr addrspace(5) %ptr5, align 8
146+
store i32 0, ptr addrspace(5) %ptr5, align 4
147+
switch i32 %load.null, label %bb.1 [
148+
i32 0, label %sw.bb.i.i.i.i
149+
i32 1, label %sw.bb17.i.i.i.i
150+
]
151+
152+
sw.bb.i.i.i.i: ; preds = %entry
153+
br label %bb.1
154+
155+
sw.bb17.i.i.i.i: ; preds = %entry
156+
br label %bb.1
157+
158+
bb.1: ; preds = %sw.bb17.i.i.i.i, %sw.bb.i.i.i.i, %entry
159+
%phi.0 = phi i32 [ 0, %entry ], [ 0, %sw.bb.i.i.i.i ], [ 1, %sw.bb17.i.i.i.i ]
160+
%phi.1 = phi <4 x i32> [ %insert, %entry ], [ zeroinitializer, %sw.bb.i.i.i.i ], [ %insert, %sw.bb17.i.i.i.i ]
161+
switch i32 %phi.0, label %bb.2 [
162+
i32 0, label %sw.bb.i.i.i.i.i
163+
]
164+
165+
sw.bb.i.i.i.i.i: ; preds = %bb.1
166+
br label %bb.2
167+
168+
bb.2: ; preds = %sw.bb.i.i.i.i.i, %bb.1
169+
%phi.2 = phi <4 x i32> [ %phi.1, %bb.1 ], [ %vec, %sw.bb.i.i.i.i.i ]
170+
%extract.1 = extractelement <4 x i32> %phi.2, i64 0
171+
switch i32 1, label %bb.3 [
172+
i32 0, label %sw.bb.i.i5.i.i
173+
]
174+
175+
sw.bb.i.i5.i.i: ; preds = %bb.2
176+
br label %bb.3
177+
178+
bb.3: ; preds = %sw.bb.i.i5.i.i, %bb.2
179+
%phi.3 = phi <4 x i32> [ zeroinitializer, %sw.bb.i.i5.i.i ], [ %insert, %bb.2 ]
180+
switch i32 %extract.1, label %bb.4 [
181+
i32 0, label %sw.bb7.i.i.i3.i.i
182+
]
183+
184+
sw.bb7.i.i.i3.i.i: ; preds = %bb.3
185+
%insert.0 = insertelement <4 x i32> %insert, i32 0, i64 1
186+
br label %bb.4
187+
188+
bb.4: ; preds = %sw.bb7.i.i.i3.i.i, %bb.3
189+
%phi.4 = phi <4 x i32> [ %phi.3, %bb.3 ], [ %insert.0, %sw.bb7.i.i.i3.i.i ]
190+
%extract = extractelement <4 x i32> %phi.4, i64 0
191+
store i32 %extract, ptr addrspace(5) null, align 4
192+
ret void
193+
}

0 commit comments

Comments
 (0)