91 lines · plain
1; RUN: sed 's/CODE_OBJECT_VERSION/400/g' %s | llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 | FileCheck %s2; RUN: sed 's/CODE_OBJECT_VERSION/500/g' %s | llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 | FileCheck -check-prefixes=V5 %s3; RUN: sed 's/CODE_OBJECT_VERSION/600/g' %s | llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 | FileCheck -check-prefixes=V5 %s4 5; CHECK-LABEL: {{^}}recursive:6; CHECK: .set recursive.private_seg_size, 16+max(16384)7; CHECK: ScratchSize: 168 9; V5-LABEL: {{^}}recursive:10; V5: .set recursive.has_recursion, 111define void @recursive() {12 call void @recursive()13 store volatile i32 0, ptr addrspace(1) poison14 ret void15}16 17; CHECK-LABEL: {{^}}tail_recursive:18; CHECK: .set tail_recursive.private_seg_size, 019; CHECK: ScratchSize: 020define void @tail_recursive() {21 tail call void @tail_recursive()22 ret void23}24 25; CHECK: .set calls_tail_recursive.private_seg_size, 0+max(tail_recursive.private_seg_size)26define void @calls_tail_recursive() norecurse {27 tail call void @tail_recursive()28 ret void29}30 31; CHECK-LABEL: {{^}}tail_recursive_with_stack:32; CHECK: .set tail_recursive_with_stack.private_seg_size, 833; CHECK: .set tail_recursive_with_stack.has_recursion, 134define void @tail_recursive_with_stack() {35 %alloca = alloca i32, addrspace(5)36 store volatile i32 0, ptr addrspace(5) %alloca37 tail call void @tail_recursive_with_stack()38 ret void39}40 41; For an arbitrary recursive call, report a large number for unknown stack42; usage for code object v4 and older43; CHECK-LABEL: {{^}}calls_recursive:44; CHECK: .set calls_recursive.private_seg_size, 0+max(16384, recursive.private_seg_size)45;46; V5-LABEL: {{^}}calls_recursive:47; V5: .set calls_recursive.private_seg_size, 0+max(recursive.private_seg_size)48; V5: .set calls_recursive.has_dyn_sized_stack, or(0, recursive.has_dyn_sized_stack)49define amdgpu_kernel void @calls_recursive() {50 call void @recursive()51 ret void52}53 54; Make sure we do not report a huge stack size for tail recursive55; functions56; CHECK-LABEL: {{^}}kernel_indirectly_calls_tail_recursive:57; CHECK: .set kernel_indirectly_calls_tail_recursive.private_seg_size, 0+max(calls_tail_recursive.private_seg_size)58define amdgpu_kernel void @kernel_indirectly_calls_tail_recursive() {59 call void @calls_tail_recursive()60 ret void61}62 63; TODO: Even though tail_recursive is only called as a tail call, we64; end up treating it as generally recursive call from the regular call65; in the kernel.66 67; CHECK-LABEL: {{^}}kernel_calls_tail_recursive:68; CHECK: .set kernel_calls_tail_recursive.private_seg_size, 0+max(16384, tail_recursive.private_seg_size)69;70; V5-LABEL: {{^}}kernel_calls_tail_recursive:71; V5: .set kernel_calls_tail_recursive.private_seg_size, 0+max(tail_recursive.private_seg_size)72; V5: .set kernel_calls_tail_recursive.has_recursion, or(1, tail_recursive.has_recursion)73define amdgpu_kernel void @kernel_calls_tail_recursive() {74 call void @tail_recursive()75 ret void76}77 78; CHECK-LABEL: {{^}}kernel_calls_tail_recursive_with_stack:79; CHECK: .set kernel_calls_tail_recursive_with_stack.private_seg_size, 0+max(16384, tail_recursive_with_stack.private_seg_size)80;81; V5-LABEL: {{^}}kernel_calls_tail_recursive_with_stack:82; V5: .set kernel_calls_tail_recursive_with_stack.private_seg_size, 0+max(tail_recursive_with_stack.private_seg_size)83; V5: .set kernel_calls_tail_recursive_with_stack.has_dyn_sized_stack, or(0, tail_recursive_with_stack.has_dyn_sized_stack)84define amdgpu_kernel void @kernel_calls_tail_recursive_with_stack() {85 call void @tail_recursive_with_stack()86 ret void87}88 89!llvm.module.flags = !{!0}90!0 = !{i32 1, !"amdhsa_code_object_version", i32 CODE_OBJECT_VERSION}91