Index: llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp +++ llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp @@ -125,6 +125,26 @@ HasIndirectCall |= Info.HasIndirectCall; } + // It's possible we have unreachable functions in the module which weren't + // visited by the PO traversal. Make sure we have some resource counts to + // report. + for (const auto &IT : CG) { + const Function *F = IT.first; + if (!F || F->isDeclaration()) + continue; + + auto CI = CallGraphResourceInfo.insert( + std::make_pair(F, SIFunctionResourceInfo())); + if (!CI.second) // Skip already visited functions + continue; + + SIFunctionResourceInfo &Info = CI.first->second; + MachineFunction *MF = MMI.getMachineFunction(*F); + assert(MF && "function must have been generated already"); + Info = analyzeResourceUsage(*MF, TM); + HasIndirectCall |= Info.HasIndirectCall; + } + if (HasIndirectCall) propagateIndirectCallRegisterUsage(); Index: llvm/test/CodeGen/AMDGPU/resource-usage-dead-function.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AMDGPU/resource-usage-dead-function.ll @@ -0,0 +1,34 @@ +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -o - %s | FileCheck -check-prefix=GCN %s + +; Make sure there's no assertion when trying to report the resource +; usage for a function which becomes dead during codegen. + +@gv.fptr0 = external hidden unnamed_addr addrspace(4) constant void()*, align 4 + +; GCN-LABEL: unreachable: +; Function info: +; codeLenInByte = 4 +define internal fastcc void @unreachable() { + %fptr = load void()*, void()* addrspace(4)* @gv.fptr0 + call void %fptr() + unreachable +} + + +; GCN-LABEL: entry: +; GCN-NOT: s_swappc_b64 +; GCN: s_endpgm + +; GCN: .amdhsa_private_segment_fixed_size 0 +; GCN: .amdhsa_uses_dynamic_stack 0 +define amdgpu_kernel void @entry() { +bb0: + br i1 false, label %bb1, label %bb2 + +bb1: + tail call fastcc void @unreachable() + unreachable + +bb2: + ret void +}