================ @@ -0,0 +1,220 @@ +//===- AMDGPUMCResourceInfo.cpp --- MC Resource Info ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +/// \file +/// \brief MC infrastructure to propagate the function level resource usage +/// info. +/// +//===----------------------------------------------------------------------===// + +#include "AMDGPUMCResourceInfo.h" +#include "Utils/AMDGPUBaseInfo.h" +#include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCSymbol.h" + +using namespace llvm; + +MCSymbol *MCResourceInfo::getSymbol(StringRef FuncName, ResourceInfoKind RIK) { + switch (RIK) { + case RIK_NumVGPR: + return OutContext.getOrCreateSymbol(FuncName + Twine(".num_vgpr")); + case RIK_NumAGPR: + return OutContext.getOrCreateSymbol(FuncName + Twine(".num_agpr")); + case RIK_NumSGPR: + return OutContext.getOrCreateSymbol(FuncName + Twine(".num_sgpr")); + case RIK_PrivateSegSize: + return OutContext.getOrCreateSymbol(FuncName + Twine(".private_seg_size")); + case RIK_UsesVCC: + return OutContext.getOrCreateSymbol(FuncName + Twine(".uses_vcc")); + case RIK_UsesFlatScratch: + return OutContext.getOrCreateSymbol(FuncName + Twine(".uses_flat_scratch")); + case RIK_HasDynSizedStack: + return OutContext.getOrCreateSymbol(FuncName + + Twine(".has_dyn_sized_stack")); + case RIK_HasRecursion: + return OutContext.getOrCreateSymbol(FuncName + Twine(".has_recursion")); + case RIK_HasIndirectCall: + return OutContext.getOrCreateSymbol(FuncName + Twine(".has_indirect_call")); + } + llvm_unreachable("Unexpected ResourceInfoKind."); +} + +const MCExpr *MCResourceInfo::getSymRefExpr(StringRef FuncName, + ResourceInfoKind RIK, + MCContext &Ctx) { + return MCSymbolRefExpr::create(getSymbol(FuncName, RIK), Ctx); +} + +void MCResourceInfo::assignMaxRegs() { + // Assign expression to get the max register use to the max_num_Xgpr symbol. + MCSymbol *MaxVGPRSym = getMaxVGPRSymbol(); + MCSymbol *MaxAGPRSym = getMaxAGPRSymbol(); + MCSymbol *MaxSGPRSym = getMaxSGPRSymbol(); + + auto assignMaxRegSym = [this](MCSymbol *Sym, int32_t RegCount) { + const MCExpr *MaxExpr = MCConstantExpr::create(RegCount, OutContext); + Sym->setVariableValue(MaxExpr); + }; + + assignMaxRegSym(MaxVGPRSym, MaxVGPR); + assignMaxRegSym(MaxAGPRSym, MaxAGPR); + assignMaxRegSym(MaxSGPRSym, MaxSGPR); +} + +void MCResourceInfo::finalize() { + assert(!finalized && "Cannot finalize ResourceInfo again."); + finalized = true; + assignMaxRegs(); +} + +MCSymbol *MCResourceInfo::getMaxVGPRSymbol() { + return OutContext.getOrCreateSymbol("max_num_vgpr"); +} + +MCSymbol *MCResourceInfo::getMaxAGPRSymbol() { + return OutContext.getOrCreateSymbol("max_num_agpr"); +} + +MCSymbol *MCResourceInfo::getMaxSGPRSymbol() { + return OutContext.getOrCreateSymbol("max_num_sgpr"); +} + +void MCResourceInfo::assignResourceInfoExpr( + int64_t localValue, ResourceInfoKind RIK, AMDGPUMCExpr::VariantKind Kind, + const MachineFunction &MF, + const SmallVectorImpl<const Function *> &Callees) { + const MCConstantExpr *localConstExpr = + MCConstantExpr::create(localValue, OutContext); + const MCExpr *SymVal = localConstExpr; + if (!Callees.empty()) { + SmallVector<const MCExpr *, 8> ArgExprs; + // Avoid recursive symbol assignment. + SmallSet<StringRef, 8> Seen; + ArgExprs.push_back(localConstExpr); + Seen.insert(MF.getName()); ---------------- slinder1 wrote:
Is there not a guarantee that the mapping from MF<->name is 1:1 ? A SmallPtrSet<const Function *> would avoid string comparisons https://github.com/llvm/llvm-project/pull/102913 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits