xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h (revision 9c77fb6aaa366cbabc80ee1b834bcfe4df135491)
1 //===- AMDGPUResourceUsageAnalysis.h ---- analysis of resources -*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// \brief Analyzes how many registers and other resources are used by
11 /// functions.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H
16 #define LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H
17 
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/CodeGen/MachineFunctionPass.h"
20 #include "llvm/IR/PassManager.h"
21 
22 namespace llvm {
23 
24 class GCNSubtarget;
25 class MachineFunction;
26 class GCNTargetMachine;
27 
28 struct AMDGPUResourceUsageAnalysisImpl {
29 public:
30   static char ID;
31   // Track resource usage for callee functions.
32   struct SIFunctionResourceInfo {
33     // Track the number of explicitly used VGPRs. Special registers reserved at
34     // the end are tracked separately.
35     int32_t NumVGPR = 0;
36     int32_t NumAGPR = 0;
37     int32_t NumExplicitSGPR = 0;
38     uint64_t CalleeSegmentSize = 0;
39     uint64_t PrivateSegmentSize = 0;
40     bool UsesVCC = false;
41     bool UsesFlatScratch = false;
42     bool HasDynamicallySizedStack = false;
43     bool HasRecursion = false;
44     bool HasIndirectCall = false;
45     SmallVector<const Function *, 16> Callees;
46   };
47 
48   SIFunctionResourceInfo
49   analyzeResourceUsage(const MachineFunction &MF,
50                        uint32_t AssumedStackSizeForDynamicSizeObjects,
51                        uint32_t AssumedStackSizeForExternalCall) const;
52 };
53 
54 struct AMDGPUResourceUsageAnalysisWrapperPass : public MachineFunctionPass {
55   using FunctionResourceInfo =
56       AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
57   FunctionResourceInfo ResourceInfo;
58 
59 public:
60   static char ID;
61   AMDGPUResourceUsageAnalysisWrapperPass() : MachineFunctionPass(ID) {}
62 
63   bool runOnMachineFunction(MachineFunction &MF) override;
64 
65   const FunctionResourceInfo &getResourceInfo() const { return ResourceInfo; }
66 
67   void getAnalysisUsage(AnalysisUsage &AU) const override {
68     AU.setPreservesAll();
69     MachineFunctionPass::getAnalysisUsage(AU);
70   }
71 };
72 
73 class AMDGPUResourceUsageAnalysis
74     : public AnalysisInfoMixin<AMDGPUResourceUsageAnalysis> {
75   friend AnalysisInfoMixin<AMDGPUResourceUsageAnalysis>;
76   static AnalysisKey Key;
77 
78   const GCNTargetMachine &TM;
79 
80 public:
81   using Result = AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
82   Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
83 
84   AMDGPUResourceUsageAnalysis(const GCNTargetMachine &TM_) : TM(TM_) {}
85 };
86 
87 } // namespace llvm
88 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H
89