brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.3 KiB · 21f459a Raw
279 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -amdgpu-load-store-vectorizer=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,DEFAULTSIZE %s3; RUN: llc -global-isel -amdgpu-load-store-vectorizer=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-assume-dynamic-stack-object-size=1024 < %s | FileCheck -check-prefixes=GCN,ASSUME1024 %s4 5; FIXME: Generated test checks do not check metadata at the end of the6; function, so this also includes manually added checks.7 8; Test that we can select a statically sized alloca outside of the9; entry block.10 11; FIXME: FunctionLoweringInfo unhelpfully doesn't preserve an12; alignment less than the stack alignment.13define amdgpu_kernel void @kernel_non_entry_block_static_alloca_uniformly_reached_align4(ptr addrspace(1) %out, i32 %arg.cond0, i32 %arg.cond1, i32 %in) {14; GCN-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align4:15; GCN:       ; %bb.0: ; %entry16; GCN-NEXT:    s_load_dword s4, s[8:9], 0x817; GCN-NEXT:    s_add_u32 s0, s0, s1718; GCN-NEXT:    s_addc_u32 s1, s1, 019; GCN-NEXT:    s_mov_b32 s33, 020; GCN-NEXT:    s_movk_i32 s32, 0x40021; GCN-NEXT:    s_waitcnt lgkmcnt(0)22; GCN-NEXT:    s_cmp_lg_u32 s4, 023; GCN-NEXT:    s_cbranch_scc1 .LBB0_324; GCN-NEXT:  ; %bb.1: ; %bb.025; GCN-NEXT:    s_load_dword s4, s[8:9], 0xc26; GCN-NEXT:    s_waitcnt lgkmcnt(0)27; GCN-NEXT:    s_cmp_lg_u32 s4, 028; GCN-NEXT:    s_cbranch_scc1 .LBB0_329; GCN-NEXT:  ; %bb.2: ; %bb.130; GCN-NEXT:    s_load_dword s4, s[8:9], 0x1031; GCN-NEXT:    s_mov_b32 s6, s3232; GCN-NEXT:    v_mov_b32_e32 v1, 033; GCN-NEXT:    v_mov_b32_e32 v2, s634; GCN-NEXT:    v_mov_b32_e32 v3, 135; GCN-NEXT:    s_waitcnt lgkmcnt(0)36; GCN-NEXT:    s_lshl_b32 s4, s4, 237; GCN-NEXT:    s_add_u32 s4, s6, s438; GCN-NEXT:    buffer_store_dword v1, v2, s[0:3], 0 offen39; GCN-NEXT:    buffer_store_dword v3, v2, s[0:3], 0 offen offset:440; GCN-NEXT:    v_mov_b32_e32 v2, s441; GCN-NEXT:    buffer_load_dword v2, v2, s[0:3], 0 offen42; GCN-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x043; GCN-NEXT:    s_add_u32 s32, s6, 0x100044; GCN-NEXT:    s_waitcnt vmcnt(0)45; GCN-NEXT:    v_add_u32_e32 v0, v2, v046; GCN-NEXT:    s_waitcnt lgkmcnt(0)47; GCN-NEXT:    global_store_dword v1, v0, s[4:5]48; GCN-NEXT:  .LBB0_3: ; %bb.249; GCN-NEXT:    v_mov_b32_e32 v0, 050; GCN-NEXT:    global_store_dword v[0:1], v0, off51; GCN-NEXT:    s_waitcnt vmcnt(0)52; GCN-NEXT:    s_endpgm53 54entry:55  %cond0 = icmp eq i32 %arg.cond0, 056  br i1 %cond0, label %bb.0, label %bb.257 58bb.0:59  %alloca = alloca [16 x i32], align 4, addrspace(5)60  %gep1 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 161  %cond1 = icmp eq i32 %arg.cond1, 062  br i1 %cond1, label %bb.1, label %bb.263 64bb.1:65  ; Use the alloca outside of the defining block.66  store i32 0, ptr addrspace(5) %alloca67  store i32 1, ptr addrspace(5) %gep168  %gep2 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %in69  %load = load i32, ptr addrspace(5) %gep270  %tid = call i32 @llvm.amdgcn.workitem.id.x()71  %add = add i32 %load, %tid72  store i32 %add, ptr addrspace(1) %out73  br label %bb.274 75bb.2:76  store volatile i32 0, ptr addrspace(1) poison77  ret void78}79; DEFAULTSIZE: .amdhsa_private_segment_fixed_size 1680; DEFAULTSIZE: ; ScratchSize: 1681 82; ASSUME1024: .amdhsa_private_segment_fixed_size 104083; ASSUME1024: ; ScratchSize: 104084 85define amdgpu_kernel void @kernel_non_entry_block_static_alloca_uniformly_reached_align64(ptr addrspace(1) %out, i32 %arg.cond, i32 %in) {86; GCN-LABEL: kernel_non_entry_block_static_alloca_uniformly_reached_align64:87; GCN:       ; %bb.0: ; %entry88; GCN-NEXT:    s_load_dword s4, s[8:9], 0x889; GCN-NEXT:    s_add_u32 s0, s0, s1790; GCN-NEXT:    s_addc_u32 s1, s1, 091; GCN-NEXT:    s_mov_b32 s33, 092; GCN-NEXT:    s_movk_i32 s32, 0x100093; GCN-NEXT:    s_waitcnt lgkmcnt(0)94; GCN-NEXT:    s_cmp_lg_u32 s4, 095; GCN-NEXT:    s_cbranch_scc1 .LBB1_296; GCN-NEXT:  ; %bb.1: ; %bb.097; GCN-NEXT:    s_load_dword s4, s[8:9], 0xc98; GCN-NEXT:    s_add_u32 s5, s32, 0xfff99; GCN-NEXT:    s_and_b32 s6, s5, 0xfffff000100; GCN-NEXT:    v_mov_b32_e32 v1, 0101; GCN-NEXT:    v_mov_b32_e32 v2, s6102; GCN-NEXT:    s_waitcnt lgkmcnt(0)103; GCN-NEXT:    s_lshl_b32 s4, s4, 2104; GCN-NEXT:    v_mov_b32_e32 v3, 1105; GCN-NEXT:    s_add_u32 s4, s6, s4106; GCN-NEXT:    buffer_store_dword v1, v2, s[0:3], 0 offen107; GCN-NEXT:    buffer_store_dword v3, v2, s[0:3], 0 offen offset:4108; GCN-NEXT:    v_mov_b32_e32 v2, s4109; GCN-NEXT:    buffer_load_dword v2, v2, s[0:3], 0 offen110; GCN-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0111; GCN-NEXT:    s_add_u32 s32, s6, 0x1000112; GCN-NEXT:    s_waitcnt vmcnt(0)113; GCN-NEXT:    v_add_u32_e32 v0, v2, v0114; GCN-NEXT:    s_waitcnt lgkmcnt(0)115; GCN-NEXT:    global_store_dword v1, v0, s[4:5]116; GCN-NEXT:  .LBB1_2: ; %bb.1117; GCN-NEXT:    v_mov_b32_e32 v0, 0118; GCN-NEXT:    global_store_dword v[0:1], v0, off119; GCN-NEXT:    s_waitcnt vmcnt(0)120; GCN-NEXT:    s_endpgm121entry:122  %cond = icmp eq i32 %arg.cond, 0123  br i1 %cond, label %bb.0, label %bb.1124 125bb.0:126  %alloca = alloca [16 x i32], align 64, addrspace(5)127  %gep1 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 1128  store i32 0, ptr addrspace(5) %alloca129  store i32 1, ptr addrspace(5) %gep1130  %gep2 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %in131  %load = load i32, ptr addrspace(5) %gep2132  %tid = call i32 @llvm.amdgcn.workitem.id.x()133  %add = add i32 %load, %tid134  store i32 %add, ptr addrspace(1) %out135  br label %bb.1136 137bb.1:138  store volatile i32 0, ptr addrspace(1) poison139  ret void140}141 142; DEFAULTSIZE: .amdhsa_private_segment_fixed_size 64143; DEFAULTSIZE: ; ScratchSize: 64144 145; ASSUME1024: .amdhsa_private_segment_fixed_size 1088146; ASSUME1024: ; ScratchSize: 1088147 148 149define void @func_non_entry_block_static_alloca_align4(ptr addrspace(1) %out, i32 %arg.cond0, i32 %arg.cond1, i32 %in) {150; GCN-LABEL: func_non_entry_block_static_alloca_align4:151; GCN:       ; %bb.0: ; %entry152; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)153; GCN-NEXT:    s_mov_b32 s7, s33154; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2155; GCN-NEXT:    s_mov_b32 s33, s32156; GCN-NEXT:    s_addk_i32 s32, 0x400157; GCN-NEXT:    s_and_saveexec_b64 s[4:5], vcc158; GCN-NEXT:    s_cbranch_execz .LBB2_3159; GCN-NEXT:  ; %bb.1: ; %bb.0160; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v3161; GCN-NEXT:    s_and_b64 exec, exec, vcc162; GCN-NEXT:    s_cbranch_execz .LBB2_3163; GCN-NEXT:  ; %bb.2: ; %bb.1164; GCN-NEXT:    s_mov_b32 s6, s32165; GCN-NEXT:    v_mov_b32_e32 v2, 0166; GCN-NEXT:    v_mov_b32_e32 v3, s6167; GCN-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen168; GCN-NEXT:    v_mov_b32_e32 v2, 1169; GCN-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen offset:4170; GCN-NEXT:    v_lshlrev_b32_e32 v2, 2, v4171; GCN-NEXT:    v_add_u32_e32 v2, s6, v2172; GCN-NEXT:    buffer_load_dword v2, v2, s[0:3], 0 offen173; GCN-NEXT:    v_and_b32_e32 v3, 0x3ff, v31174; GCN-NEXT:    s_add_u32 s32, s6, 0x1000175; GCN-NEXT:    s_waitcnt vmcnt(0)176; GCN-NEXT:    v_add_u32_e32 v2, v2, v3177; GCN-NEXT:    global_store_dword v[0:1], v2, off178; GCN-NEXT:  .LBB2_3: ; %bb.2179; GCN-NEXT:    s_or_b64 exec, exec, s[4:5]180; GCN-NEXT:    v_mov_b32_e32 v0, 0181; GCN-NEXT:    global_store_dword v[0:1], v0, off182; GCN-NEXT:    s_waitcnt vmcnt(0)183; GCN-NEXT:    s_mov_b32 s32, s33184; GCN-NEXT:    s_mov_b32 s33, s7185; GCN-NEXT:    s_setpc_b64 s[30:31]186 187entry:188  %cond0 = icmp eq i32 %arg.cond0, 0189  br i1 %cond0, label %bb.0, label %bb.2190 191bb.0:192  %alloca = alloca [16 x i32], align 4, addrspace(5)193  %gep1 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 1194  %cond1 = icmp eq i32 %arg.cond1, 0195  br i1 %cond1, label %bb.1, label %bb.2196 197bb.1:198  ; Use the alloca outside of the defining block.199  store i32 0, ptr addrspace(5) %alloca200  store i32 1, ptr addrspace(5) %gep1201  %gep2 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %in202  %load = load i32, ptr addrspace(5) %gep2203  %tid = call i32 @llvm.amdgcn.workitem.id.x()204  %add = add i32 %load, %tid205  store i32 %add, ptr addrspace(1) %out206  br label %bb.2207 208bb.2:209  store volatile i32 0, ptr addrspace(1) poison210  ret void211}212 213define void @func_non_entry_block_static_alloca_align64(ptr addrspace(1) %out, i32 %arg.cond, i32 %in) {214; GCN-LABEL: func_non_entry_block_static_alloca_align64:215; GCN:       ; %bb.0: ; %entry216; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)217; GCN-NEXT:    s_mov_b32 s7, s33218; GCN-NEXT:    s_add_i32 s33, s32, 0xfc0219; GCN-NEXT:    s_mov_b32 s8, s34220; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2221; GCN-NEXT:    s_and_b32 s33, s33, 0xfffff000222; GCN-NEXT:    s_mov_b32 s34, s32223; GCN-NEXT:    s_addk_i32 s32, 0x2000224; GCN-NEXT:    s_and_saveexec_b64 s[4:5], vcc225; GCN-NEXT:    s_cbranch_execz .LBB3_2226; GCN-NEXT:  ; %bb.1: ; %bb.0227; GCN-NEXT:    s_add_u32 s6, s32, 0xfff228; GCN-NEXT:    s_and_b32 s6, s6, 0xfffff000229; GCN-NEXT:    v_mov_b32_e32 v2, 0230; GCN-NEXT:    v_mov_b32_e32 v4, s6231; GCN-NEXT:    buffer_store_dword v2, v4, s[0:3], 0 offen232; GCN-NEXT:    v_mov_b32_e32 v2, 1233; GCN-NEXT:    buffer_store_dword v2, v4, s[0:3], 0 offen offset:4234; GCN-NEXT:    v_lshlrev_b32_e32 v2, 2, v3235; GCN-NEXT:    v_add_u32_e32 v2, s6, v2236; GCN-NEXT:    buffer_load_dword v2, v2, s[0:3], 0 offen237; GCN-NEXT:    v_and_b32_e32 v3, 0x3ff, v31238; GCN-NEXT:    s_add_u32 s32, s6, 0x1000239; GCN-NEXT:    s_waitcnt vmcnt(0)240; GCN-NEXT:    v_add_u32_e32 v2, v2, v3241; GCN-NEXT:    global_store_dword v[0:1], v2, off242; GCN-NEXT:  .LBB3_2: ; %bb.1243; GCN-NEXT:    s_or_b64 exec, exec, s[4:5]244; GCN-NEXT:    v_mov_b32_e32 v0, 0245; GCN-NEXT:    global_store_dword v[0:1], v0, off246; GCN-NEXT:    s_waitcnt vmcnt(0)247; GCN-NEXT:    s_mov_b32 s32, s34248; GCN-NEXT:    s_mov_b32 s34, s8249; GCN-NEXT:    s_mov_b32 s33, s7250; GCN-NEXT:    s_setpc_b64 s[30:31]251entry:252  %cond = icmp eq i32 %arg.cond, 0253  br i1 %cond, label %bb.0, label %bb.1254 255bb.0:256  %alloca = alloca [16 x i32], align 64, addrspace(5)257  %gep1 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 1258  store i32 0, ptr addrspace(5) %alloca259  store i32 1, ptr addrspace(5) %gep1260  %gep2 = getelementptr [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %in261  %load = load i32, ptr addrspace(5) %gep2262  %tid = call i32 @llvm.amdgcn.workitem.id.x()263  %add = add i32 %load, %tid264  store i32 %add, ptr addrspace(1) %out265  br label %bb.1266 267bb.1:268  store volatile i32 0, ptr addrspace(1) poison269  ret void270}271 272declare i32 @llvm.amdgcn.workitem.id.x() #0273 274attributes #0 = { nounwind readnone speculatable }275 276;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:277; ASSUME1024: {{.*}}278; DEFAULTSIZE: {{.*}}279