Index: llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -908,7 +908,8 @@ // anything to disable it if we know the stack isn't used here. We may still // have emitted code reading it to initialize scratch, but if that's unused // reading garbage should be OK. - const bool EnablePrivateSegment = ProgInfo.ScratchBlocks > 0; + const bool EnablePrivateSegment = + ProgInfo.ScratchBlocks > 0 || ProgInfo.DynamicCallStack; ProgInfo.ComputePGMRSrc2 = S_00B84C_SCRATCH_EN(EnablePrivateSegment) | S_00B84C_USER_SGPR(MFI->getNumUserSGPRs()) | Index: llvm/test/CodeGen/AMDGPU/enable-scratch-only-dynamic-stack.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AMDGPU/enable-scratch-only-dynamic-stack.ll @@ -0,0 +1,20 @@ +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=5 < %s | FileCheck -check-prefixes=GCN,COV5 %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=4 < %s | FileCheck -check-prefixes=GCN,COV4 %s + +@gv.fptr0 = external hidden unnamed_addr addrspace(4) constant ptr, align 4 + +; No stack objects, only indirect call has to enable scrathch +; GCN-LABEL: test_indirect_call: + +; COV5: .amdhsa_private_segment_fixed_size 0{{$}} +; COV4: .amdhsa_private_segment_fixed_size 16384{{$}} + +; GCN: .amdhsa_user_sgpr_private_segment_buffer 1 + +; COV5: .amdhsa_uses_dynamic_stack 1 +; GCN: .amdhsa_system_sgpr_private_segment_wavefront_offset 1 +define amdgpu_kernel void @test_indirect_call() { + %fptr = load ptr, ptr addrspace(4) @gv.fptr0 + call void %fptr() + ret void +}