brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · b605516 Raw
117 lines · c
1//===- AMDGPUMCResourceInfo.h ----- MC Resource Info --------------*- 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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file10/// \brief MC infrastructure to propagate the function level resource usage11/// info.12///13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMCRESOURCEINFO_H16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMCRESOURCEINFO_H17 18#include "AMDGPUResourceUsageAnalysis.h"19#include "MCTargetDesc/AMDGPUMCExpr.h"20 21namespace llvm {22 23class MCContext;24class MCSymbol;25class StringRef;26class MachineFunction;27 28class MCResourceInfo {29public:30  enum ResourceInfoKind {31    RIK_NumVGPR,32    RIK_NumAGPR,33    RIK_NumSGPR,34    RIK_NumNamedBarrier,35    RIK_PrivateSegSize,36    RIK_UsesVCC,37    RIK_UsesFlatScratch,38    RIK_HasDynSizedStack,39    RIK_HasRecursion,40    RIK_HasIndirectCall41  };42 43private:44  int32_t MaxVGPR = 0;45  int32_t MaxAGPR = 0;46  int32_t MaxSGPR = 0;47  int32_t MaxNamedBarrier = 0;48 49  // Whether the MCResourceInfo has been finalized through finalize(MCContext50  // &). Should only be called once, at the end of AsmPrinting to assign MaxXGPR51  // symbols to their final value.52  bool Finalized = false;53 54  void assignResourceInfoExpr(int64_t localValue, ResourceInfoKind RIK,55                              AMDGPUMCExpr::VariantKind Kind,56                              const MachineFunction &MF,57                              const SmallVectorImpl<const Function *> &Callees,58                              MCContext &OutContext);59 60  // Assigns expression for Max S/V/A-GPRs to the referenced symbols.61  void assignMaxRegs(MCContext &OutContext);62 63  // Take flattened max of cyclic function calls' knowns. For example, for64  // a cycle A->B->C->D->A, take max(A, B, C, D) for A and have B, C, D have the65  // propgated value from A.66  const MCExpr *flattenedCycleMax(MCSymbol *RecSym, ResourceInfoKind RIK,67                                  MCContext &OutContext);68 69public:70  MCResourceInfo() = default;71  void addMaxVGPRCandidate(int32_t candidate) {72    MaxVGPR = std::max(MaxVGPR, candidate);73  }74  void addMaxAGPRCandidate(int32_t candidate) {75    MaxAGPR = std::max(MaxAGPR, candidate);76  }77  void addMaxSGPRCandidate(int32_t candidate) {78    MaxSGPR = std::max(MaxSGPR, candidate);79  }80  void addMaxNamedBarrierCandidate(int32_t candidate) {81    MaxNamedBarrier = std::max(MaxNamedBarrier, candidate);82  }83 84  MCSymbol *getSymbol(StringRef FuncName, ResourceInfoKind RIK,85                      MCContext &OutContext, bool IsLocal);86  const MCExpr *getSymRefExpr(StringRef FuncName, ResourceInfoKind RIK,87                              MCContext &Ctx, bool IsLocal);88 89  void reset();90 91  // Resolves the final symbols that requires the inter-function resource info92  // to be resolved.93  void finalize(MCContext &OutContext);94 95  MCSymbol *getMaxVGPRSymbol(MCContext &OutContext);96  MCSymbol *getMaxAGPRSymbol(MCContext &OutContext);97  MCSymbol *getMaxSGPRSymbol(MCContext &OutContext);98  MCSymbol *getMaxNamedBarrierSymbol(MCContext &OutContext);99 100  /// AMDGPUResourceUsageAnalysis gathers resource usage on a per-function101  /// granularity. However, some resource info has to be assigned the call102  /// transitive maximum or accumulative. For example, if A calls B and B's VGPR103  /// usage exceeds A's, A should be assigned B's VGPR usage. Furthermore,104  /// functions with indirect calls should be assigned the module level maximum.105  void gatherResourceInfo(106      const MachineFunction &MF,107      const AMDGPUResourceUsageAnalysisWrapperPass::FunctionResourceInfo &FRI,108      MCContext &OutContext);109 110  const MCExpr *createTotalNumVGPRs(const MachineFunction &MF, MCContext &Ctx);111  const MCExpr *createTotalNumSGPRs(const MachineFunction &MF, bool hasXnack,112                                    MCContext &Ctx);113};114} // namespace llvm115 116#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMCRESOURCEINFO_H117