19
19
#include " llvm/MC/MCSymbol.h"
20
20
#include " llvm/Target/TargetMachine.h"
21
21
22
+ #define DEBUG_TYPE " amdgpu-mc-resource-usage"
23
+
22
24
using namespace llvm ;
23
25
24
26
MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
@@ -101,6 +103,8 @@ void MCResourceInfo::assignResourceInfoExpr(
101
103
MCConstantExpr::create (LocalValue, OutContext);
102
104
const MCExpr *SymVal = LocalConstExpr;
103
105
MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
106
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
107
+ << LocalValue << " as function local usage\n " );
104
108
if (!Callees.empty ()) {
105
109
SmallVector<const MCExpr *, 8 > ArgExprs;
106
110
SmallPtrSet<const Function *, 8 > Seen;
@@ -119,8 +123,13 @@ void MCResourceInfo::assignResourceInfoExpr(
119
123
if (!CalleeValSym->isVariable () ||
120
124
!CalleeValSym->getVariableValue (/* isUsed=*/ false )
121
125
->isSymbolUsedInExpression (Sym)) {
126
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
127
+ << CalleeValSym->getName () << " as callee\n " );
122
128
ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
123
129
} else {
130
+ LLVM_DEBUG (
131
+ dbgs () << " MCResUse: " << Sym->getName ()
132
+ << " : Recursion found, falling back to module maximum\n " );
124
133
// In case of recursion: make sure to use conservative register counts
125
134
// (i.e., specifically for VGPR/SGPR/AGPR).
126
135
switch (RIK) {
@@ -165,6 +174,20 @@ void MCResourceInfo::gatherResourceInfo(
165
174
const TargetMachine &TM = MF.getTarget ();
166
175
MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
167
176
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
+
168
191
auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
169
192
ResourceInfoKind RIK) {
170
193
if (!FRI.HasIndirectCall ) {
@@ -176,9 +199,12 @@ void MCResourceInfo::gatherResourceInfo(
176
199
const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
177
200
{MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
178
201
LocalNumSym->setVariableValue (MaxWithLocal);
202
+ LLVM_DEBUG (dbgs () << " MCResUse: " << LocalNumSym->getName ()
203
+ << " : Indirect callee within, using module maximum\n " );
179
204
}
180
205
};
181
206
207
+ LLVM_DEBUG (dbgs () << " MCResUse: " << FnSym->getName () << " \n " );
182
208
SetMaxReg (MaxVGPRSym, FRI.NumVGPR , RIK_NumVGPR);
183
209
SetMaxReg (MaxAGPRSym, FRI.NumAGPR , RIK_NumAGPR);
184
210
SetMaxReg (MaxSGPRSym, FRI.NumExplicitSGPR , RIK_NumSGPR);
@@ -188,9 +214,13 @@ void MCResourceInfo::gatherResourceInfo(
188
214
// + max(FRI.Callees, FRI.CalleeSegmentSize)
189
215
SmallVector<const MCExpr *, 8 > ArgExprs;
190
216
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 " );
192
221
ArgExprs.push_back (
193
222
MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
223
+ }
194
224
195
225
SmallPtrSet<const Function *, 8 > Seen;
196
226
Seen.insert (&MF.getFunction ());
@@ -207,12 +237,17 @@ void MCResourceInfo::gatherResourceInfo(
207
237
if (!CalleeValSym->isVariable () ||
208
238
!CalleeValSym->getVariableValue (/* isUsed=*/ false )
209
239
->isSymbolUsedInExpression (Sym)) {
240
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
241
+ << CalleeValSym->getName () << " as callee\n " );
210
242
ArgExprs.push_back (MCSymbolRefExpr::create (CalleeValSym, OutContext));
211
243
}
212
244
}
213
245
}
214
246
const MCExpr *localConstExpr =
215
247
MCConstantExpr::create (FRI.PrivateSegmentSize , OutContext);
248
+ LLVM_DEBUG (dbgs () << " MCResUse: " << Sym->getName () << " : Adding "
249
+ << FRI.PrivateSegmentSize
250
+ << " as function local usage\n " );
216
251
if (!ArgExprs.empty ()) {
217
252
const AMDGPUMCExpr *transitiveExpr =
218
253
AMDGPUMCExpr::createMax (ArgExprs, OutContext);
@@ -224,6 +259,9 @@ void MCResourceInfo::gatherResourceInfo(
224
259
225
260
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
226
261
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 " );
227
265
Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
228
266
};
229
267
0 commit comments