Skip to content

Commit bc022b4

Browse files
authored
[AMDGPU] Support SIProgramInfo MCExpr for comments and remarks (#94350)
Eliminates assumption that MCExpr comments/remarks being emitted are always resolvable
1 parent 18ec885 commit bc022b4

File tree

2 files changed

+78
-47
lines changed

2 files changed

+78
-47
lines changed

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp

Lines changed: 72 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,36 @@ void AMDGPUAsmPrinter::emitCommonFunctionComments(
400400
false);
401401
}
402402

403+
SmallString<128> AMDGPUAsmPrinter::getMCExprStr(const MCExpr *Value) {
404+
SmallString<128> Str;
405+
raw_svector_ostream OSS(Str);
406+
int64_t IVal;
407+
if (Value->evaluateAsAbsolute(IVal)) {
408+
OSS << static_cast<uint64_t>(IVal);
409+
} else {
410+
Value->print(OSS, MAI);
411+
}
412+
return Str;
413+
}
414+
415+
void AMDGPUAsmPrinter::emitCommonFunctionComments(
416+
const MCExpr *NumVGPR, const MCExpr *NumAGPR, const MCExpr *TotalNumVGPR,
417+
const MCExpr *NumSGPR, const MCExpr *ScratchSize, uint64_t CodeSize,
418+
const AMDGPUMachineFunction *MFI) {
419+
OutStreamer->emitRawComment(" codeLenInByte = " + Twine(CodeSize), false);
420+
OutStreamer->emitRawComment(" NumSgprs: " + getMCExprStr(NumSGPR), false);
421+
OutStreamer->emitRawComment(" NumVgprs: " + getMCExprStr(NumVGPR), false);
422+
if (NumAGPR && TotalNumVGPR) {
423+
OutStreamer->emitRawComment(" NumAgprs: " + getMCExprStr(NumAGPR), false);
424+
OutStreamer->emitRawComment(" TotalNumVgprs: " + getMCExprStr(TotalNumVGPR),
425+
false);
426+
}
427+
OutStreamer->emitRawComment(" ScratchSize: " + getMCExprStr(ScratchSize),
428+
false);
429+
OutStreamer->emitRawComment(" MemoryBound: " + Twine(MFI->isMemoryBound()),
430+
false);
431+
}
432+
403433
uint16_t AMDGPUAsmPrinter::getAmdhsaKernelCodeProperties(
404434
const MachineFunction &MF) const {
405435
const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
@@ -554,13 +584,10 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
554584

555585
OutStreamer->emitRawComment(" Kernel info:", false);
556586
emitCommonFunctionComments(
557-
getMCExprValue(CurrentProgramInfo.NumArchVGPR, Ctx),
558-
STM.hasMAIInsts() ? getMCExprValue(CurrentProgramInfo.NumAccVGPR, Ctx)
559-
: std::optional<uint32_t>(),
560-
getMCExprValue(CurrentProgramInfo.NumVGPR, Ctx),
561-
getMCExprValue(CurrentProgramInfo.NumSGPR, Ctx),
562-
getMCExprValue(CurrentProgramInfo.ScratchSize, Ctx),
563-
getFunctionCodeSize(MF), MFI);
587+
CurrentProgramInfo.NumArchVGPR,
588+
STM.hasMAIInsts() ? CurrentProgramInfo.NumAccVGPR : nullptr,
589+
CurrentProgramInfo.NumVGPR, CurrentProgramInfo.NumSGPR,
590+
CurrentProgramInfo.ScratchSize, getFunctionCodeSize(MF), MFI);
564591

565592
OutStreamer->emitRawComment(
566593
" FloatMode: " + Twine(CurrentProgramInfo.FloatMode), false);
@@ -571,43 +598,38 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
571598
" bytes/workgroup (compile time only)", false);
572599

573600
OutStreamer->emitRawComment(
574-
" SGPRBlocks: " +
575-
Twine(getMCExprValue(CurrentProgramInfo.SGPRBlocks, Ctx)),
576-
false);
601+
" SGPRBlocks: " + getMCExprStr(CurrentProgramInfo.SGPRBlocks), false);
602+
577603
OutStreamer->emitRawComment(
578-
" VGPRBlocks: " +
579-
Twine(getMCExprValue(CurrentProgramInfo.VGPRBlocks, Ctx)),
580-
false);
604+
" VGPRBlocks: " + getMCExprStr(CurrentProgramInfo.VGPRBlocks), false);
581605

