2020#include " llvm/MC/MCSymbol.h"
2121#include " llvm/Target/TargetMachine.h"
2222
23+ #define DEBUG_TYPE " amdgpu-mc-resource-usage"
24+
2325using namespace llvm ;
2426
2527MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
@@ -106,6 +108,8 @@ void MCResourceInfo::assignResourceInfoExpr(
106108 MCConstantExpr::create (LocalValue, OutContext);
107109 const MCExpr *SymVal = LocalConstExpr;
108110 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal);
111+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
112+ << LocalValue << " as function local usage\n " );
109113 if (!Callees.empty ()) {
110114 SmallVector<const MCExpr *, 8 > ArgExprs;
111115 SmallPtrSet<const Function *, 8 > Seen;
@@ -125,8 +129,13 @@ void MCResourceInfo::assignResourceInfoExpr(
125129 if (!CalleeValSym->isVariable () ||
126130 !CalleeValSym->getVariableValue (/* isUsed=*/ false )
127131 ->isSymbolUsedInExpression (Sym)) {
132+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
133+ << CalleeValSym->getName () << " as callee\n " );
128134 ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
129135 } else {
136+ LLVM_DEBUG (
137+ dbgs () << " MCResUse: " << Sym->getName ()
138+ << " : Recursion found, falling back to module maximum\n " );
130139 // In case of recursion: make sure to use conservative register counts
131140 // (i.e., specifically for VGPR/SGPR/AGPR).
132141 switch (RIK) {
@@ -172,6 +181,20 @@ void MCResourceInfo::gatherResourceInfo(
172181 const TargetMachine &TM = MF.getTarget ();
173182 MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
174183
184+ LLVM_DEBUG (dbgs () << " MCResUse: Gathering resource information for "
185+ << FnSym->getName () << " \n " );
186+ // clang-format off
187+ LLVM_DEBUG (
188+ if (!FRI.Callees .empty ()) {
189+ dbgs () << " MCResUse: Callees:\n " ;
190+ for (const Function *Callee : FRI.Callees ) {
191+ MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
192+ dbgs () << " MCResUse: " << CalleeFnSym->getName () << " \n " ;
193+ }
194+ }
195+ );
196+ // clang-format on
197+
175198 auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
176199 ResourceInfoKind RIK) {
177200 if (!FRI.HasIndirectCall ) {
@@ -184,9 +207,12 @@ void MCResourceInfo::gatherResourceInfo(
184207 const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
185208 {MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
186209 LocalNumSym->setVariableValue (MaxWithLocal);
210+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
211+ << " : Indirect callee within, using module maximum\n " );
187212 }
188213 };
189214
215+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << " \n " );
190216 SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
191217 SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
192218 SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -197,9 +223,13 @@ void MCResourceInfo::gatherResourceInfo(
197223 SmallVector<const MCExpr *, 8 > ArgExprs;
198224 MCSymbol *Sym =
199225 getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext, IsLocal);
200- if (FRI.CalleeSegmentSize )
226+ if (FRI.CalleeSegmentSize ) {
227+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
228+ << FRI.CalleeSegmentSize
229+ << " for indirect/recursive callees within\n " );
201230 ArgExprs.push_back (
202231 MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
232+ }
203233
204234 SmallPtrSet<const Function *, 8 > Seen;
205235 Seen.insert (&MF.getFunction ());
@@ -218,12 +248,17 @@ void MCResourceInfo::gatherResourceInfo(
218248 if (!CalleeValSym->isVariable () ||
219249 !CalleeValSym->getVariableValue (/* isUsed=*/ false )
220250 ->isSymbolUsedInExpression (Sym)) {
251+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
252+ << CalleeValSym->getName () << " as callee\n " );
221253 ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
222254 }
223255 }
224256 }
225257 const MCExpr *localConstExpr =
226258 MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
259+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
260+ << FRI.PrivateSegmentSize
261+ << " as function local usage\n " );
227262 if (!ArgExprs.empty ()) {
228263 const AMDGPUMCExpr *transitiveExpr =
229264 AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -235,6 +270,9 @@ void MCResourceInfo::gatherResourceInfo(
235270
236271 auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
237272 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal);
273+ LLVM_DEBUG (
274+ dbgs () << " MCResUse: " << Sym->getName () << " : Adding " << LocalValue
275+ << " , no further propagation as indirect callee found within\n " );
238276 Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
239277 };
240278
0 commit comments