| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=DEFAULTSIZE,MUBUF %s |
| ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -amdgpu-assume-dynamic-stack-object-size=1024 < %s | FileCheck -check-prefixes=ASSUME1024,MUBUF %s |
| ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -amdgpu-enable-flat-scratch < %s | FileCheck -check-prefixes=DEFAULTSIZE,FLATSCR %s |
| ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -amdgpu-enable-flat-scratch -amdgpu-assume-dynamic-stack-object-size=1024 < %s | FileCheck -check-prefixes=ASSUME1024,FLATSCR %s |
| |
| ; FIXME: Generated test checks do not check metadata at the end of the |
| ; function, so this also includes manually added checks. |
| |
| ; Test that we can select a statically sized alloca outside of the |
| ; entry block. |
| |
| ; FIXME: FunctionLoweringInfo unhelpfully doesn't preserve an |
| ; alignment less than the stack alignment. |
| define amdgpu_kernel void @kernel_non_entry_block_static_alloca_uniformly_reached_align4(i32 addrspace(1)* %out, i32 %arg.cond0, i32 %arg.cond1, i32 %in) { |
| ; MUBUF-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align4: |
| ; MUBUF: ; %bb.0: ; %entry |
| ; MUBUF-NEXT: s_add_u32 s0, s0, s9 |
| ; MUBUF-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x8 |
| ; MUBUF-NEXT: s_addc_u32 s1, s1, 0 |
| ; MUBUF-NEXT: s_movk_i32 s32, 0x400 |
| ; MUBUF-NEXT: s_mov_b32 s33, 0 |
| ; MUBUF-NEXT: s_waitcnt lgkmcnt(0) |
| ; MUBUF-NEXT: s_cmp_lg_u32 s8, 0 |
| ; MUBUF-NEXT: s_cbranch_scc1 .LBB0_3 |
| ; MUBUF-NEXT: ; %bb.1: ; %bb.0 |
| ; MUBUF-NEXT: s_cmp_lg_u32 s9, 0 |
| ; MUBUF-NEXT: s_cbranch_scc1 .LBB0_3 |
| ; MUBUF-NEXT: ; %bb.2: ; %bb.1 |
| ; MUBUF-NEXT: s_add_i32 s6, s32, 0x1000 |
| ; MUBUF-NEXT: s_lshl_b32 s7, s10, 2 |
| ; MUBUF-NEXT: s_mov_b32 s32, s6 |
| ; MUBUF-NEXT: v_mov_b32_e32 v1, 0 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, s6 |
| ; MUBUF-NEXT: v_mov_b32_e32 v3, 1 |
| ; MUBUF-NEXT: s_add_i32 s6, s6, s7 |
| ; MUBUF-NEXT: buffer_store_dword v1, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: buffer_store_dword v3, v2, s[0:3], 0 offen offset:4 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, s6 |
| ; MUBUF-NEXT: buffer_load_dword v2, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: v_add_u32_e32 v0, v2, v0 |
| ; MUBUF-NEXT: s_waitcnt lgkmcnt(0) |
| ; MUBUF-NEXT: global_store_dword v1, v0, s[4:5] |
| ; MUBUF-NEXT: .LBB0_3: ; %bb.2 |
| ; MUBUF-NEXT: v_mov_b32_e32 v0, 0 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v0, off |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: s_endpgm |
| ; |
| ; FLATSCR-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align4: |
| ; FLATSCR: ; %bb.0: ; %entry |
| ; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s2, s5 |
| ; FLATSCR-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x8 |
| ; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s3, 0 |
| ; FLATSCR-NEXT: s_mov_b32 s32, 16 |
| ; FLATSCR-NEXT: s_mov_b32 s33, 0 |
| ; FLATSCR-NEXT: s_waitcnt lgkmcnt(0) |
| ; FLATSCR-NEXT: s_cmp_lg_u32 s4, 0 |
| ; FLATSCR-NEXT: s_cbranch_scc1 .LBB0_3 |
| ; FLATSCR-NEXT: ; %bb.1: ; %bb.0 |
| ; FLATSCR-NEXT: s_cmp_lg_u32 s5, 0 |
| ; FLATSCR-NEXT: s_cbranch_scc1 .LBB0_3 |
| ; FLATSCR-NEXT: ; %bb.2: ; %bb.1 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v1, 0 |
| ; FLATSCR-NEXT: s_add_i32 s2, s32, 0x1000 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v2, 1 |
| ; FLATSCR-NEXT: s_lshl_b32 s3, s6, 2 |
| ; FLATSCR-NEXT: s_mov_b32 s32, s2 |
| ; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s2 |
| ; FLATSCR-NEXT: s_add_i32 s2, s2, s3 |
| ; FLATSCR-NEXT: scratch_load_dword v2, off, s2 |
| ; FLATSCR-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: v_add_u32_e32 v0, v2, v0 |
| ; FLATSCR-NEXT: s_waitcnt lgkmcnt(0) |
| ; FLATSCR-NEXT: global_store_dword v1, v0, s[0:1] |
| ; FLATSCR-NEXT: .LBB0_3: ; %bb.2 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v0, 0 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v0, off |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: s_endpgm |
| |
| entry: |
| %cond0 = icmp eq i32 %arg.cond0, 0 |
| br i1 %cond0, label %bb.0, label %bb.2 |
| |
| bb.0: |
| %alloca = alloca [16 x i32], align 4, addrspace(5) |
| %gep0 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 0 |
| %gep1 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 1 |
| %cond1 = icmp eq i32 %arg.cond1, 0 |
| br i1 %cond1, label %bb.1, label %bb.2 |
| |
| bb.1: |
| ; Use the alloca outside of the defining block. |
| store i32 0, i32 addrspace(5)* %gep0 |
| store i32 1, i32 addrspace(5)* %gep1 |
| %gep2 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 %in |
| %load = load i32, i32 addrspace(5)* %gep2 |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() |
| %add = add i32 %load, %tid |
| store i32 %add, i32 addrspace(1)* %out |
| br label %bb.2 |
| |
| bb.2: |
| store volatile i32 0, i32 addrspace(1)* undef |
| ret void |
| } |
| ; DEFAULTSIZE: .amdhsa_private_segment_fixed_size 4112 |
| ; DEFAULTSIZE: ; ScratchSize: 4112 |
| |
| ; ASSUME1024: .amdhsa_private_segment_fixed_size 1040 |
| ; ASSUME1024: ; ScratchSize: 1040 |
| |
| define amdgpu_kernel void @kernel_non_entry_block_static_alloca_uniformly_reached_align64(i32 addrspace(1)* %out, i32 %arg.cond, i32 %in) { |
| ; MUBUF-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align64: |
| ; MUBUF: ; %bb.0: ; %entry |
| ; MUBUF-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x8 |
| ; MUBUF-NEXT: s_add_u32 s0, s0, s9 |
| ; MUBUF-NEXT: s_addc_u32 s1, s1, 0 |
| ; MUBUF-NEXT: s_movk_i32 s32, 0x1000 |
| ; MUBUF-NEXT: s_mov_b32 s33, 0 |
| ; MUBUF-NEXT: s_waitcnt lgkmcnt(0) |
| ; MUBUF-NEXT: s_cmp_lg_u32 s6, 0 |
| ; MUBUF-NEXT: s_cbranch_scc1 .LBB1_2 |
| ; MUBUF-NEXT: ; %bb.1: ; %bb.0 |
| ; MUBUF-NEXT: s_add_i32 s6, s32, 0x1000 |
| ; MUBUF-NEXT: s_and_b32 s6, s6, 0xfffff000 |
| ; MUBUF-NEXT: s_lshl_b32 s7, s7, 2 |
| ; MUBUF-NEXT: s_mov_b32 s32, s6 |
| ; MUBUF-NEXT: v_mov_b32_e32 v1, 0 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, s6 |
| ; MUBUF-NEXT: v_mov_b32_e32 v3, 1 |
| ; MUBUF-NEXT: s_add_i32 s6, s6, s7 |
| ; MUBUF-NEXT: buffer_store_dword v1, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: buffer_store_dword v3, v2, s[0:3], 0 offen offset:4 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, s6 |
| ; MUBUF-NEXT: buffer_load_dword v2, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: v_add_u32_e32 v0, v2, v0 |
| ; MUBUF-NEXT: s_waitcnt lgkmcnt(0) |
| ; MUBUF-NEXT: global_store_dword v1, v0, s[4:5] |
| ; MUBUF-NEXT: .LBB1_2: ; %bb.1 |
| ; MUBUF-NEXT: v_mov_b32_e32 v0, 0 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v0, off |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: s_endpgm |
| ; |
| ; FLATSCR-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align64: |
| ; FLATSCR: ; %bb.0: ; %entry |
| ; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s2, s5 |
| ; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s3, 0 |
| ; FLATSCR-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x8 |
| ; FLATSCR-NEXT: s_mov_b32 s32, 64 |
| ; FLATSCR-NEXT: s_mov_b32 s33, 0 |
| ; FLATSCR-NEXT: s_waitcnt lgkmcnt(0) |
| ; FLATSCR-NEXT: s_cmp_lg_u32 s2, 0 |
| ; FLATSCR-NEXT: s_cbranch_scc1 .LBB1_2 |
| ; FLATSCR-NEXT: ; %bb.1: ; %bb.0 |
| ; FLATSCR-NEXT: s_add_i32 s2, s32, 0x1000 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v1, 0 |
| ; FLATSCR-NEXT: s_and_b32 s2, s2, 0xfffff000 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v2, 1 |
| ; FLATSCR-NEXT: s_lshl_b32 s3, s3, 2 |
| ; FLATSCR-NEXT: s_mov_b32 s32, s2 |
| ; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s2 |
| ; FLATSCR-NEXT: s_add_i32 s2, s2, s3 |
| ; FLATSCR-NEXT: scratch_load_dword v2, off, s2 |
| ; FLATSCR-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: v_add_u32_e32 v0, v2, v0 |
| ; FLATSCR-NEXT: s_waitcnt lgkmcnt(0) |
| ; FLATSCR-NEXT: global_store_dword v1, v0, s[0:1] |
| ; FLATSCR-NEXT: .LBB1_2: ; %bb.1 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v0, 0 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v0, off |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: s_endpgm |
| entry: |
| %cond = icmp eq i32 %arg.cond, 0 |
| br i1 %cond, label %bb.0, label %bb.1 |
| |
| bb.0: |
| %alloca = alloca [16 x i32], align 64, addrspace(5) |
| %gep0 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 0 |
| %gep1 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 1 |
| store i32 0, i32 addrspace(5)* %gep0 |
| store i32 1, i32 addrspace(5)* %gep1 |
| %gep2 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 %in |
| %load = load i32, i32 addrspace(5)* %gep2 |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() |
| %add = add i32 %load, %tid |
| store i32 %add, i32 addrspace(1)* %out |
| br label %bb.1 |
| |
| bb.1: |
| store volatile i32 0, i32 addrspace(1)* undef |
| ret void |
| } |
| |
| ; DEFAULTSIZE: .amdhsa_private_segment_fixed_size 4160 |
| ; DEFAULTSIZE: ; ScratchSize: 4160 |
| |
| ; ASSUME1024: .amdhsa_private_segment_fixed_size 1088 |
| ; ASSUME1024: ; ScratchSize: 1088 |
| |
| |
| define void @func_non_entry_block_static_alloca_align4(i32 addrspace(1)* %out, i32 %arg.cond0, i32 %arg.cond1, i32 %in) { |
| ; MUBUF-LABEL: func_non_entry_block_static_alloca_align4: |
| ; MUBUF: ; %bb.0: ; %entry |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; MUBUF-NEXT: s_mov_b32 s7, s33 |
| ; MUBUF-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2 |
| ; MUBUF-NEXT: s_mov_b32 s33, s32 |
| ; MUBUF-NEXT: s_addk_i32 s32, 0x400 |
| ; MUBUF-NEXT: s_and_saveexec_b64 s[4:5], vcc |
| ; MUBUF-NEXT: s_cbranch_execz .LBB2_3 |
| ; MUBUF-NEXT: ; %bb.1: ; %bb.0 |
| ; MUBUF-NEXT: v_cmp_eq_u32_e32 vcc, 0, v3 |
| ; MUBUF-NEXT: s_and_b64 exec, exec, vcc |
| ; MUBUF-NEXT: s_cbranch_execz .LBB2_3 |
| ; MUBUF-NEXT: ; %bb.2: ; %bb.1 |
| ; MUBUF-NEXT: s_add_i32 s6, s32, 0x1000 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, 0 |
| ; MUBUF-NEXT: v_mov_b32_e32 v3, s6 |
| ; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, 1 |
| ; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:4 |
| ; MUBUF-NEXT: v_lshl_add_u32 v2, v4, 2, s6 |
| ; MUBUF-NEXT: buffer_load_dword v2, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: v_and_b32_e32 v3, 0x3ff, v5 |
| ; MUBUF-NEXT: s_mov_b32 s32, s6 |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: v_add_u32_e32 v2, v2, v3 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v2, off |
| ; MUBUF-NEXT: .LBB2_3: ; %bb.2 |
| ; MUBUF-NEXT: s_or_b64 exec, exec, s[4:5] |
| ; MUBUF-NEXT: v_mov_b32_e32 v0, 0 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v0, off |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: s_addk_i32 s32, 0xfc00 |
| ; MUBUF-NEXT: s_mov_b32 s33, s7 |
| ; MUBUF-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; FLATSCR-LABEL: func_non_entry_block_static_alloca_align4: |
| ; FLATSCR: ; %bb.0: ; %entry |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; FLATSCR-NEXT: s_mov_b32 s3, s33 |
| ; FLATSCR-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2 |
| ; FLATSCR-NEXT: s_mov_b32 s33, s32 |
| ; FLATSCR-NEXT: s_add_i32 s32, s32, 16 |
| ; FLATSCR-NEXT: s_and_saveexec_b64 s[0:1], vcc |
| ; FLATSCR-NEXT: s_cbranch_execz .LBB2_3 |
| ; FLATSCR-NEXT: ; %bb.1: ; %bb.0 |
| ; FLATSCR-NEXT: v_cmp_eq_u32_e32 vcc, 0, v3 |
| ; FLATSCR-NEXT: s_and_b64 exec, exec, vcc |
| ; FLATSCR-NEXT: s_cbranch_execz .LBB2_3 |
| ; FLATSCR-NEXT: ; %bb.2: ; %bb.1 |
| ; FLATSCR-NEXT: s_add_i32 s2, s32, 0x1000 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v2, 0 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v3, 1 |
| ; FLATSCR-NEXT: scratch_store_dwordx2 off, v[2:3], s2 |
| ; FLATSCR-NEXT: v_lshl_add_u32 v2, v4, 2, s2 |
| ; FLATSCR-NEXT: scratch_load_dword v2, v2, off |
| ; FLATSCR-NEXT: v_and_b32_e32 v3, 0x3ff, v5 |
| ; FLATSCR-NEXT: s_mov_b32 s32, s2 |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: v_add_u32_e32 v2, v2, v3 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v2, off |
| ; FLATSCR-NEXT: .LBB2_3: ; %bb.2 |
| ; FLATSCR-NEXT: s_or_b64 exec, exec, s[0:1] |
| ; FLATSCR-NEXT: v_mov_b32_e32 v0, 0 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v0, off |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: s_add_i32 s32, s32, -16 |
| ; FLATSCR-NEXT: s_mov_b32 s33, s3 |
| ; FLATSCR-NEXT: s_setpc_b64 s[30:31] |
| |
| entry: |
| %cond0 = icmp eq i32 %arg.cond0, 0 |
| br i1 %cond0, label %bb.0, label %bb.2 |
| |
| bb.0: |
| %alloca = alloca [16 x i32], align 4, addrspace(5) |
| %gep0 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 0 |
| %gep1 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 1 |
| %cond1 = icmp eq i32 %arg.cond1, 0 |
| br i1 %cond1, label %bb.1, label %bb.2 |
| |
| bb.1: |
| ; Use the alloca outside of the defining block. |
| store i32 0, i32 addrspace(5)* %gep0 |
| store i32 1, i32 addrspace(5)* %gep1 |
| %gep2 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 %in |
| %load = load i32, i32 addrspace(5)* %gep2 |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() |
| %add = add i32 %load, %tid |
| store i32 %add, i32 addrspace(1)* %out |
| br label %bb.2 |
| |
| bb.2: |
| store volatile i32 0, i32 addrspace(1)* undef |
| ret void |
| } |
| |
| define void @func_non_entry_block_static_alloca_align64(i32 addrspace(1)* %out, i32 %arg.cond, i32 %in) { |
| ; MUBUF-LABEL: func_non_entry_block_static_alloca_align64: |
| ; MUBUF: ; %bb.0: ; %entry |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; MUBUF-NEXT: s_mov_b32 s7, s33 |
| ; MUBUF-NEXT: s_add_i32 s33, s32, 0xfc0 |
| ; MUBUF-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2 |
| ; MUBUF-NEXT: s_and_b32 s33, s33, 0xfffff000 |
| ; MUBUF-NEXT: s_addk_i32 s32, 0x2000 |
| ; MUBUF-NEXT: s_and_saveexec_b64 s[4:5], vcc |
| ; MUBUF-NEXT: s_cbranch_execz .LBB3_2 |
| ; MUBUF-NEXT: ; %bb.1: ; %bb.0 |
| ; MUBUF-NEXT: s_add_i32 s6, s32, 0x1000 |
| ; MUBUF-NEXT: s_and_b32 s6, s6, 0xfffff000 |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, 0 |
| ; MUBUF-NEXT: v_mov_b32_e32 v5, s6 |
| ; MUBUF-NEXT: buffer_store_dword v2, v5, s[0:3], 0 offen |
| ; MUBUF-NEXT: v_mov_b32_e32 v2, 1 |
| ; MUBUF-NEXT: buffer_store_dword v2, v5, s[0:3], 0 offen offset:4 |
| ; MUBUF-NEXT: v_lshl_add_u32 v2, v3, 2, s6 |
| ; MUBUF-NEXT: buffer_load_dword v2, v2, s[0:3], 0 offen |
| ; MUBUF-NEXT: v_and_b32_e32 v3, 0x3ff, v4 |
| ; MUBUF-NEXT: s_mov_b32 s32, s6 |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: v_add_u32_e32 v2, v2, v3 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v2, off |
| ; MUBUF-NEXT: .LBB3_2: ; %bb.1 |
| ; MUBUF-NEXT: s_or_b64 exec, exec, s[4:5] |
| ; MUBUF-NEXT: v_mov_b32_e32 v0, 0 |
| ; MUBUF-NEXT: global_store_dword v[0:1], v0, off |
| ; MUBUF-NEXT: s_waitcnt vmcnt(0) |
| ; MUBUF-NEXT: s_addk_i32 s32, 0xe000 |
| ; MUBUF-NEXT: s_mov_b32 s33, s7 |
| ; MUBUF-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; FLATSCR-LABEL: func_non_entry_block_static_alloca_align64: |
| ; FLATSCR: ; %bb.0: ; %entry |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; FLATSCR-NEXT: s_mov_b32 s3, s33 |
| ; FLATSCR-NEXT: s_add_i32 s33, s32, 63 |
| ; FLATSCR-NEXT: v_cmp_eq_u32_e32 vcc, 0, v2 |
| ; FLATSCR-NEXT: s_andn2_b32 s33, s33, 63 |
| ; FLATSCR-NEXT: s_addk_i32 s32, 0x80 |
| ; FLATSCR-NEXT: s_and_saveexec_b64 s[0:1], vcc |
| ; FLATSCR-NEXT: s_cbranch_execz .LBB3_2 |
| ; FLATSCR-NEXT: ; %bb.1: ; %bb.0 |
| ; FLATSCR-NEXT: s_add_i32 s2, s32, 0x1000 |
| ; FLATSCR-NEXT: s_and_b32 s2, s2, 0xfffff000 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v5, 0 |
| ; FLATSCR-NEXT: v_mov_b32_e32 v6, 1 |
| ; FLATSCR-NEXT: scratch_store_dwordx2 off, v[5:6], s2 |
| ; FLATSCR-NEXT: v_lshl_add_u32 v2, v3, 2, s2 |
| ; FLATSCR-NEXT: scratch_load_dword v2, v2, off |
| ; FLATSCR-NEXT: v_and_b32_e32 v3, 0x3ff, v4 |
| ; FLATSCR-NEXT: s_mov_b32 s32, s2 |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: v_add_u32_e32 v2, v2, v3 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v2, off |
| ; FLATSCR-NEXT: .LBB3_2: ; %bb.1 |
| ; FLATSCR-NEXT: s_or_b64 exec, exec, s[0:1] |
| ; FLATSCR-NEXT: v_mov_b32_e32 v0, 0 |
| ; FLATSCR-NEXT: global_store_dword v[0:1], v0, off |
| ; FLATSCR-NEXT: s_waitcnt vmcnt(0) |
| ; FLATSCR-NEXT: s_addk_i32 s32, 0xff80 |
| ; FLATSCR-NEXT: s_mov_b32 s33, s3 |
| ; FLATSCR-NEXT: s_setpc_b64 s[30:31] |
| entry: |
| %cond = icmp eq i32 %arg.cond, 0 |
| br i1 %cond, label %bb.0, label %bb.1 |
| |
| bb.0: |
| %alloca = alloca [16 x i32], align 64, addrspace(5) |
| %gep0 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 0 |
| %gep1 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 1 |
| store i32 0, i32 addrspace(5)* %gep0 |
| store i32 1, i32 addrspace(5)* %gep1 |
| %gep2 = getelementptr [16 x i32], [16 x i32] addrspace(5)* %alloca, i32 0, i32 %in |
| %load = load i32, i32 addrspace(5)* %gep2 |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() |
| %add = add i32 %load, %tid |
| store i32 %add, i32 addrspace(1)* %out |
| br label %bb.1 |
| |
| bb.1: |
| store volatile i32 0, i32 addrspace(1)* undef |
| ret void |
| } |
| |
| declare i32 @llvm.amdgcn.workitem.id.x() #0 |
| |
| attributes #0 = { nounwind readnone speculatable } |