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