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,18 @@ 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
+ 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
+
175
196
auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
176
197
ResourceInfoKind RIK) {
177
198
if (!FRI.HasIndirectCall ) {
@@ -184,9 +205,12 @@ void MCResourceInfo::gatherResourceInfo(
184
205
const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
185
206
{MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
186
207
LocalNumSym->setVariableValue (MaxWithLocal);
208
+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
209
+ << " : Indirect callee within, using module maximum\n " );
187
210
}
188
211
};
189
212
213
+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << ' \n ' );
190
214
SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
191
215
SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
192
216
SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -197,9 +221,13 @@ void MCResourceInfo::gatherResourceInfo(
197
221
SmallVector<const MCExpr *, 8 > ArgExprs;
198
222
MCSymbol *Sym =
199
223
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 " );
201
228
ArgExprs.push_back (
202
229
MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
230
+ }
203
231
204
232
SmallPtrSet<const Function *, 8 > Seen;
205
233
Seen.insert (&MF.getFunction ());
@@ -218,12 +246,17 @@ void MCResourceInfo::gatherResourceInfo(
218
246
if (!CalleeValSym->isVariable () ||
219
247
!CalleeValSym->getVariableValue (/* isUsed=*/ false )
220
248
->isSymbolUsedInExpression (Sym)) {
249
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
250
+ << CalleeValSym->getName () << " as callee\n " );
221
251
ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
222
252
}
223
253
}
224
254
}
225
255
const MCExpr *localConstExpr =
226
256
MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
257
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
258
+ << FRI.PrivateSegmentSize
259
+ << " as function local usage\n " );
227
260
if (!ArgExprs.empty ()) {
228
261
const AMDGPUMCExpr *transitiveExpr =
229
262
AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -235,6 +268,9 @@ void MCResourceInfo::gatherResourceInfo(
235
268
236
269
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
237
270
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 " );
238
274
Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
239
275
};
240
276
0 commit comments