Skip to content

Commit 99c2e3b

Browse files
authored
[NFC][AMDGPU] Pre-commit clang and llvm tests for dynamic allocas (#120063)
For #119822
1 parent 1ef5b98 commit 99c2e3b

File tree

2 files changed

+234
-8
lines changed

2 files changed

+234
-8
lines changed

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

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,68 @@
44
; ERR-NEXT: warning: Instruction selection used fallback path for kernel_dynamic_stackalloc_vgpr_align4
55
; ERR-NEXT: error: <unknown>:0:0: in function kernel_dynamic_stackalloc_vgpr_align4 void (ptr addrspace(1)): unsupported dynamic alloca
66

7-
; 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)
8-
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_align4
9-
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_align4 void (i32): unsupported dynamic alloca
10-
117
define amdgpu_kernel void @kernel_dynamic_stackalloc_vgpr_align4(ptr addrspace(1) %ptr) {
128
%id = call i32 @llvm.amdgcn.workitem.id.x()
139
%gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %id
1410
%n = load i32, ptr addrspace(1) %gep
1511
%alloca = alloca i32, i32 %n, align 4, addrspace(5)
16-
store volatile ptr addrspace(5) %alloca, ptr addrspace(1) undef
12+
store volatile i32 123, ptr addrspace(5) %alloca
13+
ret void
14+
}
15+
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 %n, ptr addrspace(5) %alloca
26+
ret void
27+
}
28+
29+
; 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)
30+
; ERR-NEXT: warning: Instruction selection used fallback path for kernel_dynamic_stackalloc_vgpr_align64
31+
; ERR-NEXT: error: <unknown>:0:0: in function kernel_dynamic_stackalloc_vgpr_align64 void (ptr addrspace(1)): unsupported dynamic alloca
32+
33+
define amdgpu_kernel void @kernel_dynamic_stackalloc_vgpr_align64(ptr addrspace(1) %ptr) {
34+
%id = call i32 @llvm.amdgcn.workitem.id.x()
35+
%gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %id
36+
%n = load i32, ptr addrspace(1) %gep
37+
%alloca = alloca i32, i32 %n, align 64, addrspace(5)
38+
store volatile i32 789, ptr addrspace(5) %alloca
1739
ret void
1840
}
1941

42+
; 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)
43+
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_align4
44+
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_align4 void (i32): unsupported dynamic alloca
45+
2046
define void @func_dynamic_stackalloc_vgpr_align4(i32 %n) {
2147
%alloca = alloca i32, i32 %n, align 4, addrspace(5)
22-
store volatile ptr addrspace(5) %alloca, ptr addrspace(1) undef
48+
store volatile i32 %n, ptr addrspace(5) %alloca
49+
ret void
50+
}
51+
52+
; 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)
53+
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_default_align
54+
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_default_align void (i32): unsupported dynamic alloca
55+
56+
define void @func_dynamic_stackalloc_vgpr_default_align(i32 %n) {
57+
%alloca = alloca i32, i32 %n, addrspace(5)
58+
store volatile i32 123, ptr addrspace(5) %alloca
59+
ret void
60+
}
61+
62+
; ERR: remark: <unknown>:0:0: cannot select: %{{[0-9]+}}:sreg_32(p5) = G_DYN_STACKALLOC %{{[0-9]+}}:vgpr(s32), 32 (in function: func_dynamic_stackalloc_vgpr_align32)
63+
; ERR-NEXT: warning: Instruction selection used fallback path for func_dynamic_stackalloc_vgpr_align32
64+
; ERR-NEXT: error: <unknown>:0:0: in function func_dynamic_stackalloc_vgpr_align32 void (i32): unsupported dynamic alloca
65+
66+
define void @func_dynamic_stackalloc_vgpr_align32(i32 %n) {
67+
%alloca = alloca i32, i32 %n, align 32, addrspace(5)
68+
store volatile i32 %n, ptr addrspace(5) %alloca
2369
ret void
2470
}
2571

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)