diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp index f608a9a4f470f..3cb9825a64ff9 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp @@ -157,8 +157,12 @@ void MCResourceInfo::gatherResourceInfo( ArgExprs.push_back( MCConstantExpr::create(FRI.CalleeSegmentSize, OutContext)); - if (!FRI.HasIndirectCall) { - for (const Function *Callee : FRI.Callees) { + SmallPtrSet Seen; + Seen.insert(&MF.getFunction()); + for (const Function *Callee : FRI.Callees) { + if (!Seen.insert(Callee).second) + continue; + if (!Callee->isDeclaration()) { MCSymbol *calleeValSym = getSymbol(Callee->getName(), RIK_PrivateSegSize, OutContext); ArgExprs.push_back(MCSymbolRefExpr::create(calleeValSym, OutContext)); diff --git a/llvm/test/CodeGen/AMDGPU/function-resource-usage.ll b/llvm/test/CodeGen/AMDGPU/function-resource-usage.ll index 9e3264eb9c07f..d3a6b4e01ebfb 100644 --- a/llvm/test/CodeGen/AMDGPU/function-resource-usage.ll +++ b/llvm/test/CodeGen/AMDGPU/function-resource-usage.ll @@ -358,7 +358,7 @@ declare void @external() #0 ; GCN: .set multi_call_with_external.num_vgpr, max(41, amdgpu.max_num_vgpr) ; GCN: .set multi_call_with_external.num_agpr, max(0, amdgpu.max_num_agpr) ; GCN: .set multi_call_with_external.numbered_sgpr, max(42, amdgpu.max_num_sgpr) -; GCN: .set multi_call_with_external.private_seg_size, 0 +; GCN: .set multi_call_with_external.private_seg_size, 0+(max(use_stack0.private_seg_size, use_stack1.private_seg_size)) ; GCN: .set multi_call_with_external.uses_vcc, 1 ; GCN: .set multi_call_with_external.uses_flat_scratch, 1 ; GCN: .set multi_call_with_external.has_dyn_sized_stack, 1 @@ -366,7 +366,7 @@ declare void @external() #0 ; GCN: .set multi_call_with_external.has_indirect_call, 1 ; GCN: TotalNumSgprs: multi_call_with_external.numbered_sgpr+6 ; GCN: NumVgprs: multi_call_with_external.num_vgpr -; GCN: ScratchSize: 0 +; GCN: ScratchSize: 2052 define amdgpu_kernel void @multi_call_with_external() #0 { call void @use_stack0() call void @use_stack1() @@ -374,6 +374,29 @@ define amdgpu_kernel void @multi_call_with_external() #0 { ret void } +; GCN-LABEL: {{^}}multi_call_with_external_and_duplicates: +; GCN: .set multi_call_with_external_and_duplicates.num_vgpr, max(41, amdgpu.max_num_vgpr) +; GCN: .set multi_call_with_external_and_duplicates.num_agpr, max(0, amdgpu.max_num_agpr) +; GCN: .set multi_call_with_external_and_duplicates.numbered_sgpr, max(44, amdgpu.max_num_sgpr) +; GCN: .set multi_call_with_external_and_duplicates.private_seg_size, 0+(max(use_stack0.private_seg_size, use_stack1.private_seg_size)) +; GCN: .set multi_call_with_external_and_duplicates.uses_vcc, 1 +; GCN: .set multi_call_with_external_and_duplicates.uses_flat_scratch, 1 +; GCN: .set multi_call_with_external_and_duplicates.has_dyn_sized_stack, 1 +; GCN: .set multi_call_with_external_and_duplicates.has_recursion, 0 +; GCN: .set multi_call_with_external_and_duplicates.has_indirect_call, 1 +; GCN: TotalNumSgprs: multi_call_with_external_and_duplicates.numbered_sgpr+6 +; GCN: NumVgprs: multi_call_with_external_and_duplicates.num_vgpr +; GCN: ScratchSize: 2052 +define amdgpu_kernel void @multi_call_with_external_and_duplicates() #0 { + call void @use_stack0() + call void @use_stack0() + call void @use_stack1() + call void @use_stack1() + call void @external() + call void @external() + ret void +} + ; GCN-LABEL: {{^}}usage_external: ; GCN: .set usage_external.num_vgpr, max(32, amdgpu.max_num_vgpr) ; GCN: .set usage_external.num_agpr, max(0, amdgpu.max_num_agpr)