582606
OutStreamer->emitRawComment(
583607
" NumSGPRsForWavesPerEU: " +
584-
Twine(
585-
getMCExprValue(CurrentProgramInfo.NumSGPRsForWavesPerEU, Ctx)),
608+
getMCExprStr(CurrentProgramInfo.NumSGPRsForWavesPerEU),
586609
false);
587610
OutStreamer->emitRawComment(
588611
" NumVGPRsForWavesPerEU: " +
589-
Twine(
590-
getMCExprValue(CurrentProgramInfo.NumVGPRsForWavesPerEU, Ctx)),
612+
getMCExprStr(CurrentProgramInfo.NumVGPRsForWavesPerEU),
591613
false);
592614

593-
if (STM.hasGFX90AInsts())
615+
if (STM.hasGFX90AInsts()) {
616+
const MCExpr *AdjustedAccum = MCBinaryExpr::createAdd(
617+
CurrentProgramInfo.AccumOffset, MCConstantExpr::create(1, Ctx), Ctx);
618+
AdjustedAccum = MCBinaryExpr::createMul(
619+
AdjustedAccum, MCConstantExpr::create(4, Ctx), Ctx);
594620
OutStreamer->emitRawComment(
595-
" AccumOffset: " +
596-
Twine((getMCExprValue(CurrentProgramInfo.AccumOffset, Ctx) + 1) *
597-
4),
598-
false);
621+
" AccumOffset: " + getMCExprStr(AdjustedAccum), false);
622+
}
599623

600624
OutStreamer->emitRawComment(
601-
" Occupancy: " +
602-
Twine(getMCExprValue(CurrentProgramInfo.Occupancy, Ctx)),
603-
false);
625+
" Occupancy: " + getMCExprStr(CurrentProgramInfo.Occupancy), false);
604626

605627
OutStreamer->emitRawComment(
606628
" WaveLimiterHint : " + Twine(MFI->needsWaveLimiter()), false);
607629

608630
OutStreamer->emitRawComment(
609631
" COMPUTE_PGM_RSRC2:SCRATCH_EN: " +
610-
Twine(getMCExprValue(CurrentProgramInfo.ScratchEnable, Ctx)),
632+
getMCExprStr(CurrentProgramInfo.ScratchEnable),
611633
false);
612634
OutStreamer->emitRawComment(" COMPUTE_PGM_RSRC2:USER_SGPR: " +
613635
Twine(CurrentProgramInfo.UserSGPR),
@@ -628,20 +650,25 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
628650
Twine(CurrentProgramInfo.TIdIGCompCount),
629651
false);
630652

