Skip to content

Commit 7f60f13

Browse files
authored
[AMDGPU] Fix resource usage information for unnamed functions (#115320)
Resource usage information would try to overwrite unnamed functions if there are multiple within the same compilation unit. This aims to either use the `MCSymbol` assigned to the unnamed function (i.e., `CurrentFnSym`), or, rematerialize the `MCSymbol` for the unnamed function.
1 parent e8b70e9 commit 7f60f13

File tree

3 files changed

+102
-33
lines changed

3 files changed

+102
-33
lines changed

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
368368

369369
using RIK = MCResourceInfo::ResourceInfoKind;
370370
const GCNSubtarget &STM = TM.getSubtarget<GCNSubtarget>(F);
371+
MCSymbol *FnSym = TM.getSymbol(&F);
371372

372373
auto TryGetMCExprValue = [](const MCExpr *Value, uint64_t &Res) -> bool {
373374
int64_t Val;
@@ -381,7 +382,7 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
381382
const uint64_t MaxScratchPerWorkitem =
382383
STM.getMaxWaveScratchSize() / STM.getWavefrontSize();
383384
MCSymbol *ScratchSizeSymbol =
384-
RI.getSymbol(F.getName(), RIK::RIK_PrivateSegSize, OutContext);
385+
RI.getSymbol(FnSym->getName(), RIK::RIK_PrivateSegSize, OutContext);
385386
uint64_t ScratchSize;
386387
if (ScratchSizeSymbol->isVariable() &&
387388
TryGetMCExprValue(ScratchSizeSymbol->getVariableValue(), ScratchSize) &&
@@ -394,7 +395,7 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
394395
// Validate addressable scalar registers (i.e., prior to added implicit
395396
// SGPRs).
396397
MCSymbol *NumSGPRSymbol =
397-
RI.getSymbol(F.getName(), RIK::RIK_NumSGPR, OutContext);
398+
RI.getSymbol(FnSym->getName(), RIK::RIK_NumSGPR, OutContext);
398399
if (STM.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS &&
399400
!STM.hasSGPRInitBug()) {
400401
unsigned MaxAddressableNumSGPRs = STM.getAddressableNumSGPRs();
@@ -411,9 +412,9 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
411412
}
412413

413414
MCSymbol *VCCUsedSymbol =
414-
RI.getSymbol(F.getName(), RIK::RIK_UsesVCC, OutContext);
415+
RI.getSymbol(FnSym->getName(), RIK::RIK_UsesVCC, OutContext);
415416
MCSymbol *FlatUsedSymbol =
416-
RI.getSymbol(F.getName(), RIK::RIK_UsesFlatScratch, OutContext);
417+
RI.getSymbol(FnSym->getName(), RIK::RIK_UsesFlatScratch, OutContext);
417418
uint64_t VCCUsed, FlatUsed, NumSgpr;
418419

419420
if (NumSGPRSymbol->isVariable() && VCCUsedSymbol->isVariable() &&
@@ -440,9 +441,9 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
440441
}
441442

442443
MCSymbol *NumVgprSymbol =
443-
RI.getSymbol(F.getName(), RIK::RIK_NumVGPR, OutContext);
444+
RI.getSymbol(FnSym->getName(), RIK::RIK_NumVGPR, OutContext);
444445
MCSymbol *NumAgprSymbol =
445-
RI.getSymbol(F.getName(), RIK::RIK_NumAGPR, OutContext);
446+
RI.getSymbol(FnSym->getName(), RIK::RIK_NumAGPR, OutContext);
446447
uint64_t NumVgpr, NumAgpr;
447448

448449
MachineModuleInfo &MMI =
@@ -705,15 +706,20 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
705706
{
706707
using RIK = MCResourceInfo::ResourceInfoKind;
707708
getTargetStreamer()->EmitMCResourceInfo(
708-
RI.getSymbol(MF.getName(), RIK::RIK_NumVGPR, OutContext),
709-
RI.getSymbol(MF.getName(), RIK::RIK_NumAGPR, OutContext),
710-
RI.getSymbol(MF.getName(), RIK::RIK_NumSGPR, OutContext),
711-
RI.getSymbol(MF.getName(), RIK::RIK_PrivateSegSize, OutContext),
712-
RI.getSymbol(MF.getName(), RIK::RIK_UsesVCC, OutContext),
713-
RI.getSymbol(MF.getName(), RIK::RIK_UsesFlatScratch, OutContext),
714-
RI.getSymbol(MF.getName(), RIK::RIK_HasDynSizedStack, OutContext),
715-
RI.getSymbol(MF.getName(), RIK::RIK_HasRecursion, OutContext),
716-
RI.getSymbol(MF.getName(), RIK::RIK_HasIndirectCall, OutContext));
709+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_NumVGPR, OutContext),
710+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_NumAGPR, OutContext),
711+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_NumSGPR, OutContext),
712+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_PrivateSegSize,
713+
OutContext),
714+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_UsesVCC, OutContext),
715+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_UsesFlatScratch,
716+
OutContext),
717+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_HasDynSizedStack,
718+
OutContext),
719+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_HasRecursion,
720+
OutContext),
721+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_HasIndirectCall,
722+
OutContext));
717723
}
718724

