[llvm] ef906f2 - AMDGPU: Fix assertion when printing unreachable functions

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 29 06:14:28 PDT 2022


Author: Matt Arsenault
Date: 2022-07-29T08:57:43-04:00
New Revision: ef906f287e7d9ae318d4dec8d1516bf039aa1f32

URL: https://github.com/llvm/llvm-project/commit/ef906f287e7d9ae318d4dec8d1516bf039aa1f32
DIFF: https://github.com/llvm/llvm-project/commit/ef906f287e7d9ae318d4dec8d1516bf039aa1f32.diff

LOG: AMDGPU: Fix assertion when printing unreachable functions

Since 814a0abccefdd2e52b1b507f21ce842b689dbedd, 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.

Added: 
    llvm/test/CodeGen/AMDGPU/resource-usage-dead-function.ll

Modified: 
    llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
index f7f93c75c870..bacf45639a77 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
@@ -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();
 

diff  --git a/llvm/test/CodeGen/AMDGPU/resource-usage-dead-function.ll b/llvm/test/CodeGen/AMDGPU/resource-usage-dead-function.ll
new file mode 100644
index 000000000000..f1b4b0383e3a
--- /dev/null
+++ b/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.
+
+ at 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
+}


        


More information about the llvm-commits mailing list