225 lines · plain
1; RUN: llc -mtriple=amdgcn -mcpu=gfx908 < %s | FileCheck -check-prefixes=GCN,GFX908 %s2; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX900 %s3 4; GCN-LABEL: {{^}}max_11_vgprs:5; GFX900-NOT: SCRATCH_RSRC6; GFX908-NOT: SCRATCH_RSRC7; GFX908-DAG: v_accvgpr_write_b32 [[A_REG:a[0-9]+]], v{{[0-9]}}8; GFX900-NOT: buffer_9; GFX908-NOT: buffer_10; GFX908-DAG: v_mov_b32_e32 v{{[0-9]}}, [[V_REG:v[0-9]+]]11; GFX908-DAG: v_accvgpr_read_b32 [[V_REG]], [[A_REG]]12 13; GFX900: NumVgprs: 1114; GFX908: NumVgprs: 1015; GFX900: ScratchSize: 016; GFX908: ScratchSize: 017; GCN: VGPRBlocks: 218; GFX900: NumVGPRsForWavesPerEU: 1119; GFX908: NumVGPRsForWavesPerEU: 1020define amdgpu_kernel void @max_11_vgprs(ptr addrspace(1) %p) #2 {21 %tid = load volatile i32, ptr addrspace(1) poison22 %p1 = getelementptr inbounds i32, ptr addrspace(1) %p, i32 %tid23 %p2 = getelementptr inbounds i32, ptr addrspace(1) %p1, i32 424 %p3 = getelementptr inbounds i32, ptr addrspace(1) %p2, i32 825 %p4 = getelementptr inbounds i32, ptr addrspace(1) %p3, i32 1226 %p5 = getelementptr inbounds i32, ptr addrspace(1) %p4, i32 1627 %p6 = getelementptr inbounds i32, ptr addrspace(1) %p5, i32 2028 %p7 = getelementptr inbounds i32, ptr addrspace(1) %p6, i32 2429 %p8 = getelementptr inbounds i32, ptr addrspace(1) %p7, i32 2830 %p9 = getelementptr inbounds i32, ptr addrspace(1) %p8, i32 3231 %p10 = getelementptr inbounds i32, ptr addrspace(1) %p9, i32 3632 %v1 = load volatile i32, ptr addrspace(1) %p133 %v2 = load volatile i32, ptr addrspace(1) %p234 %v3 = load volatile i32, ptr addrspace(1) %p335 %v4 = load volatile i32, ptr addrspace(1) %p436 %v5 = load volatile i32, ptr addrspace(1) %p537 %v6 = load volatile i32, ptr addrspace(1) %p638 %v7 = load volatile i32, ptr addrspace(1) %p739 %v8 = load volatile i32, ptr addrspace(1) %p840 %v9 = load volatile i32, ptr addrspace(1) %p941 %v10 = load volatile i32, ptr addrspace(1) %p1042 call void asm sideeffect "", "v,v,v,v,v,v,v,v,v,v"(i32 %v1, i32 %v2, i32 %v3, i32 %v4, i32 %v5, i32 %v6, i32 %v7, i32 %v8, i32 %v9, i32 %v10)43 store volatile i32 %v1, ptr addrspace(1) poison44 store volatile i32 %v2, ptr addrspace(1) poison45 store volatile i32 %v3, ptr addrspace(1) poison46 store volatile i32 %v4, ptr addrspace(1) poison47 store volatile i32 %v5, ptr addrspace(1) poison48 store volatile i32 %v6, ptr addrspace(1) poison49 store volatile i32 %v7, ptr addrspace(1) poison50 store volatile i32 %v8, ptr addrspace(1) poison51 store volatile i32 %v9, ptr addrspace(1) poison52 store volatile i32 %v10, ptr addrspace(1) poison53 ret void54}55 56; GCN-LABEL: {{^}}max_10_vgprs_spill_v32:57; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD058; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD159; GCN: buffer_store_dword v{{[0-9]}},60; GFX908-DAG: v_accvgpr_write_b32 a0, v{{[0-9]}}61; GFX908-DAG: v_accvgpr_write_b32 a9, v{{[0-9]}}62; GCN-NOT: a1063 64; GFX908: NumVgprs: 1065; GFX900: ScratchSize: 10066; GFX908: ScratchSize: 6867; GFX908: VGPRBlocks: 268; GFX908: NumVGPRsForWavesPerEU: 1069define amdgpu_kernel void @max_10_vgprs_spill_v32(ptr addrspace(1) %p) #0 {70 %tid = call i32 @llvm.amdgcn.workitem.id.x()71 %gep = getelementptr inbounds <32 x float>, ptr addrspace(1) %p, i32 %tid72 %v = load volatile <32 x float>, ptr addrspace(1) %gep73 store volatile <32 x float> %v, ptr addrspace(1) poison74 ret void75}76 77; GCN-LABEL: {{^}}max_256_vgprs_spill_9x32:78; GFX900-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD079; GFX900-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD180; GFX908-NOT: SCRATCH_RSRC81; GFX908-DAG: v_accvgpr_write_b32 a0, v82; GFX900: buffer_store_dword v83; GFX900: buffer_load_dword v84; GFX908-NOT: buffer_85; GFX908-DAG: v_accvgpr_read_b3286 87; GFX900: NumVgprs: 25688; GFX900: ScratchSize: 13289; GFX908: NumVgprs: 25290; GFX908: ScratchSize: 091; GFX900: VGPRBlocks: 6392; GFX908: VGPRBlocks: 6293; GFX900: NumVGPRsForWavesPerEU: 25694; GFX908: NumVGPRsForWavesPerEU: 25295define amdgpu_kernel void @max_256_vgprs_spill_9x32(ptr addrspace(1) %p) #1 {96 %tid = call i32 @llvm.amdgcn.workitem.id.x()97 %p1 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p, i32 %tid98 %p2 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p1, i32 %tid99 %p3 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p2, i32 %tid100 %p4 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p3, i32 %tid101 %p5 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p4, i32 %tid102 %p6 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p5, i32 %tid103 %p7 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p6, i32 %tid104 %p8 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p7, i32 %tid105 %p9 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p8, i32 %tid106 %v1 = load volatile <32 x float>, ptr addrspace(1) %p1107 %v2 = load volatile <32 x float>, ptr addrspace(1) %p2108 %v3 = load volatile <32 x float>, ptr addrspace(1) %p3109 %v4 = load volatile <32 x float>, ptr addrspace(1) %p4110 %v5 = load volatile <32 x float>, ptr addrspace(1) %p5111 %v6 = load volatile <32 x float>, ptr addrspace(1) %p6112 %v7 = load volatile <32 x float>, ptr addrspace(1) %p7113 %v8 = load volatile <32 x float>, ptr addrspace(1) %p8114 %v9 = load volatile <32 x float>, ptr addrspace(1) %p9115 store volatile <32 x float> %v1, ptr addrspace(1) poison116 store volatile <32 x float> %v2, ptr addrspace(1) poison117 store volatile <32 x float> %v3, ptr addrspace(1) poison118 store volatile <32 x float> %v4, ptr addrspace(1) poison119 store volatile <32 x float> %v5, ptr addrspace(1) poison120 store volatile <32 x float> %v6, ptr addrspace(1) poison121 store volatile <32 x float> %v7, ptr addrspace(1) poison122 store volatile <32 x float> %v8, ptr addrspace(1) poison123 store volatile <32 x float> %v9, ptr addrspace(1) poison124 ret void125}126 127; GCN-LABEL: {{^}}max_256_vgprs_spill_9x32_2bb:128; GFX900-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD0129; GFX900-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD1130; GFX908-NOT: SCRATCH_RSRC131; GFX908: v_accvgpr_write_b32132; GFX908: global_load_133; GFX900: buffer_store_dword v134; GFX900: buffer_load_dword v135; GFX908-NOT: buffer_136; GFX908-DAG: v_accvgpr_read_b32137 138; GFX900: NumVgprs: 256139; GFX908: NumVgprs: 254140; GFX900: ScratchSize: 132141; GFX908: ScratchSize: 0142; GFX900: VGPRBlocks: 63143; GFX908: VGPRBlocks: 63144; GFX900: NumVGPRsForWavesPerEU: 256145; GFX908: NumVGPRsForWavesPerEU: 254146define amdgpu_kernel void @max_256_vgprs_spill_9x32_2bb(ptr addrspace(1) %p) #1 {147 %tid = call i32 @llvm.amdgcn.workitem.id.x()148 %p1 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p, i32 %tid149 %p2 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p1, i32 %tid150 %p3 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p2, i32 %tid151 %p4 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p3, i32 %tid152 %p5 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p4, i32 %tid153 %p6 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p5, i32 %tid154 %p7 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p6, i32 %tid155 %p8 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p7, i32 %tid156 %p9 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p8, i32 %tid157 %v1 = load volatile <32 x float>, ptr addrspace(1) %p1158 %v2 = load volatile <32 x float>, ptr addrspace(1) %p2159 %v3 = load volatile <32 x float>, ptr addrspace(1) %p3160 %v4 = load volatile <32 x float>, ptr addrspace(1) %p4161 %v5 = load volatile <32 x float>, ptr addrspace(1) %p5162 %v6 = load volatile <32 x float>, ptr addrspace(1) %p6163 %v7 = load volatile <32 x float>, ptr addrspace(1) %p7164 %v8 = load volatile <32 x float>, ptr addrspace(1) %p8165 %v9 = load volatile <32 x float>, ptr addrspace(1) %p9166 br label %st167 168st:169 store volatile <32 x float> %v1, ptr addrspace(1) poison170 store volatile <32 x float> %v2, ptr addrspace(1) poison171 store volatile <32 x float> %v3, ptr addrspace(1) poison172 store volatile <32 x float> %v4, ptr addrspace(1) poison173 store volatile <32 x float> %v5, ptr addrspace(1) poison174 store volatile <32 x float> %v6, ptr addrspace(1) poison175 store volatile <32 x float> %v7, ptr addrspace(1) poison176 store volatile <32 x float> %v8, ptr addrspace(1) poison177 store volatile <32 x float> %v9, ptr addrspace(1) poison178 ret void179}180 181; Make sure there's no crash when we have loads from fixed stack182; objects and are processing VGPR spills183 184; GCN-LABEL: {{^}}stack_args_vgpr_spill:185; GFX908: buffer_load_dword v{{[0-9]+}}, off, s[0:3], s32186; GFX908: buffer_load_dword v{{[0-9]+}}, off, s[0:3], s32 offset:4187; GFX908: v_accvgpr_write_b32188define void @stack_args_vgpr_spill(<32 x float> %arg0, <32 x float> %arg1, ptr addrspace(1) %p) #1 {189 %tid = call i32 @llvm.amdgcn.workitem.id.x()190 %p1 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p, i32 %tid191 %p2 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p1, i32 %tid192 %p3 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p2, i32 %tid193 %p4 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p3, i32 %tid194 %p5 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p4, i32 %tid195 %p6 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p5, i32 %tid196 %p7 = getelementptr inbounds <32 x float>, ptr addrspace(1) %p6, i32 %tid197 %v1 = load volatile <32 x float>, ptr addrspace(1) %p1198 %v2 = load volatile <32 x float>, ptr addrspace(1) %p2199 %v3 = load volatile <32 x float>, ptr addrspace(1) %p3200 %v4 = load volatile <32 x float>, ptr addrspace(1) %p4201 %v5 = load volatile <32 x float>, ptr addrspace(1) %p5202 %v6 = load volatile <32 x float>, ptr addrspace(1) %p6203 %v7 = load volatile <32 x float>, ptr addrspace(1) %p7204 br label %st205 206st:207 store volatile <32 x float> %arg0, ptr addrspace(1) poison208 store volatile <32 x float> %arg1, ptr addrspace(1) poison209 store volatile <32 x float> %v1, ptr addrspace(1) poison210 store volatile <32 x float> %v2, ptr addrspace(1) poison211 store volatile <32 x float> %v3, ptr addrspace(1) poison212 store volatile <32 x float> %v4, ptr addrspace(1) poison213 store volatile <32 x float> %v5, ptr addrspace(1) poison214 store volatile <32 x float> %v6, ptr addrspace(1) poison215 store volatile <32 x float> %v7, ptr addrspace(1) poison216 ret void217}218 219 220declare i32 @llvm.amdgcn.workitem.id.x()221 222attributes #0 = { nounwind "amdgpu-num-vgpr"="10" }223attributes #1 = { "amdgpu-flat-work-group-size"="1,256" }224attributes #2 = { nounwind "amdgpu-num-vgpr"="11" }225