1*fe6060f1SDimitry Andric //===- AMDGPUResourceUsageAnalysis.h ---- analysis of resources -*- C++ -*-===// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric // 9*fe6060f1SDimitry Andric /// \file 10*fe6060f1SDimitry Andric /// \brief Analyzes how many registers and other resources are used by 11*fe6060f1SDimitry Andric /// functions. 12*fe6060f1SDimitry Andric /// 13*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 14*fe6060f1SDimitry Andric 15*fe6060f1SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H 16*fe6060f1SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H 17*fe6060f1SDimitry Andric 18*fe6060f1SDimitry Andric #include "llvm/Analysis/CallGraphSCCPass.h" 19*fe6060f1SDimitry Andric #include "llvm/CodeGen/MachineModuleInfo.h" 20*fe6060f1SDimitry Andric #include "llvm/IR/ValueMap.h" 21*fe6060f1SDimitry Andric 22*fe6060f1SDimitry Andric namespace llvm { 23*fe6060f1SDimitry Andric 24*fe6060f1SDimitry Andric class GCNSubtarget; 25*fe6060f1SDimitry Andric class MachineFunction; 26*fe6060f1SDimitry Andric class TargetMachine; 27*fe6060f1SDimitry Andric 28*fe6060f1SDimitry Andric struct AMDGPUResourceUsageAnalysis : public CallGraphSCCPass { 29*fe6060f1SDimitry Andric static char ID; 30*fe6060f1SDimitry Andric 31*fe6060f1SDimitry Andric public: 32*fe6060f1SDimitry Andric // Track resource usage for callee functions. 33*fe6060f1SDimitry Andric struct SIFunctionResourceInfo { 34*fe6060f1SDimitry Andric // Track the number of explicitly used VGPRs. Special registers reserved at 35*fe6060f1SDimitry Andric // the end are tracked separately. 36*fe6060f1SDimitry Andric int32_t NumVGPR = 0; 37*fe6060f1SDimitry Andric int32_t NumAGPR = 0; 38*fe6060f1SDimitry Andric int32_t NumExplicitSGPR = 0; 39*fe6060f1SDimitry Andric uint64_t PrivateSegmentSize = 0; 40*fe6060f1SDimitry Andric bool UsesVCC = false; 41*fe6060f1SDimitry Andric bool UsesFlatScratch = false; 42*fe6060f1SDimitry Andric bool HasDynamicallySizedStack = false; 43*fe6060f1SDimitry Andric bool HasRecursion = false; 44*fe6060f1SDimitry Andric bool HasIndirectCall = false; 45*fe6060f1SDimitry Andric 46*fe6060f1SDimitry Andric int32_t getTotalNumSGPRs(const GCNSubtarget &ST) const; 47*fe6060f1SDimitry Andric int32_t getTotalNumVGPRs(const GCNSubtarget &ST) const; 48*fe6060f1SDimitry Andric }; 49*fe6060f1SDimitry Andric 50*fe6060f1SDimitry Andric AMDGPUResourceUsageAnalysis() : CallGraphSCCPass(ID) {} 51*fe6060f1SDimitry Andric 52*fe6060f1SDimitry Andric bool runOnSCC(CallGraphSCC &SCC) override; 53*fe6060f1SDimitry Andric 54*fe6060f1SDimitry Andric bool doInitialization(CallGraph &CG) override { 55*fe6060f1SDimitry Andric CallGraphResourceInfo.clear(); 56*fe6060f1SDimitry Andric return CallGraphSCCPass::doInitialization(CG); 57*fe6060f1SDimitry Andric } 58*fe6060f1SDimitry Andric 59*fe6060f1SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 60*fe6060f1SDimitry Andric AU.addRequired<MachineModuleInfoWrapperPass>(); 61*fe6060f1SDimitry Andric AU.setPreservesAll(); 62*fe6060f1SDimitry Andric } 63*fe6060f1SDimitry Andric 64*fe6060f1SDimitry Andric const SIFunctionResourceInfo &getResourceInfo(const Function *F) const { 65*fe6060f1SDimitry Andric auto Info = CallGraphResourceInfo.find(F); 66*fe6060f1SDimitry Andric assert(Info != CallGraphResourceInfo.end() && 67*fe6060f1SDimitry Andric "Failed to find resource info for function"); 68*fe6060f1SDimitry Andric return Info->getSecond(); 69*fe6060f1SDimitry Andric } 70*fe6060f1SDimitry Andric 71*fe6060f1SDimitry Andric private: 72*fe6060f1SDimitry Andric SIFunctionResourceInfo analyzeResourceUsage(const MachineFunction &MF, 73*fe6060f1SDimitry Andric const TargetMachine &TM) const; 74*fe6060f1SDimitry Andric void propagateIndirectCallRegisterUsage(); 75*fe6060f1SDimitry Andric 76*fe6060f1SDimitry Andric DenseMap<const Function *, SIFunctionResourceInfo> CallGraphResourceInfo; 77*fe6060f1SDimitry Andric }; 78*fe6060f1SDimitry Andric } // namespace llvm 79*fe6060f1SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H 80