719725
if (isVerbose()) {
@@ -726,18 +732,19 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
726732
OutStreamer->emitRawComment(" Function info:", false);
727733

728734
emitCommonFunctionComments(
729-
RI.getSymbol(MF.getName(), RIK::RIK_NumVGPR, OutContext)
735+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_NumVGPR, OutContext)
730736
->getVariableValue(),
731-
STM.hasMAIInsts()
732-
? RI.getSymbol(MF.getName(), RIK::RIK_NumAGPR, OutContext)
733-
->getVariableValue()
734-
: nullptr,
737+
STM.hasMAIInsts() ? RI.getSymbol(CurrentFnSym->getName(),
738+
RIK::RIK_NumAGPR, OutContext)
739+
->getVariableValue()
740+
: nullptr,
735741
RI.createTotalNumVGPRs(MF, Ctx),
736742
RI.createTotalNumSGPRs(
737743
MF,
738744
MF.getSubtarget<GCNSubtarget>().getTargetID().isXnackOnOrAny(),
739745
Ctx),
740-
RI.getSymbol(MF.getName(), RIK::RIK_PrivateSegSize, OutContext)
746+
RI.getSymbol(CurrentFnSym->getName(), RIK::RIK_PrivateSegSize,
747+
OutContext)
741748
->getVariableValue(),
742749
getFunctionCodeSize(MF), MFI);
743750
return false;
@@ -943,7 +950,7 @@ void AMDGPUAsmPrinter::getSIProgramInfo(SIProgramInfo &ProgInfo,
943950

944951
auto GetSymRefExpr =
945952
[&](MCResourceInfo::ResourceInfoKind RIK) -> const MCExpr * {
946-
MCSymbol *Sym = RI.getSymbol(MF.getName(), RIK, OutContext);
953+
MCSymbol *Sym = RI.getSymbol(CurrentFnSym->getName(), RIK, OutContext);
947954
return MCSymbolRefExpr::create(Sym, Ctx);
948955
};
949956

llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/StringRef.h"
1919
#include "llvm/MC/MCContext.h"
2020
#include "llvm/MC/MCSymbol.h"
21+
#include "llvm/Target/TargetMachine.h"
2122

2223
using namespace llvm;
2324

@@ -95,6 +96,8 @@ void MCResourceInfo::assignResourceInfoExpr(
9596
int64_t LocalValue, ResourceInfoKind RIK, AMDGPUMCExpr::VariantKind Kind,
9697
const MachineFunction &MF, const SmallVectorImpl<const Function *> &Callees,
9798
MCContext &OutContext) {
99+
const LLVMTargetMachine &TM = MF.getTarget();
100+
MCSymbol *FnSym = TM.getSymbol(&MF.getFunction());
98101
const MCConstantExpr *LocalConstExpr =
99102
MCConstantExpr::create(LocalValue, OutContext);
100103
const MCExpr *SymVal = LocalConstExpr;
@@ -109,12 +112,14 @@ void MCResourceInfo::assignResourceInfoExpr(
109112
for (const Function *Callee : Callees) {
110113
if (!Seen.insert(Callee).second)
111114
continue;
112-
MCSymbol *CalleeValSym = getSymbol(Callee->getName(), RIK, OutContext);
115+
MCSymbol *CalleeFnSym = TM.getSymbol(&Callee->getFunction());
116+
MCSymbol *CalleeValSym =
117+
getSymbol(CalleeFnSym->getName(), RIK, OutContext);
113118
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
114119
}
115120
SymVal = AMDGPUMCExpr::create(Kind, ArgExprs, OutContext);
116121
}
117-
MCSymbol *Sym = getSymbol(MF.getName(), RIK, OutContext);
122+
MCSymbol *Sym = getSymbol(FnSym->getName(), RIK, OutContext);
118123
Sym->setVariableValue(SymVal);
119124
}
120125

@@ -133,14 +138,17 @@ void MCResourceInfo::gatherResourceInfo(
133138
addMaxSGPRCandidate(FRI.NumExplicitSGPR);
134139
}
135140

141+
const LLVMTargetMachine &TM = MF.getTarget();
142+
MCSymbol *FnSym = TM.getSymbol(&MF.getFunction());
143+
136144
auto SetMaxReg = [&](MCSymbol *MaxSym, int32_t numRegs,
137145
ResourceInfoKind RIK) {
138146
if (!FRI.HasIndirectCall) {
139147
assignResourceInfoExpr(numRegs, RIK, AMDGPUMCExpr::AGVK_Max, MF,
140148
FRI.Callees, OutContext);
141149
} else {
142150
const MCExpr *SymRef = MCSymbolRefExpr::create(MaxSym, OutContext);
143-
MCSymbol *LocalNumSym = getSymbol(MF.getName(), RIK, OutContext);
151+
MCSymbol *LocalNumSym = getSymbol(FnSym->getName(), RIK, OutContext);
144152
const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax(
145153
{MCConstantExpr::create(numRegs, OutContext), SymRef}, OutContext);
146154
LocalNumSym->setVariableValue(MaxWithLocal);
@@ -165,8 +173,9 @@ void MCResourceInfo::gatherResourceInfo(
165173
if (!Seen.insert(Callee).second)
166174
continue;
167175
if (!Callee->isDeclaration()) {
176+
MCSymbol *CalleeFnSym = TM.getSymbol(&Callee->getFunction());
168177
MCSymbol *calleeValSym =
169-
getSymbol(Callee->getName(), RIK_PrivateSegSize, OutContext);
178+
getSymbol(CalleeFnSym->getName(), RIK_PrivateSegSize, OutContext);
170179
ArgExprs.push_back(MCSymbolRefExpr::create(calleeValSym, OutContext));
171180
}
172181
}
@@ -178,12 +187,12 @@ void MCResourceInfo::gatherResourceInfo(
178187
localConstExpr =
179188
MCBinaryExpr::createAdd(localConstExpr, transitiveExpr, OutContext);
180189
}
181-
getSymbol(MF.getName(), RIK_PrivateSegSize, OutContext)
190+
getSymbol(FnSym->getName(), RIK_PrivateSegSize, OutContext)
182191
->setVariableValue(localConstExpr);
183192
}
184193

185194
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
186-
MCSymbol *Sym = getSymbol(MF.getName(), RIK, OutContext);
195+
MCSymbol *Sym = getSymbol(FnSym->getName(), RIK, OutContext);
187196
Sym->setVariableValue(MCConstantExpr::create(LocalValue, OutContext));
188197
};
189198

@@ -213,18 +222,23 @@ void MCResourceInfo::gatherResourceInfo(
213222

214223
const MCExpr *MCResourceInfo::createTotalNumVGPRs(const MachineFunction &MF,
215224
MCContext &Ctx) {
225+
const LLVMTargetMachine &TM = MF.getTarget();
226+
MCSymbol *FnSym = TM.getSymbol(&MF.getFunction());
216227
return AMDGPUMCExpr::createTotalNumVGPR(
217-
getSymRefExpr(MF.getName(), RIK_NumAGPR, Ctx),
218-
getSymRefExpr(MF.getName(), RIK_NumVGPR, Ctx), Ctx);
228+
getSymRefExpr(FnSym->getName(), RIK_NumAGPR, Ctx),
229+
getSymRefExpr(FnSym->getName(), RIK_NumVGPR, Ctx), Ctx);
219230
}
220231

221232
const MCExpr *MCResourceInfo::createTotalNumSGPRs(const MachineFunction &MF,
222233
bool hasXnack,
223234
MCContext &Ctx) {
235+
const LLVMTargetMachine &TM = MF.getTarget();
236+
MCSymbol *FnSym = TM.getSymbol(&MF.getFunction());
224237
return MCBinaryExpr::createAdd(
225-
getSymRefExpr(MF.getName(), RIK_NumSGPR, Ctx),
238+
getSymRefExpr(FnSym->getName(), RIK_NumSGPR, Ctx),
226239
AMDGPUMCExpr::createExtraSGPRs(
227-
getSymRefExpr(MF.getName(), RIK_UsesVCC, Ctx),
228-
getSymRefExpr(MF.getName(), RIK_UsesFlatScratch, Ctx), hasXnack, Ctx),
240+
getSymRefExpr(FnSym->getName(), RIK_UsesVCC, Ctx),
241+
getSymRefExpr(FnSym->getName(), RIK_UsesFlatScratch, Ctx), hasXnack,
242+
Ctx),
229243
Ctx);
230244
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 < %s | FileCheck %s
2+
3+
; CHECK-LABEL: __unnamed_1:
4+
; CHECK: .set __unnamed_1.num_vgpr, 0
5+
; CHECK: .set __unnamed_1.num_agpr, 0
6+
; CHECK: .set __unnamed_1.numbered_sgpr, 32
7+
; CHECK: .set __unnamed_1.private_seg_size, 0
8+
; CHECK: .set __unnamed_1.uses_vcc, 0
9+
; CHECK: .set __unnamed_1.uses_flat_scratch, 0
10+
; CHECK: .set __unnamed_1.has_dyn_sized_stack, 0
11+
; CHECK: .set __unnamed_1.has_recursion, 0
12+
; CHECK: .set __unnamed_1.has_indirect_call, 0
13+
define void @1() {
14+
entry:
15+
ret void
16+
}
17+
18+
; CHECK-LABEL: __unnamed_2:
19+
; CHECK: .set __unnamed_2.num_vgpr, max(32, __unnamed_1.num_vgpr)
20+
; CHECK: .set __unnamed_2.num_agpr, max(0, __unnamed_1.num_agpr)
21+
; CHECK: .set __unnamed_2.numbered_sgpr, max(34, __unnamed_1.numbered_sgpr)
22+
; CHECK: .set __unnamed_2.private_seg_size, 16+(max(__unnamed_1.private_seg_size))
23+
; CHECK: .set __unnamed_2.uses_vcc, or(0, __unnamed_1.uses_vcc)
24+
; CHECK: .set __unnamed_2.uses_flat_scratch, or(0, __unnamed_1.uses_flat_scratch)
25+
; CHECK: .set __unnamed_2.has_dyn_sized_stack, or(0, __unnamed_1.has_dyn_sized_stack)
26+
; CHECK: .set __unnamed_2.has_recursion, or(1, __unnamed_1.has_recursion)
27+
; CHECK: .set __unnamed_2.has_indirect_call, or(0, __unnamed_1.has_indirect_call)
28+
define void @2() {
29+
entry:
30+
call void @1()
31+
ret void
32+
}
33+
34+
; CHECK-LABEL: {{^}}use
35+
; CHECK: .set use.num_vgpr, max(32, __unnamed_1.num_vgpr, __unnamed_2.num_vgpr)
36+
; CHECK: .set use.num_agpr, max(0, __unnamed_1.num_agpr, __unnamed_2.num_agpr)
37+
; CHECK: .set use.numbered_sgpr, max(33, __unnamed_1.numbered_sgpr, __unnamed_2.numbered_sgpr)
38+
; CHECK: .set use.private_seg_size, 0+(max(__unnamed_1.private_seg_size, __unnamed_2.private_seg_size))
39+
; CHECK: .set use.uses_vcc, or(0, __unnamed_1.uses_vcc, __unnamed_2.uses_vcc)
40+
; CHECK: .set use.uses_flat_scratch, or(1, __unnamed_1.uses_flat_scratch, __unnamed_2.uses_flat_scratch)
41+
; CHECK: .set use.has_dyn_sized_stack, or(0, __unnamed_1.has_dyn_sized_stack, __unnamed_2.has_dyn_sized_stack)
42+
; CHECK: .set use.has_recursion, or(1, __unnamed_1.has_recursion, __unnamed_2.has_recursion)
43+
; CHECK: .set use.has_indirect_call, or(0, __unnamed_1.has_indirect_call, __unnamed_2.has_indirect_call)
44+
define amdgpu_kernel void @use() {
45+
call void @1()
46+
call void @2()
47+
ret void
48+
}

0 commit comments

Comments
 (0)