178 lines · plain
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 %s2 3; Need to to trigger tail duplication this during4; MachineBlockPlacement, since calls aren't tail duplicated pre-RA.5 6declare void @nonconvergent_func() #07declare void @convergent_func() #18declare void @llvm.amdgcn.s.barrier() #19declare void @llvm.amdgcn.ds.gws.init(i32, i32) #210declare void @llvm.amdgcn.ds.gws.barrier(i32, i32) #211declare void @llvm.amdgcn.ds.gws.sema.release.all(i32 %offset) #212 13; barrier shouldn't be duplicated.14 15; GCN-LABEL: {{^}}taildup_barrier:16; GCN: s_barrier17; GCN-NOT: s_barrier18define void @taildup_barrier(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #0 {19entry:20 br i1 %cond, label %bb1, label %bb221 22bb1:23 store i32 0, ptr addrspace(1) %a24 br label %call25 26bb2:27 store i32 1, ptr addrspace(1) %a28 br label %call29 30call:31 call void @llvm.amdgcn.s.barrier()32 br label %ret33 34ret:35 ret void36}37 38; GCN-LABEL: {{^}}taildup_convergent_call:39; GCN: s_swappc_b6440; GCN-NOT: s_swappc_b6441define void @taildup_convergent_call(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {42entry:43 br i1 %cond, label %bb1, label %bb244 45bb1:46 store i32 0, ptr addrspace(1) %a47 br label %call48 49bb2:50 store i32 1, ptr addrspace(1) %a51 br label %call52 53call:54 call void @convergent_func()55 br label %ret56 57ret:58 ret void59}60 61; TODO: Currently there is only one convergent call pseudo, but this62; theoretically could use a nonconvergent variant.63; GCN-LABEL: {{^}}taildup_nonconvergent_call:64; GCN: s_swappc_b6465; GCN-NOT: s_swappc_b6466define void @taildup_nonconvergent_call(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {67entry:68 br i1 %cond, label %bb1, label %bb269 70bb1:71 store i32 0, ptr addrspace(1) %a72 br label %call73 74bb2:75 store i32 1, ptr addrspace(1) %a76 br label %call77 78call:79 call void @nonconvergent_func()80 br label %ret81 82ret:83 ret void84}85 86; GCN-LABEL: {{^}}taildup_convergent_tailcall:87; GCN: s_setpc_b6488; GCN-NOT: s_setpc_b6489define void @taildup_convergent_tailcall(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond) #1 {90entry:91 br i1 %cond, label %bb1, label %bb292 93bb1:94 store i32 0, ptr addrspace(1) %a95 br label %call96 97bb2:98 store i32 1, ptr addrspace(1) %a99 br label %call100 101call:102 tail call void @convergent_func()103 ret void104}105 106; GCN-LABEL: {{^}}taildup_gws_init:107; GCN: ds_gws_init108; GCN-NOT: ds_gws_init109define amdgpu_kernel void @taildup_gws_init(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %val, i32 %offset) #0 {110entry:111 br i1 %cond, label %bb1, label %bb2112 113bb1:114 store i32 0, ptr addrspace(1) %a115 br label %call116 117bb2:118 store i32 1, ptr addrspace(1) %a119 br label %call120 121call:122 call void @llvm.amdgcn.ds.gws.init(i32 %val, i32 %offset)123 br label %ret124 125ret:126 ret void127}128 129; GCN-LABEL: {{^}}taildup_gws_barrier:130; GCN: ds_gws_barrier131; GCN-NOT: ds_gws_barrier132define amdgpu_kernel void @taildup_gws_barrier(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %val, i32 %offset) #0 {133entry:134 br i1 %cond, label %bb1, label %bb2135 136bb1:137 store i32 0, ptr addrspace(1) %a138 br label %call139 140bb2:141 store i32 1, ptr addrspace(1) %a142 br label %call143 144call:145 call void @llvm.amdgcn.ds.gws.barrier(i32 %val, i32 %offset)146 br label %ret147 148ret:149 ret void150}151 152; GCN-LABEL: {{^}}taildup_gws_sema_release_all:153; GCN: ds_gws_sema_release_all154; GCN-NOT: ds_gws155define amdgpu_kernel void @taildup_gws_sema_release_all(ptr addrspace(1) %a, ptr addrspace(1) %b, i1 %cond, i32 %offset) #0 {156entry:157 br i1 %cond, label %bb1, label %bb2158 159bb1:160 store i32 0, ptr addrspace(1) %a161 br label %call162 163bb2:164 store i32 1, ptr addrspace(1) %a165 br label %call166 167call:168 call void @llvm.amdgcn.ds.gws.sema.release.all(i32 %offset)169 br label %ret170 171ret:172 ret void173}174 175attributes #0 = { nounwind }176attributes #1 = { nounwind convergent }177attributes #2 = { convergent inaccessiblememonly nounwind }178