653+
int64_t PGMRSrc3;
631654
assert(STM.hasGFX90AInsts() ||
632-
getMCExprValue(CurrentProgramInfo.ComputePGMRSrc3GFX90A, Ctx) == 0);
655+
(CurrentProgramInfo.ComputePGMRSrc3GFX90A->evaluateAsAbsolute(
656+
PGMRSrc3) &&
657+
static_cast<uint64_t>(PGMRSrc3) == 0));
633658
if (STM.hasGFX90AInsts()) {
634659
OutStreamer->emitRawComment(
635660
" COMPUTE_PGM_RSRC3_GFX90A:ACCUM_OFFSET: " +
636-
Twine((AMDHSA_BITS_GET(
637-
getMCExprValue(CurrentProgramInfo.ComputePGMRSrc3GFX90A, Ctx),
638-
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET))),
661+
getMCExprStr(MCKernelDescriptor::bits_get(
662+
CurrentProgramInfo.ComputePGMRSrc3GFX90A,
663+
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT,
664+
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET, Ctx)),
639665
false);
640666
OutStreamer->emitRawComment(
641667
" COMPUTE_PGM_RSRC3_GFX90A:TG_SPLIT: " +
642-
Twine((AMDHSA_BITS_GET(
643-
getMCExprValue(CurrentProgramInfo.ComputePGMRSrc3GFX90A, Ctx),
644-
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT))),
668+
getMCExprStr(MCKernelDescriptor::bits_get(
669+
CurrentProgramInfo.ComputePGMRSrc3GFX90A,
670+
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT,
671+
amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT, Ctx)),
645672
false);
646673
}
647674
}
@@ -1463,28 +1490,26 @@ void AMDGPUAsmPrinter::emitResourceUsageRemarks(
14631490
// remarks to simulate newlines. If and when clang does accept newlines, this
14641491
// formatting should be aggregated into one remark with newlines to avoid
14651492
// printing multiple diagnostic location and diag opts.
1466-
MCContext &MCCtx = MF.getContext();
14671493
EmitResourceUsageRemark("FunctionName", "Function Name",
14681494
MF.getFunction().getName());
14691495
EmitResourceUsageRemark("NumSGPR", "SGPRs",
1470-
getMCExprValue(CurrentProgramInfo.NumSGPR, MCCtx));
1471-
EmitResourceUsageRemark(
1472-
"NumVGPR", "VGPRs",
1473-
getMCExprValue(CurrentProgramInfo.NumArchVGPR, MCCtx));
1496+
getMCExprStr(CurrentProgramInfo.NumSGPR));
1497+
EmitResourceUsageRemark("NumVGPR", "VGPRs",
1498+
getMCExprStr(CurrentProgramInfo.NumArchVGPR));
14741499
if (hasMAIInsts) {
1475-
EmitResourceUsageRemark(
1476-
"NumAGPR", "AGPRs",
1477-
getMCExprValue(CurrentProgramInfo.NumAccVGPR, MCCtx));
1500+
EmitResourceUsageRemark("NumAGPR", "AGPRs",
1501+
getMCExprStr(CurrentProgramInfo.NumAccVGPR));
14781502
}
1479-
EmitResourceUsageRemark(
1480-
"ScratchSize", "ScratchSize [bytes/lane]",
1481-
getMCExprValue(CurrentProgramInfo.ScratchSize, MCCtx));
1503+
EmitResourceUsageRemark("ScratchSize", "ScratchSize [bytes/lane]",
1504+
getMCExprStr(CurrentProgramInfo.ScratchSize));
1505+
int64_t DynStack;
1506+
bool DynStackEvaluatable =
1507+
CurrentProgramInfo.DynamicCallStack->evaluateAsAbsolute(DynStack);
14821508
StringRef DynamicStackStr =
1483-
getMCExprValue(CurrentProgramInfo.DynamicCallStack, MCCtx) ? "True"
1484-
: "False";
1509+
DynStackEvaluatable && DynStack ? "True" : "False";
14851510
EmitResourceUsageRemark("DynamicStack", "Dynamic Stack", DynamicStackStr);
14861511
EmitResourceUsageRemark("Occupancy", "Occupancy [waves/SIMD]",
1487-
getMCExprValue(CurrentProgramInfo.Occupancy, MCCtx));
1512+
getMCExprStr(CurrentProgramInfo.Occupancy));
14881513
EmitResourceUsageRemark("SGPRSpill", "SGPRs Spill",
14891514
CurrentProgramInfo.SGPRSpill);
14901515
EmitResourceUsageRemark("VGPRSpill", "VGPRs Spill",

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
6565
uint32_t TotalNumVGPR, uint32_t NumSGPR,
6666
uint64_t ScratchSize, uint64_t CodeSize,
6767
const AMDGPUMachineFunction *MFI);
68+
void emitCommonFunctionComments(const MCExpr *NumVGPR, const MCExpr *NumAGPR,
69+
const MCExpr *TotalNumVGPR,
70+
const MCExpr *NumSGPR,
71+
const MCExpr *ScratchSize, uint64_t CodeSize,
72+
const AMDGPUMachineFunction *MFI);
6873
void emitResourceUsageRemarks(const MachineFunction &MF,
6974
const SIProgramInfo &CurrentProgramInfo,
7075
bool isModuleEntryFunction, bool hasMAIInsts);
@@ -79,6 +84,7 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
7984
void initTargetStreamer(Module &M);
8085

8186
static uint64_t getMCExprValue(const MCExpr *Value, MCContext &Ctx);
87+
SmallString<128> getMCExprStr(const MCExpr *Value);
8288

8389
public:
8490
explicit AMDGPUAsmPrinter(TargetMachine &TM,

0 commit comments

Comments
 (0)