1919#include " llvm/MC/MCSymbol.h"
2020#include " llvm/Target/TargetMachine.h"
2121
22+ #define DEBUG_TYPE " amdgpu-mc-resource-usage"
23+
2224using namespace llvm ;
2325
2426MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
@@ -101,6 +103,8 @@ void MCResourceInfo::assignResourceInfoExpr(
101103 MCConstantExpr::create (LocalValue, OutContext);
102104 const MCExpr *SymVal = LocalConstExpr;
103105 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
106+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
107+ << LocalValue << " as function local usage\n " );
104108 if (!Callees.empty ()) {
105109 SmallVector<const MCExpr *, 8 > ArgExprs;
106110 SmallPtrSet<const Function *, 8 > Seen;
@@ -119,8 +123,13 @@ void MCResourceInfo::assignResourceInfoExpr(
119123 if (!CalleeValSym->isVariable () ||
120124 !CalleeValSym->getVariableValue (/* isUsed=*/ false )
121125 ->isSymbolUsedInExpression (Sym)) {
126+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
127+ << CalleeValSym->getName () << " as callee\n " );
122128 ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
123129 } else {
130+ LLVM_DEBUG (
131+ dbgs () << " MCResUse: " << Sym->getName ()
132+ << " : Recursion found, falling back to module maximum\n " );
124133 // In case of recursion: make sure to use conservative register counts
125134 // (i.e., specifically for VGPR/SGPR/AGPR).
126135 switch (RIK) {
@@ -165,6 +174,20 @@ void MCResourceInfo::gatherResourceInfo(
165174 const TargetMachine &TM = MF.getTarget ();
166175 MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
167176
177+ LLVM_DEBUG (dbgs () << " MCResUse: Gathering resource information for "
178+ << FnSym->getName () << " \n " );
179+ // clang-format off
180+ LLVM_DEBUG (
181+ if (!FRI.Callees .empty ()) {
182+ dbgs () << " MCResUse: Callees:\n " ;
183+ for (const Function *Callee : FRI.Callees ) {
184+ MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
185+ dbgs () << " MCResUse: " << CalleeFnSym->getName () << " \n " ;
186+ }
187+ }
188+ );
189+ // clang-format on
190+
168191 auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
169192 ResourceInfoKind RIK) {
170193 if (!FRI.HasIndirectCall ) {
@@ -176,9 +199,12 @@ void MCResourceInfo::gatherResourceInfo(
176199 const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
177200 {MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
178201 LocalNumSym->setVariableValue (MaxWithLocal);
202+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
203+ << " : Indirect callee within, using module maximum\n " );
179204 }
180205 };
181206
207+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << " \n " );
182208 SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
183209 SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
184210 SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -188,9 +214,13 @@ void MCResourceInfo::gatherResourceInfo(
188214 // + max(FRI.Callees, FRI.CalleeSegmentSize)
189215 SmallVector<const MCExpr *, 8 > ArgExprs;
190216 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext);
191- if (FRI.CalleeSegmentSize )
217+ if (FRI.CalleeSegmentSize ) {
218+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
219+ << FRI.CalleeSegmentSize
220+ << " for indirect/recursive callees within\n " );
192221 ArgExprs.push_back (
193222 MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
223+ }
194224
195225 SmallPtrSet<const Function *, 8 > Seen;
196226 Seen.insert (&MF.getFunction ());
@@ -207,12 +237,17 @@ void MCResourceInfo::gatherResourceInfo(
207237 if (!CalleeValSym->isVariable () ||
208238 !CalleeValSym->getVariableValue (/* isUsed=*/ false )
209239 ->isSymbolUsedInExpression (Sym)) {
240+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
241+ << CalleeValSym->getName () << " as callee\n " );
210242 ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
211243 }
212244 }
213245 }
214246 const MCExpr *localConstExpr =
215247 MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
248+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
249+ << FRI.PrivateSegmentSize
250+ << " as function local usage\n " );
216251 if (!ArgExprs.empty ()) {
217252 const AMDGPUMCExpr *transitiveExpr =
218253 AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -224,6 +259,9 @@ void MCResourceInfo::gatherResourceInfo(
224259
225260 auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
226261 MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
262+ LLVM_DEBUG (
263+ dbgs () << " MCResUse: " << Sym->getName () << " : Adding " << LocalValue
264+ << " , no further propagation as indirect callee found within\n " );
227265 Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
228266 };
229267
0 commit comments