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
22namespace llvm {
23
24class GCNSubtarget;
25class MachineFunction;
26class GCNTargetMachine;
27
28struct AMDGPUResourceUsageAnalysisImpl {
29public:
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 int32_t NumNamedBarrier = 0;
39 uint64_t CalleeSegmentSize = 0;
40 uint64_t PrivateSegmentSize = 0;
41 bool UsesVCC = false;
42 bool UsesFlatScratch = false;
43 bool HasDynamicallySizedStack = false;
44 bool HasRecursion = false;
45 bool HasIndirectCall = false;
46 bool HasNonChainIndirectCall = false;
47 SmallVector<const Function *, 16> Callees;
48 };
49
50 SIFunctionResourceInfo
51 analyzeResourceUsage(const MachineFunction &MF,
52 uint32_t AssumedStackSizeForDynamicSizeObjects,
53 uint32_t AssumedStackSizeForExternalCall) const;
54};
55
56struct AMDGPUResourceUsageAnalysisWrapperPass : public MachineFunctionPass {
57 using FunctionResourceInfo =
58 AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
59 FunctionResourceInfo ResourceInfo;
60
61public:
62 static char ID;
63 AMDGPUResourceUsageAnalysisWrapperPass() : MachineFunctionPass(ID) {}
64
65 bool runOnMachineFunction(MachineFunction &MF) override;
66
67 const FunctionResourceInfo &getResourceInfo() const { return ResourceInfo; }
68
69 void getAnalysisUsage(AnalysisUsage &AU) const override {
70 AU.setPreservesAll();
71 MachineFunctionPass::getAnalysisUsage(AU);
72 }
73};
74
75class AMDGPUResourceUsageAnalysis
76 : public AnalysisInfoMixin<AMDGPUResourceUsageAnalysis> {
77 friend AnalysisInfoMixin<AMDGPUResourceUsageAnalysis>;
78 static AnalysisKey Key;
79
80 const GCNTargetMachine &TM;
81
82public:
83 using Result = AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
84 Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
85
86 AMDGPUResourceUsageAnalysis(const GCNTargetMachine &TM_) : TM(TM_) {}
87};
88
89} // namespace llvm
90#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H
91