Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / tail-duplication-convergent.ll
blob17ec27bc49db4320ebc0d3031cc306aaefe62c1c
1 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -O2 -tail-dup-size=1000 -tail-dup-placement-threshold=1000 -enable-tail-merge=0 < %s | FileCheck -enable-var-scope -check-prefix=GCN %s
3 ; Need to to trigger tail duplication this during
4 ; MachineBlockPlacement, since calls aren't tail duplicated pre-RA.
6 declare void @nonconvergent_func() #0
7 declare void @convergent_func() #1
8 declare void @llvm.amdgcn.s.barrier() #1
9 declare void @llvm.amdgcn.ds.gws.init(i32, i32) #2
10 declare void @llvm.amdgcn.ds.gws.barrier(i32, i32) #2
11 declare void @llvm.amdgcn.ds.gws.sema.release.all(i32 %offset) #2
13 ; barrier shouldn't be duplicated.
15 ; GCN-LABEL: {{^}}taildup_barrier:
16 ; GCN: s_barrier
17 ; GCN-NOT: s_barrier
18 define void @taildup_barrier(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #0 {
19 entry:
20   br i1 %cond, label %bb1, label %bb2
22 bb1:
23   store i32 0, ptr addrspace(1) %a
24   br label %call
26 bb2:
27   store i32 1, ptr addrspace(1) %a
28   br label %call
30 call:
31   call void @llvm.amdgcn.s.barrier()
32   br label %ret
34 ret:
35   ret void
38 ; GCN-LABEL: {{^}}taildup_convergent_call:
39 ; GCN: s_swappc_b64
40 ; GCN-NOT: s_swappc_b64
41 define void @taildup_convergent_call(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {
42 entry:
43   br i1 %cond, label %bb1, label %bb2
45 bb1:
46   store i32 0, ptr addrspace(1) %a
47   br label %call
49 bb2:
50   store i32 1, ptr addrspace(1) %a
51   br label %call
53 call:
54   call void @convergent_func()
55   br label %ret
57 ret:
58   ret void
61 ; TODO: Currently there is only one convergent call pseudo, but this
62 ; theoretically could use a nonconvergent variant.
63 ; GCN-LABEL: {{^}}taildup_nonconvergent_call:
64 ; GCN: s_swappc_b64
65 ; GCN-NOT: s_swappc_b64
66 define void @taildup_nonconvergent_call(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {
67 entry:
68   br i1 %cond, label %bb1, label %bb2
70 bb1:
71   store i32 0, ptr addrspace(1) %a
72   br label %call
74 bb2:
75   store i32 1, ptr addrspace(1) %a
76   br label %call
78 call:
79   call void @nonconvergent_func()
80   br label %ret
82 ret:
83   ret void
86 ; GCN-LABEL: {{^}}taildup_convergent_tailcall:
87 ; GCN: s_setpc_b64
88 ; GCN-NOT: s_setpc_b64
89 define void @taildup_convergent_tailcall(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {
90 entry:
91   br i1 %cond, label %bb1, label %bb2
93 bb1:
94   store i32 0, ptr addrspace(1) %a
95   br label %call
97 bb2:
98   store i32 1, ptr addrspace(1) %a
99   br label %call
101 call:
102   tail call void @convergent_func()
103   ret void
106 ; GCN-LABEL: {{^}}taildup_gws_init:
107 ; GCN: ds_gws_init
108 ; GCN-NOT: ds_gws_init
109 define amdgpu_kernel void @taildup_gws_init(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %val, i32 %offset) #0 {
110 entry:
111   br i1 %cond, label %bb1, label %bb2
113 bb1:
114   store i32 0, ptr addrspace(1) %a
115   br label %call
117 bb2:
118   store i32 1, ptr addrspace(1) %a
119   br label %call
121 call:
122   call void @llvm.amdgcn.ds.gws.init(i32 %val, i32 %offset)
123   br label %ret
125 ret:
126   ret void
129 ; GCN-LABEL: {{^}}taildup_gws_barrier:
130 ; GCN: ds_gws_barrier
131 ; GCN-NOT: ds_gws_barrier
132 define amdgpu_kernel void @taildup_gws_barrier(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %val, i32 %offset) #0 {
133 entry:
134   br i1 %cond, label %bb1, label %bb2
136 bb1:
137   store i32 0, ptr addrspace(1) %a
138   br label %call
140 bb2:
141   store i32 1, ptr addrspace(1) %a
142   br label %call
144 call:
145   call void @llvm.amdgcn.ds.gws.barrier(i32 %val, i32 %offset)
146   br label %ret
148 ret:
149   ret void
152 ; GCN-LABEL: {{^}}taildup_gws_sema_release_all:
153 ; GCN: ds_gws_sema_release_all
154 ; GCN-NOT: ds_gws
155 define amdgpu_kernel void @taildup_gws_sema_release_all(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %offset) #0 {
156 entry:
157   br i1 %cond, label %bb1, label %bb2
159 bb1:
160   store i32 0, ptr addrspace(1) %a
161   br label %call
163 bb2:
164   store i32 1, ptr addrspace(1) %a
165   br label %call
167 call:
168   call void @llvm.amdgcn.ds.gws.sema.release.all(i32 %offset)
169   br label %ret
171 ret:
172   ret void
175 attributes #0 = { nounwind }
176 attributes #1 = { nounwind convergent }
177 attributes #2 = { convergent inaccessiblememonly nounwind }