20
20
#include " llvm/MC/MCSymbol.h"
21
21
#include " llvm/Target/TargetMachine.h"
22
22
23
+ #define DEBUG_TYPE " amdgpu-mc-resource-usage"
24
+
23
25
using namespace llvm ;
24
26
25
27
MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
@@ -106,6 +108,8 @@ void MCResourceInfo::assignResourceInfoExpr(
106
108
MCConstantExpr::create (LocalValue, OutContext);
107
109
const MCExpr *SymVal = LocalConstExpr;
108
110
MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal);
111
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
112
+ << LocalValue << " as function local usage\n " );
109
113
if (!Callees.empty ()) {
110
114
SmallVector<const MCExpr *, 8 > ArgExprs;
111
115
SmallPtrSet<const Function *, 8 > Seen;
@@ -125,8 +129,13 @@ void MCResourceInfo::assignResourceInfoExpr(
125
129
if (!CalleeValSym->isVariable () ||
126
130
!CalleeValSym->getVariableValue (/* isUsed=*/ false )
127
131
->isSymbolUsedInExpression (Sym)) {
132
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
133
+ << CalleeValSym->getName () << " as callee\n " );
128
134
ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
129
135
} else {
136
+ LLVM_DEBUG (
137
+ dbgs () << " MCResUse: " << Sym->getName ()
138
+ << " : Recursion found, falling back to module maximum\n " );
130
139
// In case of recursion: make sure to use conservative register counts
131
140
// (i.e., specifically for VGPR/SGPR/AGPR).
132
141
switch (RIK) {
@@ -172,6 +181,20 @@ void MCResourceInfo::gatherResourceInfo(
172
181
const TargetMachine &TM = MF.getTarget ();
173
182
MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
174
183
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
+
175
198
auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
176
199
ResourceInfoKind RIK) {
177
200
if (!FRI.HasIndirectCall ) {
@@ -184,9 +207,12 @@ void MCResourceInfo::gatherResourceInfo(
184
207
const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
185
208
{MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
186
209
LocalNumSym->setVariableValue (MaxWithLocal);
210
+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
211
+ << " : Indirect callee within, using module maximum\n " );
187
212
}
188
213
};
189
214
215
+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << " \n " );
190
216
SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
191
217
SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
192
218
SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -197,9 +223,13 @@ void MCResourceInfo::gatherResourceInfo(
197
223
SmallVector<const MCExpr *, 8 > ArgExprs;
198
224
MCSymbol *Sym =
199
225
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 " );
201
230
ArgExprs.push_back (
202
231
MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
232
+ }
203
233
204
234
SmallPtrSet<const Function *, 8 > Seen;
205
235
Seen.insert (&MF.getFunction ());
@@ -218,12 +248,17 @@ void MCResourceInfo::gatherResourceInfo(
218
248
if (!CalleeValSym->isVariable () ||
219
249
!CalleeValSym->getVariableValue (/* isUsed=*/ false )
220
250
->isSymbolUsedInExpression (Sym)) {
251
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
252
+ << CalleeValSym->getName () << " as callee\n " );
221
253
ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
222
254
}
223
255
}
224
256
}
225
257
const MCExpr *localConstExpr =
226
258
MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
259
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
260
+ << FRI.PrivateSegmentSize
261
+ << " as function local usage\n " );
227
262
if (!ArgExprs.empty ()) {
228
263
const AMDGPUMCExpr *transitiveExpr =
229
264
AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -235,6 +270,9 @@ void MCResourceInfo::gatherResourceInfo(
235
270
236
271
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
237
272
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 " );
238
276
Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
239
277
};
240
278
0 commit comments