diff --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp @@ -104,19 +104,22 @@ MachineModuleInfo &MMI = getAnalysis().getMMI(); const TargetMachine &TM = TPC->getTM(); + const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo(); bool HasIndirectCall = false; CallGraph CG = CallGraph(M); auto End = po_end(&CG); - // By default, for code object v5 and later, track only the minimum scratch - // size - if (AMDGPU::getCodeObjectVersion(M) >= AMDGPU::AMDHSA_COV5) { - if (!AssumedStackSizeForDynamicSizeObjects.getNumOccurrences()) - AssumedStackSizeForDynamicSizeObjects = 0; - if (!AssumedStackSizeForExternalCall.getNumOccurrences()) + // By default, for code object v5 and later and PAL code object, track only + // the minimum scratch size + if ((STI.getTargetTriple().getOS() == Triple::AMDPAL || + AMDGPU::getCodeObjectVersion(M) >= AMDGPU::AMDHSA_COV5) && + !AssumedStackSizeForExternalCall.getNumOccurrences()) AssumedStackSizeForExternalCall = 0; - } + + if (AMDGPU::getCodeObjectVersion(M) >= AMDGPU::AMDHSA_COV5 && + !AssumedStackSizeForDynamicSizeObjects.getNumOccurrences()) + AssumedStackSizeForDynamicSizeObjects = 0; for (auto IT = po_begin(&CG); IT != End; ++IT) { Function *F = IT->getFunction(); diff --git a/llvm/test/CodeGen/AMDGPU/resource-usage-pal.ll b/llvm/test/CodeGen/AMDGPU/resource-usage-pal.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/resource-usage-pal.ll @@ -0,0 +1,12 @@ +; RUN llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck %s + +; CHECK: ScratchSize: 0 +define amdgpu_vs void @test() { +.entry: + %0 = call i64 @llvm.amdgcn.s.getpc() + %1 = inttoptr i64 %0 to ptr + call amdgpu_gfx void %1() + ret void +} + +declare i64 @llvm.amdgcn.s.getpc()