[clang] [llvm] [AMDGPU] Convert AMDGPUResourceUsageAnalysis pass from Module to MF pass (PR #102913)
Scott Linder via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 23 14:36:28 PDT 2024
================
@@ -1755,6 +1755,56 @@ As part of the AMDGPU MC layer, AMDGPU provides the following target specific
=================== ================= ========================================================
+Function Resource Usage
+-----------------------
+
+The function resource information (e.g., number of VGPRs) required depends on
+all of its callees' function resources. The expression to denote these
+resources should, therefore, be described as the propagative of its callees'
+equivalent expressions. Said expressions are generated and emitted (as symbols)
+by the compiler when compiling to either assembly or object format and should
+not be overwritten or redefined.
+
+The following describes all emitted function resource usage information:
+
+ .. table:: Function Resource Usage:
+ :name: function-usage-table
+
+ ===================================== ========= ========================================= ===============================================================================
+ Symbol Type Description Example
+ ===================================== ========= ========================================= ===============================================================================
+ <function_name>.num_vgpr Integer Number of VGPRs used by <function_name>, .set foo.num_vgpr, max(32, bar.num_vgpr, baz.num_vgpr)
+ worst case of itself and its callees'
+ VGPR use
+ <function_name>.num_agpr Integer Number of AGPRs used by <function_name>, .set foo.num_agpr, max(35, bar.num_agpr)
+ worst case of itself and its callees'
+ AGPR use
+ <function_name>.numbered_sgpr Integer Number of SGPRs used by <function_name>, .set foo.num_sgpr, 21
+ worst case of itself and its callees'
+ SGPR use (without any of the implicitly
+ used SGPRs)
+ <function_name>.private_seg_size Integer Total stack size required for .set foo.private_seg_size, 16+max(bar.private_seg_size, baz.private_seg_size)
+ <function_name>, expression is the
+ locally used stack size + the worst case
+ callee
+ <function_name>.uses_vcc Bool Whether <function_name>, or any of its .set foo.uses_vcc, or(0, bar.uses_vcc)
+ callees, uses vcc or not
+ <function_name>.uses_flat_scratch Bool Whether <function_name>, or any of its .set foo.uses_flat_scratch, 1
+ callees, uses flat scratch or not
+ <function_name>.has_dyn_sized_stack Bool Whether <function_name> stack is .set foo.has_dyn_sized_stack, 1
+ dynamically sized
+ <function_name>.has_recursion Bool Whether <function_name>, or any of its .set foo.has_recursion, 0
+ callees, contains recursion
+ <function_name>.has_indirect_call Bool Whether <function_name>, or any of its .set foo.has_indirect_call, max(0, bar.has_indirect_call)
+ callees, contains an indirect call
+ ===================================== ========= ========================================= ===============================================================================
+
+Futhermore, three symbols are additionally emitted describing the compilation
+unit's worst case (i.e, maxima) ``num_vgpr``, ``num_agpr``, and
+``numbered_sgpr`` which may be referenced and used by the aforementioned
+symbolic expressions. These three symbols are ``max_num_vgpr``,
----------------
slinder1 wrote:
I didn't notice these symbols before, but do we want to also prefix these to reduce the chance for collisions? What about `.amdgcn.max_*`, to match the existing `.set .amdgcn.next_free_*` symbols?
https://github.com/llvm/llvm-project/pull/102913
More information about the llvm-commits
mailing list