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,18 @@ 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+ LLVM_DEBUG ({
187+ if (!FRI.Callees .empty ()) {
188+ dbgs () << " MCResUse: Callees:\n " ;
189+ for (const Function *Callee : FRI.Callees ) {
190+ MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
191+ dbgs () << " MCResUse: " << CalleeFnSym->getName () << ' \n ' ;
192+ }
193+ }
194+ });
195+
175196 auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
176197 ResourceInfoKind RIK) {
177198 if (!FRI.HasIndirectCall ) {
@@ -184,9 +205,12 @@ void MCResourceInfo::gatherResourceInfo(
184205 const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
185206 {MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
186207 LocalNumSym->setVariableValue (MaxWithLocal);
208+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
209+ << " : Indirect callee within, using module maximum\n " );
187210 }
188211 };
189212
213+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << ' \n ' );
190214 SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
191215 SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
192216 SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -197,9 +221,13 @@ void MCResourceInfo::gatherResourceInfo(
197221 SmallVector<const MCExpr *, 8 > ArgExprs;
198222 MCSymbol *Sym =
199223 getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext, IsLocal);
200- if (FRI.CalleeSegmentSize )
224+ if (FRI.CalleeSegmentSize ) {
225+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
226+ << FRI.CalleeSegmentSize
227+ << " for indirect/recursive callees within\n " );
201228 ArgExprs.push_back (
202229 MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
230+ }
203231
204232 SmallPtrSet<const Function *, 8 > Seen;
205233 Seen.insert (&MF.getFunction ());
@@ -218,12 +246,17 @@ void MCResourceInfo::gatherResourceInfo(
218246 if (!CalleeValSym->isVariable () ||
219247 !CalleeValSym->getVariableValue (/* isUsed=*/ false )
220248 ->isSymbolUsedInExpression (Sym)) {
249+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
250+ << CalleeValSym->getName () << " as callee\n " );
221251 ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
222252 }
223253 }
224254 }
225255 const MCExpr *localConstExpr =
226256 MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
257+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
258+ << FRI.PrivateSegmentSize
259+ << " as function local usage\n " );
227260 if (!ArgExprs.empty ()) {
228261 const AMDGPUMCExpr *transitiveExpr =
229262 AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -235,6 +268,9 @@ void MCResourceInfo::gatherResourceInfo(
235268
236269 auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
237270 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal);
271+ LLVM_DEBUG (
272+ dbgs () << " MCResUse: " << Sym->getName () << " : Adding " << LocalValue
273+ << " , no further propagation as indirect callee found within\n " );
238274 Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
239275 };
240276
0 commit comments