1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck %s 2 3; CHECK-LABEL: {{^}}recursive: 4; CHECK: ScratchSize: 16 5define void @recursive() { 6 call void @recursive() 7 store volatile i32 0, i32 addrspace(1)* undef 8 ret void 9} 10 11; CHECK-LABEL: {{^}}tail_recursive: 12; CHECK: ScratchSize: 0 13define void @tail_recursive() { 14 tail call void @tail_recursive() 15 ret void 16} 17 18define void @calls_tail_recursive() norecurse { 19 tail call void @tail_recursive() 20 ret void 21} 22 23; CHECK-LABEL: {{^}}tail_recursive_with_stack: 24define void @tail_recursive_with_stack() { 25 %alloca = alloca i32, addrspace(5) 26 store volatile i32 0, i32 addrspace(5)* %alloca 27 tail call void @tail_recursive_with_stack() 28 ret void 29} 30 31; For an arbitrary recursive call, report a large number for unknown stack usage. 32; CHECK-LABEL: {{^}}calls_recursive: 33; CHECK: .amdhsa_private_segment_fixed_size 16400{{$}} 34define amdgpu_kernel void @calls_recursive() { 35 call void @recursive() 36 ret void 37} 38 39; Make sure we do not report a huge stack size for tail recursive 40; functions 41; CHECK-LABEL: {{^}}kernel_indirectly_calls_tail_recursive: 42; CHECK: .amdhsa_private_segment_fixed_size 0{{$}} 43define amdgpu_kernel void @kernel_indirectly_calls_tail_recursive() { 44 call void @calls_tail_recursive() 45 ret void 46} 47 48; TODO: Even though tail_recursive is only called as a tail call, we 49; end up treating it as generally recursive call from the regular call 50; in the kernel. 51 52; CHECK-LABEL: {{^}}kernel_calls_tail_recursive: 53; CHECK: .amdhsa_private_segment_fixed_size 16384{{$}} 54define amdgpu_kernel void @kernel_calls_tail_recursive() { 55 call void @tail_recursive() 56 ret void 57} 58 59; CHECK-LABEL: {{^}}kernel_calls_tail_recursive_with_stack: 60; CHECK: .amdhsa_private_segment_fixed_size 16384{{$}} 61define amdgpu_kernel void @kernel_calls_tail_recursive_with_stack() { 62 call void @tail_recursive_with_stack() 63 ret void 64} 65