Skip to content

Commit 0446990

Browse files
authored
Reapply "[NFC][AMDGPU] Pre-commit clang and llvm tests for dynamic allocas" (#120410)
This reapplies commit #120063. A machine-verifier bug was causing a crash in the previous commit. This has been addressed in #120393.
1 parent 0c68606 commit 0446990

File tree

2 files changed

+226
-2
lines changed

2 files changed

+226
-2
lines changed

llvm/test/CodeGen/AMDGPU/GlobalISel/dynamic-alloca-divergent.ll

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,31 @@ define amdgpu_kernel void @kernel_dynamic_stackalloc_vgpr_align4(ptr addrspace(1
1313
ret void
1414
}
1515

16+
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 1 (in function: kernel_dynamic_stackalloc_vgpr_default_align)
17+
; ERR-NEXT: warning: Instruction selection used fallback path for kernel_dynamic_stackalloc_vgpr_default_align
18+
; ERR-NEXT: error: <unknown>:0:0: in function kernel_dynamic_stackalloc_vgpr_default_align void (ptr addrspace(1)): unsupported dynamic alloca
19+
20+
define amdgpu_kernel void @kernel_dynamic_stackalloc_vgpr_default_align(ptr addrspace(1) %ptr) {
21+
%id = call i32 @llvm.amdgcn.workitem.id.x()
22+
%gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %id
23+
%n = load i32, ptr addrspace(1) %gep
24+
%alloca = alloca i32, i32 %n, addrspace(5)
25+
store volatile i32 123, ptr addrspace(5) %alloca
26+
ret void
27+
}
28+
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 64 (in function: kernel_dynamic_stackalloc_vgpr_align64)
29+
; ERR-NEXT: warning: Instruction selection used fallback path for kernel_dynamic_stackalloc_vgpr_align64
30+
; ERR-NEXT: error: <unknown>:0:0: in function kernel_dynamic_stackalloc_vgpr_align64 void (ptr addrspace(1)): unsupported dynamic alloca
31+
32+
define amdgpu_kernel void @kernel_dynamic_stackalloc_vgpr_align64(ptr addrspace(1) %ptr) {
33+
%id = call i32 @llvm.amdgcn.workitem.id.x()
34+
%gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %id
35+
%n = load i32, ptr addrspace(1) %gep
36+
%alloca = alloca i32, i32 %n, align 64, addrspace(5)
37+
store volatile i32 123, ptr addrspace(5) %alloca
38+
ret void
39+
}
40+
1641
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 1 (in function: func_dynamic_stackalloc_vgpr_align4)
1742
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_align4
1843
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_align4 void (i32): unsupported dynamic alloca
@@ -23,6 +48,25 @@ define void @func_dynamic_stackalloc_vgpr_align4(i32 %n) {
2348
ret void
2449
}
2550

51+
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 1 (in function: func_dynamic_stackalloc_vgpr_default_align)
52+
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_default_align
53+
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_default_align void (i32): unsupported dynamic alloca
54+
55+
define void @func_dynamic_stackalloc_vgpr_default_align(i32 %n) {
56+
%alloca = alloca i32, i32 %n, addrspace(5)
57+
store volatile i32 456, ptr addrspace(5) %alloca
58+
ret void
59+
}
60+
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 64 (in function: func_dynamic_stackalloc_vgpr_align64)
61+
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_align64
62+
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_align64 void (i32): unsupported dynamic alloca
63+
64+
define void @func_dynamic_stackalloc_vgpr_align64(i32 %n) {
65+
%alloca = alloca i32, i32 %n, align 64, addrspace(5)
66+
store volatile i32 456, ptr addrspace(5) %alloca
67+
ret void
68+
}
69+
2670
declare i32 @llvm.amdgcn.workitem.id.x() #0
2771

2872
attributes #0 = { nounwind readnone speculatable }

llvm/test/CodeGen/AMDGPU/dynamic_stackalloc.ll

Lines changed: 182 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,188 @@ target datalayout = "A5"
55

66
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
77

8-
define amdgpu_kernel void @test_dynamic_stackalloc(ptr addrspace(1) %out, i32 %n) {
8+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_uniform(i32 %n) {
99
%alloca = alloca i32, i32 %n, addrspace(5)
10-
store volatile i32 0, ptr addrspace(5) %alloca
10+
store volatile i32 123, ptr addrspace(5) %alloca
11+
ret void
12+
}
13+
14+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
15+
16+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_uniform_over_aligned(i32 %n) {
17+
%alloca = alloca i32, i32 %n, align 128, addrspace(5)
18+
store volatile i32 10, ptr addrspace(5) %alloca
19+
ret void
20+
}
21+
22+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
23+
24+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_uniform_under_aligned(i32 %n) {
25+
%alloca = alloca i32, i32 %n, align 2, addrspace(5)
26+
store volatile i32 22, ptr addrspace(5) %alloca
27+
ret void
28+
}
29+
30+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
31+
32+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_divergent() {
33+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
34+
%alloca = alloca float, i32 %idx, addrspace(5)
35+
store volatile i32 123, ptr addrspace(5) %alloca
36+
ret void
37+
}
38+
39+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
40+
41+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_divergent_over_aligned() {
42+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
43+
%alloca = alloca i32, i32 %idx, align 128, addrspace(5)
44+
store volatile i32 444, ptr addrspace(5) %alloca
45+
ret void
46+
}
47+
48+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
49+
50+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_divergent_under_aligned() {
51+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
52+
%alloca = alloca i128, i32 %idx, align 2, addrspace(5)
53+
store volatile i32 666, ptr addrspace(5) %alloca
54+
ret void
55+
}
56+
57+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
58+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
59+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
60+
61+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_multiple_allocas(i32 %n, i32 %m) {
62+
entry:
63+
%cond = icmp eq i32 %n, 0
64+
%alloca1 = alloca i32, i32 8, addrspace(5)
65+
%alloca2 = alloca i17, i32 %n, addrspace(5)
66+
br i1 %cond, label %bb.0, label %bb.1
67+
bb.0:
68+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
69+
%alloca3 = alloca i32, i32 %m, align 64, addrspace(5)
70+
%alloca4 = alloca i32, i32 %idx, align 4, addrspace(5)
71+
store volatile i32 3, ptr addrspace(5) %alloca3
72+
store volatile i32 4, ptr addrspace(5) %alloca4
73+
br label %bb.1
74+
bb.1:
75+
store volatile i32 1, ptr addrspace(5) %alloca1
76+
store volatile i32 2, ptr addrspace(5) %alloca2
77+
ret void
78+
}
79+
80+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
81+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
82+
83+
define amdgpu_kernel void @test_dynamic_stackalloc_kernel_control_flow(i32 %n, i32 %m) {
84+
entry:
85+
%cond = icmp eq i32 %n, 0
86+
br i1 %cond, label %bb.0, label %bb.1
87+
bb.0:
88+
%alloca2 = alloca i32, i32 %m, align 64, addrspace(5)
89+
store volatile i32 2, ptr addrspace(5) %alloca2
90+
br label %bb.2
91+
bb.1:
92+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
93+
%alloca1 = alloca i32, i32 %idx, align 4, addrspace(5)
94+
store volatile i32 1, ptr addrspace(5) %alloca1
95+
br label %bb.2
96+
bb.2:
97+
ret void
98+
}
99+
100+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
101+
102+
define void @test_dynamic_stackalloc_device_uniform(i32 %n) {
103+
%alloca = alloca i32, i32 %n, addrspace(5)
104+
store volatile i32 123, ptr addrspace(5) %alloca
105+
ret void
106+
}
107+
108+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
109+
110+
define void @test_dynamic_stackalloc_device_uniform_over_aligned(i32 %n) {
111+
%alloca = alloca i32, i32 %n, align 128, addrspace(5)
112+
store volatile i32 10, ptr addrspace(5) %alloca
113+
ret void
114+
}
115+
116+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
117+
118+
define void @test_dynamic_stackalloc_device_uniform_under_aligned(i32 %n) {
119+
%alloca = alloca i32, i32 %n, align 2, addrspace(5)
120+
store volatile i32 22, ptr addrspace(5) %alloca
121+
ret void
122+
}
123+
124+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
125+
126+
define void @test_dynamic_stackalloc_device_divergent() {
127+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
128+
%alloca = alloca i32, i32 %idx, addrspace(5)
129+
store volatile i32 123, ptr addrspace(5) %alloca
130+
ret void
131+
}
132+
133+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
134+
135+
define void @test_dynamic_stackalloc_device_divergent_over_aligned() {
136+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
137+
%alloca = alloca i32, i32 %idx, align 128, addrspace(5)
138+
store volatile i32 444, ptr addrspace(5) %alloca
139+
ret void
140+
}
141+
142+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
143+
144+
define void @test_dynamic_stackalloc_device_divergent_under_aligned() {
145+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
146+
%alloca = alloca i32, i32 %idx, align 2, addrspace(5)
147+
store volatile i32 666, ptr addrspace(5) %alloca
148+
ret void
149+
}
150+
151+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
152+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
153+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
154+
155+
define void @test_dynamic_stackalloc_device_multiple_allocas(i32 %n, i32 %m) {
156+
entry:
157+
%cond = icmp eq i32 %n, 0
158+
%alloca1 = alloca i32, i32 8, addrspace(5)
159+
%alloca2 = alloca i32, i32 %n, addrspace(5)
160+
br i1 %cond, label %bb.0, label %bb.1
161+
bb.0:
162+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
163+
%alloca3 = alloca i32, i32 %m, align 64, addrspace(5)
164+
%alloca4 = alloca i32, i32 %idx, align 4, addrspace(5)
165+
store volatile i32 3, ptr addrspace(5) %alloca3
166+
store volatile i32 4, ptr addrspace(5) %alloca4
167+
br label %bb.1
168+
bb.1:
169+
store volatile i32 1, ptr addrspace(5) %alloca1
170+
store volatile i32 2, ptr addrspace(5) %alloca2
171+
ret void
172+
}
173+
174+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
175+
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
176+
177+
define void @test_dynamic_stackalloc_device_control_flow(i32 %n, i32 %m) {
178+
entry:
179+
%cond = icmp eq i32 %n, 0
180+
br i1 %cond, label %bb.0, label %bb.1
181+
bb.0:
182+
%idx = call i32 @llvm.amdgcn.workitem.id.x()
183+
%alloca1 = alloca i32, i32 %idx, align 4, addrspace(5)
184+
store volatile i32 1, ptr addrspace(5) %alloca1
185+
br label %bb.2
186+
bb.1:
187+
%alloca2 = alloca i32, i32 %m, align 64, addrspace(5)
188+
store volatile i32 2, ptr addrspace(5) %alloca2
189+
br label %bb.2
190+
bb.2:
11191
ret void
12192
}

0 commit comments

Comments
 (0)