| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck %s -check-prefix=GCN | |
| define amdgpu_cs void @if_then(ptr addrspace(8) inreg %input, ptr addrspace(8) inreg %output, <3 x i32> %LocalInvocationId) { | |
| ; GCN-LABEL: if_then: | |
| ; GCN: ; %bb.0: ; %.entry | |
| ; GCN-NEXT: v_mov_b32_e32 v3, 0 | |
| ; GCN-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v0 | |
| ; GCN-NEXT: s_and_saveexec_b32 s0, vcc_lo | |
| ; GCN-NEXT: ; %bb.1: ; %.bb0 | |
| ; GCN-NEXT: v_mov_b32_e32 v3, 1 | |
| ; GCN-NEXT: ; %bb.2: ; %.merge | |
| ; GCN-NEXT: s_or_b32 exec_lo, exec_lo, s0 | |
| ; GCN-NEXT: v_cmp_lt_u32_e32 vcc_lo, 3, v0 | |
| ; GCN-NEXT: s_and_saveexec_b32 s0, vcc_lo | |
| ; GCN-NEXT: s_cbranch_execz .LBB0_4 | |
| ; GCN-NEXT: ; %bb.3: ; %.then | |
| ; GCN-NEXT: s_or_saveexec_b32 s1, -1 | |
| ; GCN-NEXT: v_cndmask_b32_e64 v1, 0, v3, s1 | |
| ; GCN-NEXT: v_mov_b32_e32 v2, 0 | |
| ; GCN-NEXT: v_mov_b32_dpp v2, v1 row_shr:1 row_mask:0xf bank_mask:0xf | |
| ; GCN-NEXT: s_mov_b32 exec_lo, s1 | |
| ; GCN-NEXT: v_mov_b32_e32 v0, v2 | |
| ; GCN-NEXT: v_mov_b32_e32 v4, -1 | |
| ; GCN-NEXT: v_mov_b32_e32 v3, 0 | |
| ; GCN-NEXT: buffer_store_dword v4, v0, s[4:7], 0 offen | |
| ; GCN-NEXT: .LBB0_4: ; %.end | |
| ; GCN-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0) | |
| ; GCN-NEXT: s_or_b32 exec_lo, exec_lo, s0 | |
| ; GCN-NEXT: v_mov_b32_e32 v0, -1 | |
| ; GCN-NEXT: buffer_store_dword v0, v3, s[4:7], 0 offen | |
| ; GCN-NEXT: s_endpgm | |
| .entry: | |
| %LocalInvocationId.i0 = extractelement <3 x i32> %LocalInvocationId, i32 0 | |
| %.not10002 = icmp eq i32 %LocalInvocationId.i0, 0 | |
| br i1 %.not10002, label %.merge, label %.bb0 | |
| .bb0: | |
| br label %.merge | |
| .merge: | |
| %src = phi i32 [ 0, %.entry ], [ 1, %.bb0 ] | |
| %i530 = icmp ult i32 %LocalInvocationId.i0, 4 | |
| br i1 %i530, label %.end, label %.then | |
| .then: | |
| %i562 = call i32 @llvm.amdgcn.set.inactive.i32(i32 %src, i32 0) | |
| %i563 = call i32 @llvm.amdgcn.update.dpp.i32(i32 0, i32 %i562, i32 273, i32 15, i32 15, i1 false) | |
| %i564 = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %i563) | |
| call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 -1, ptr addrspace(8) %output, i32 %i564, i32 0, i32 0) | |
| br label %.end | |
| .end: | |
| %idx = phi i32 [ 0, %.then ], [ %src, %.merge ] | |
| call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 -1, ptr addrspace(8) %output, i32 %idx, i32 0, i32 0) | |
| ret void | |
| } | |
| define amdgpu_cs void @if_else_vgpr_opt(ptr addrspace(8) inreg %input, ptr addrspace(8) inreg %output, <3 x i32> %LocalInvocationId) { | |
| ; GCN-LABEL: if_else_vgpr_opt: | |
| ; GCN: ; %bb.0: ; %.entry | |
| ; GCN-NEXT: v_mov_b32_e32 v3, 0 | |
| ; GCN-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v0 | |
| ; GCN-NEXT: s_and_saveexec_b32 s0, vcc_lo | |
| ; GCN-NEXT: ; %bb.1: ; %.bb0 | |
| ; GCN-NEXT: v_mov_b32_e32 v3, 1 | |
| ; GCN-NEXT: ; %bb.2: ; %.merge | |
| ; GCN-NEXT: s_or_b32 exec_lo, exec_lo, s0 | |
| ; GCN-NEXT: v_cmp_lt_u32_e32 vcc_lo, 3, v0 | |
| ; GCN-NEXT: s_and_saveexec_b32 s0, vcc_lo | |
| ; GCN-NEXT: s_xor_b32 s0, exec_lo, s0 | |
| ; GCN-NEXT: s_cbranch_execnz .LBB1_5 | |
| ; GCN-NEXT: ; %bb.3: ; %Flow | |
| ; GCN-NEXT: s_andn2_saveexec_b32 s0, s0 | |
| ; GCN-NEXT: s_cbranch_execnz .LBB1_6 | |
| ; GCN-NEXT: .LBB1_4: ; %.end | |
| ; GCN-NEXT: s_endpgm | |
| ; GCN-NEXT: .LBB1_5: ; %.else | |
| ; GCN-NEXT: s_or_saveexec_b32 s1, -1 | |
| ; GCN-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GCN-NEXT: v_cndmask_b32_e64 v2, 0, v3, s1 | |
| ; GCN-NEXT: v_mov_b32_dpp v1, v2 row_shr:1 row_mask:0xf bank_mask:0xf | |
| ; GCN-NEXT: s_mov_b32 exec_lo, s1 | |
| ; GCN-NEXT: v_mov_b32_e32 v0, v1 | |
| ; GCN-NEXT: v_mov_b32_e32 v3, -1 | |
| ; GCN-NEXT: buffer_store_dword v3, v0, s[4:7], 0 offen | |
| ; GCN-NEXT: ; implicit-def: $vgpr3 | |
| ; GCN-NEXT: s_andn2_saveexec_b32 s0, s0 | |
| ; GCN-NEXT: s_cbranch_execz .LBB1_4 | |
| ; GCN-NEXT: .LBB1_6: ; %.then | |
| ; GCN-NEXT: v_mov_b32_e32 v0, -1 | |
| ; GCN-NEXT: buffer_store_dword v0, v3, s[4:7], 0 offen | |
| ; GCN-NEXT: s_endpgm | |
| .entry: | |
| %LocalInvocationId.i0 = extractelement <3 x i32> %LocalInvocationId, i32 0 | |
| %.not10002 = icmp eq i32 %LocalInvocationId.i0, 0 | |
| br i1 %.not10002, label %.merge, label %.bb0 | |
| .bb0: | |
| br label %.merge | |
| .merge: | |
| %src = phi i32 [ 0, %.entry ], [ 1, %.bb0 ] | |
| %i530 = icmp ult i32 %LocalInvocationId.i0, 4 | |
| br i1 %i530, label %.then, label %.else | |
| .then: | |
| call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 -1, ptr addrspace(8) %output, i32 %src, i32 0, i32 0) | |
| br label %.end | |
| .else: | |
| %i562 = call i32 @llvm.amdgcn.set.inactive.i32(i32 %src, i32 0) | |
| %i563 = call i32 @llvm.amdgcn.update.dpp.i32(i32 0, i32 %i562, i32 273, i32 15, i32 15, i1 false) | |
| %i564 = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %i563) | |
| call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 -1, ptr addrspace(8) %output, i32 %i564, i32 0, i32 0) | |
| br label %.end | |
| .end: | |
| ret void | |
| } | |
| declare i32 @llvm.amdgcn.set.inactive.i32(i32, i32) #0 | |
| declare i32 @llvm.amdgcn.update.dpp.i32(i32, i32, i32, i32, i32, i1) #0 | |
| declare i32 @llvm.amdgcn.strict.wwm.i32(i32) #1 | |
| declare void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32, ptr addrspace(8), i32, i32 immarg, i32 immarg) #2 | |
| attributes #0 = { convergent nounwind readnone willreturn } | |
| attributes #1 = { convergent nounwind readnone speculatable willreturn } | |
| attributes #2 = { nounwind willreturn writeonly } | |