AMDGPU: Fix assertion when printing unreachable functions

Since 814a0abcce, this would break if we
had a function in the module that becomes dead in any codegen IR
pass. The function wasn't deleted since it was initially used in dead
code, but is detached from the call graph and doesn't appear in the PO
traversal. Do a second walk over the module to populate the resources
of any functions which weren't already processed.
This commit is contained in:
Matt Arsenault 2022-07-24 19:18:41 -04:00
parent a4834ad068
commit ef906f287e
2 changed files with 54 additions and 0 deletions

View File

@ -125,6 +125,26 @@ bool AMDGPUResourceUsageAnalysis::runOnModule(Module &M) {
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();

View File

@ -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
}