170 lines · plain
1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a < %s | FileCheck %s2 3; Recursion: foo -> bar -> baz -> qux -> foo4 5; CHECK-LABEL: {{^}}qux6; CHECK: .set qux.num_vgpr, max(71, foo.num_vgpr)7; CHECK: .set qux.num_agpr, max(0, foo.num_agpr)8; CHECK: .set qux.numbered_sgpr, max(46, foo.numbered_sgpr)9; CHECK: .set qux.private_seg_size, 1610; CHECK: .set qux.uses_vcc, or(1, foo.uses_vcc)11; CHECK: .set qux.uses_flat_scratch, or(0, foo.uses_flat_scratch)12; CHECK: .set qux.has_dyn_sized_stack, or(0, foo.has_dyn_sized_stack)13; CHECK: .set qux.has_recursion, or(1, foo.has_recursion)14; CHECK: .set qux.has_indirect_call, or(0, foo.has_indirect_call)15 16; CHECK-LABEL: {{^}}baz17; CHECK: .set baz.num_vgpr, max(61, qux.num_vgpr)18; CHECK: .set baz.num_agpr, max(0, qux.num_agpr)19; CHECK: .set baz.numbered_sgpr, max(51, qux.numbered_sgpr)20; CHECK: .set baz.private_seg_size, 16+max(qux.private_seg_size)21; CHECK: .set baz.uses_vcc, or(1, qux.uses_vcc)22; CHECK: .set baz.uses_flat_scratch, or(0, qux.uses_flat_scratch)23; CHECK: .set baz.has_dyn_sized_stack, or(0, qux.has_dyn_sized_stack)24; CHECK: .set baz.has_recursion, or(1, qux.has_recursion)25; CHECK: .set baz.has_indirect_call, or(0, qux.has_indirect_call)26 27; CHECK-LABEL: {{^}}bar28; CHECK: .set bar.num_vgpr, max(51, baz.num_vgpr)29; CHECK: .set bar.num_agpr, max(0, baz.num_agpr)30; CHECK: .set bar.numbered_sgpr, max(61, baz.numbered_sgpr)31; CHECK: .set bar.private_seg_size, 16+max(baz.private_seg_size)32; CHECK: .set bar.uses_vcc, or(1, baz.uses_vcc)33; CHECK: .set bar.uses_flat_scratch, or(0, baz.uses_flat_scratch)34; CHECK: .set bar.has_dyn_sized_stack, or(0, baz.has_dyn_sized_stack)35; CHECK: .set bar.has_recursion, or(1, baz.has_recursion)36; CHECK: .set bar.has_indirect_call, or(0, baz.has_indirect_call)37 38; CHECK-LABEL: {{^}}foo39; CHECK: .set foo.num_vgpr, max(46, 71)40; CHECK: .set foo.num_agpr, max(0, 0)41; CHECK: .set foo.numbered_sgpr, max(71, 61)42; CHECK: .set foo.private_seg_size, 1643; CHECK: .set foo.uses_vcc, 144; CHECK: .set foo.uses_flat_scratch, 045; CHECK: .set foo.has_dyn_sized_stack, 046; CHECK: .set foo.has_recursion, 147; CHECK: .set foo.has_indirect_call, 048 49define void @foo() {50entry:51 call void @bar()52 call void asm sideeffect "", "~{v45}"()53 call void asm sideeffect "", "~{s70}"()54 ret void55}56 57define void @bar() {58entry:59 call void @baz()60 call void asm sideeffect "", "~{v50}"()61 call void asm sideeffect "", "~{s60}"()62 ret void63}64 65define void @baz() {66entry:67 call void @qux()68 call void asm sideeffect "", "~{v60}"()69 call void asm sideeffect "", "~{s50}"()70 ret void71}72 73define void @qux() {74entry:75 call void @foo()76 call void asm sideeffect "", "~{v70}"()77 call void asm sideeffect "", "~{s45}"()78 ret void79}80 81; CHECK-LABEL: {{^}}usefoo82; CHECK: .set usefoo.num_vgpr, max(32, foo.num_vgpr)83; CHECK: .set usefoo.num_agpr, max(0, foo.num_agpr)84; CHECK: .set usefoo.numbered_sgpr, max(33, foo.numbered_sgpr)85; CHECK: .set usefoo.private_seg_size, 0+max(foo.private_seg_size)86; CHECK: .set usefoo.uses_vcc, or(1, foo.uses_vcc)87; CHECK: .set usefoo.uses_flat_scratch, or(1, foo.uses_flat_scratch)88; CHECK: .set usefoo.has_dyn_sized_stack, or(0, foo.has_dyn_sized_stack)89; CHECK: .set usefoo.has_recursion, or(1, foo.has_recursion)90; CHECK: .set usefoo.has_indirect_call, or(0, foo.has_indirect_call)91define amdgpu_kernel void @usefoo() {92 call void @foo()93 ret void94}95 96; Recursion: A -> B -> C -> A && C -> D -> C97 98; CHECK-LABEL: {{^}}D99; CHECK: .set D.num_vgpr, max(71, C.num_vgpr)100; CHECK: .set D.num_agpr, max(0, C.num_agpr)101; CHECK: .set D.numbered_sgpr, max(71, C.numbered_sgpr)102; CHECK: .set D.private_seg_size, 16+max(C.private_seg_size)103; CHECK: .set D.uses_vcc, or(1, C.uses_vcc)104; CHECK: .set D.uses_flat_scratch, or(0, C.uses_flat_scratch)105; CHECK: .set D.has_dyn_sized_stack, or(0, C.has_dyn_sized_stack)106; CHECK: .set D.has_recursion, or(1, C.has_recursion)107; CHECK: .set D.has_indirect_call, or(0, C.has_indirect_call)108 109; CHECK-LABEL: {{^}}C110; CHECK: .set C.num_vgpr, max(42, A.num_vgpr, 71)111; CHECK: .set C.num_agpr, max(0, A.num_agpr, 0)112; CHECK: .set C.numbered_sgpr, max(71, A.numbered_sgpr, 71)113; CHECK: .set C.private_seg_size, 16+max(A.private_seg_size)114; CHECK: .set C.uses_vcc, or(1, A.uses_vcc)115; CHECK: .set C.uses_flat_scratch, or(0, A.uses_flat_scratch)116; CHECK: .set C.has_dyn_sized_stack, or(0, A.has_dyn_sized_stack)117; CHECK: .set C.has_recursion, or(1, A.has_recursion)118; CHECK: .set C.has_indirect_call, or(0, A.has_indirect_call)119 120; CHECK-LABEL: {{^}}B121; CHECK: .set B.num_vgpr, max(42, C.num_vgpr)122; CHECK: .set B.num_agpr, max(0, C.num_agpr)123; CHECK: .set B.numbered_sgpr, max(71, C.numbered_sgpr)124; CHECK: .set B.private_seg_size, 16+max(C.private_seg_size)125; CHECK: .set B.uses_vcc, or(1, C.uses_vcc)126; CHECK: .set B.uses_flat_scratch, or(0, C.uses_flat_scratch)127; CHECK: .set B.has_dyn_sized_stack, or(0, C.has_dyn_sized_stack)128; CHECK: .set B.has_recursion, or(1, C.has_recursion)129; CHECK: .set B.has_indirect_call, or(0, C.has_indirect_call)130 131; CHECK-LABEL: {{^}}A132; CHECK: .set A.num_vgpr, max(42, 71)133; CHECK: .set A.num_agpr, max(0, 0)134; CHECK: .set A.numbered_sgpr, max(71, 71)135; CHECK: .set A.private_seg_size, 16136; CHECK: .set A.uses_vcc, 1137; CHECK: .set A.uses_flat_scratch, 0138; CHECK: .set A.has_dyn_sized_stack, 0139; CHECK: .set A.has_recursion, 1140; CHECK: .set A.has_indirect_call, 0141 142define void @A() {143 call void @B()144 call void asm sideeffect "", "~{v10}"()145 call void asm sideeffect "", "~{s50}"()146 ret void147}148 149define void @B() {150 call void @C()151 call void asm sideeffect "", "~{v20}"()152 call void asm sideeffect "", "~{s30}"()153 ret void154}155 156define void @C() {157 call void @A()158 call void @D()159 call void asm sideeffect "", "~{v30}"()160 call void asm sideeffect "", "~{s40}"()161 ret void162}163 164define void @D() {165 call void @C()166 call void asm sideeffect "", "~{v70}"()167 call void asm sideeffect "", "~{s70}"()168 ret void169}170