Skip to content

Commit 35906de

Browse files
JanekvOAlexisPerry
authored andcommitted
[AMDGPU] MCExpr-ify AMDGPU HSAMetadata (llvm#94788)
Enables MCExpr for HSAMetadata, particularly, HSAMetadata's msgpack format.
1 parent 5df1577 commit 35906de

22 files changed

+348
-441
lines changed

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,6 @@ void AMDGPUAsmPrinter::initTargetStreamer(Module &M) {
136136
getTargetStreamer()->getPALMetadata()->readFromIR(M);
137137
}
138138

139-
uint64_t AMDGPUAsmPrinter::getMCExprValue(const MCExpr *Value, MCContext &Ctx) {
140-
int64_t Val;
141-
if (!Value->evaluateAsAbsolute(Val)) {
142-
Ctx.reportError(SMLoc(), "could not resolve expression when required.");
143-
return 0;
144-
}
145-
return static_cast<uint64_t>(Val);
146-
}
147-
148139
void AMDGPUAsmPrinter::emitEndOfAsmFile(Module &M) {
149140
// Init target streamer if it has not yet happened
150141
if (!IsTargetStreamerInitialized)
@@ -249,14 +240,14 @@ void AMDGPUAsmPrinter::emitFunctionBodyEnd() {
249240
getNameWithPrefix(KernelName, &MF->getFunction());
250241
getTargetStreamer()->EmitAmdhsaKernelDescriptor(
251242
STM, KernelName, getAmdhsaKernelDescriptor(*MF, CurrentProgramInfo),
252-
getMCExprValue(CurrentProgramInfo.NumVGPRsForWavesPerEU, Context),
253-
getMCExprValue(CurrentProgramInfo.NumSGPRsForWavesPerEU, Context) -
254-
IsaInfo::getNumExtraSGPRs(
255-
&STM, getMCExprValue(CurrentProgramInfo.VCCUsed, Context),
256-
getMCExprValue(CurrentProgramInfo.FlatUsed, Context),
257-
getTargetStreamer()->getTargetID()->isXnackOnOrAny()),
258-
getMCExprValue(CurrentProgramInfo.VCCUsed, Context),
259-
getMCExprValue(CurrentProgramInfo.FlatUsed, Context));
243+
CurrentProgramInfo.NumVGPRsForWavesPerEU,
244+
MCBinaryExpr::createSub(
245+
CurrentProgramInfo.NumSGPRsForWavesPerEU,
246+
AMDGPUMCExpr::createExtraSGPRs(
247+
CurrentProgramInfo.VCCUsed, CurrentProgramInfo.FlatUsed,
248+
getTargetStreamer()->getTargetID()->isXnackOnOrAny(), Context),
249+
Context),
250+
CurrentProgramInfo.VCCUsed, CurrentProgramInfo.FlatUsed);
260251

261252
Streamer.popSection();
262253
}
@@ -431,9 +422,10 @@ void AMDGPUAsmPrinter::emitCommonFunctionComments(
431422
false);
432423
}
433424

434-
uint16_t AMDGPUAsmPrinter::getAmdhsaKernelCodeProperties(
425+
const MCExpr *AMDGPUAsmPrinter::getAmdhsaKernelCodeProperties(
435426
const MachineFunction &MF) const {
436427
const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
428+
MCContext &Ctx = MF.getContext();
437429
uint16_t KernelCodeProperties = 0;
438430
const GCNUserSGPRUsageInfo &UserSGPRInfo = MFI.getUserSGPRInfo();
439431

@@ -470,11 +462,19 @@ uint16_t AMDGPUAsmPrinter::getAmdhsaKernelCodeProperties(
470462
amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32;
471463
}
472464

473-
if (getMCExprValue(CurrentProgramInfo.DynamicCallStack, MF.getContext()) &&
474-
CodeObjectVersion >= AMDGPU::AMDHSA_COV5)
475-
KernelCodeProperties |= amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK;
476-
477-
return KernelCodeProperties;
465+
// CurrentProgramInfo.DynamicCallStack is a MCExpr and could be
466+
// un-evaluatable at this point so it cannot be conditionally checked here.
467+
// Instead, we'll directly shift the possibly unknown MCExpr into its place
468+
// and bitwise-or it into KernelCodeProperties.
469+
const MCExpr *KernelCodePropExpr =
470+
MCConstantExpr::create(KernelCodeProperties, Ctx);
471+
const MCExpr *OrValue = MCConstantExpr::create(
472+
amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT, Ctx);
473+
OrValue = MCBinaryExpr::createShl(CurrentProgramInfo.DynamicCallStack,
474+
OrValue, Ctx);
475+
KernelCodePropExpr = MCBinaryExpr::createOr(KernelCodePropExpr, OrValue, Ctx);
476+
477+
return KernelCodePropExpr;
478478
}
479479

480480
MCKernelDescriptor
@@ -497,11 +497,15 @@ AMDGPUAsmPrinter::getAmdhsaKernelDescriptor(const MachineFunction &MF,
497497

498498
KernelDescriptor.compute_pgm_rsrc1 = PI.getComputePGMRSrc1(STM, Ctx);
499499
KernelDescriptor.compute_pgm_rsrc2 = PI.getComputePGMRSrc2(Ctx);
500-
KernelDescriptor.kernel_code_properties =
501-
MCConstantExpr::create(getAmdhsaKernelCodeProperties(MF), Ctx);
502-
503-
assert(STM.hasGFX90AInsts() ||
504-
getMCExprValue(CurrentProgramInfo.ComputePGMRSrc3GFX90A, Ctx) == 0);
500+
KernelDescriptor.kernel_code_properties = getAmdhsaKernelCodeProperties(MF);
501+
502+
int64_t PGRM_Rsrc3 = 1;
503+
bool EvaluatableRsrc3 =
504+
CurrentProgramInfo.ComputePGMRSrc3GFX90A->evaluateAsAbsolute(PGRM_Rsrc3);
505+
(void)PGRM_Rsrc3;
506+
(void)EvaluatableRsrc3;
507+
assert(STM.hasGFX90AInsts() || !EvaluatableRsrc3 ||
508+
static_cast<uint64_t>(PGRM_Rsrc3) == 0);
505509
KernelDescriptor.compute_pgm_rsrc3 = CurrentProgramInfo.ComputePGMRSrc3GFX90A;
506510

507511
KernelDescriptor.kernarg_preload = MCConstantExpr::create(

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,14 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
7474
const SIProgramInfo &CurrentProgramInfo,
7575
bool isModuleEntryFunction, bool hasMAIInsts);
7676

77-
uint16_t getAmdhsaKernelCodeProperties(
78-
const MachineFunction &MF) const;
77+
const MCExpr *getAmdhsaKernelCodeProperties(const MachineFunction &MF) const;
7978

8079
AMDGPU::MCKernelDescriptor
8180
getAmdhsaKernelDescriptor(const MachineFunction &MF,
8281
const SIProgramInfo &PI) const;
8382

8483
void initTargetStreamer(Module &M);
8584

86-
static uint64_t getMCExprValue(const MCExpr *Value, MCContext &Ctx);
8785
SmallString<128> getMCExprStr(const MCExpr *Value);
8886

8987
public:

llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -464,28 +464,19 @@ MetadataStreamerMsgPackV4::getHSAKernelProps(const MachineFunction &MF,
464464
const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
465465
const Function &F = MF.getFunction();
466466

467-
auto GetMCExprValue = [&MF](const MCExpr *Value) {
468-
int64_t Val;
469-
if (!Value->evaluateAsAbsolute(Val)) {
470-
MCContext &Ctx = MF.getContext();
471-
Ctx.reportError(SMLoc(), "could not resolve expression when required.");
472-
Val = 0;
473-
}
474-
return static_cast<uint64_t>(Val);
475-
};
476-
477467
auto Kern = HSAMetadataDoc->getMapNode();
478468

479469
Align MaxKernArgAlign;
480470
Kern[".kernarg_segment_size"] = Kern.getDocument()->getNode(
481471
STM.getKernArgSegmentSize(F, MaxKernArgAlign));
482472
Kern[".group_segment_fixed_size"] =
483473
Kern.getDocument()->getNode(ProgramInfo.LDSSize);
484-
Kern[".private_segment_fixed_size"] =
485-
Kern.getDocument()->getNode(GetMCExprValue(ProgramInfo.ScratchSize));
474+
DelayedExprs->assignDocNode(Kern[".private_segment_fixed_size"],
475+
msgpack::Type::UInt, ProgramInfo.ScratchSize);
486476
if (CodeObjectVersion >= AMDGPU::AMDHSA_COV5) {
487-
Kern[".uses_dynamic_stack"] = Kern.getDocument()->getNode(
488-
static_cast<bool>(GetMCExprValue(ProgramInfo.DynamicCallStack)));
477+
DelayedExprs->assignDocNode(Kern[".uses_dynamic_stack"],
478+
msgpack::Type::Boolean,
479+
ProgramInfo.DynamicCallStack);
489480
}
490481

491482
if (CodeObjectVersion >= AMDGPU::AMDHSA_COV5 && STM.supportsWGP())
@@ -497,15 +488,15 @@ MetadataStreamerMsgPackV4::getHSAKernelProps(const MachineFunction &MF,
497488
Kern.getDocument()->getNode(std::max(Align(4), MaxKernArgAlign).value());
498489
Kern[".wavefront_size"] =
499490
Kern.getDocument()->getNode(STM.getWavefrontSize());
500-
Kern[".sgpr_count"] =
501-
Kern.getDocument()->getNode(GetMCExprValue(ProgramInfo.NumSGPR));
502-
Kern[".vgpr_count"] =
503-
Kern.getDocument()->getNode(GetMCExprValue(ProgramInfo.NumVGPR));
491+
DelayedExprs->assignDocNode(Kern[".sgpr_count"], msgpack::Type::UInt,
492+
ProgramInfo.NumSGPR);
493+
DelayedExprs->assignDocNode(Kern[".vgpr_count"], msgpack::Type::UInt,
494+
ProgramInfo.NumVGPR);
504495

505496
// Only add AGPR count to metadata for supported devices
506497
if (STM.hasMAIInsts()) {
507-
Kern[".agpr_count"] =
508-
Kern.getDocument()->getNode(GetMCExprValue(ProgramInfo.NumAccVGPR));
498+
DelayedExprs->assignDocNode(Kern[".agpr_count"], msgpack::Type::UInt,
499+
ProgramInfo.NumAccVGPR);
509500
}
510501

511502
Kern[".max_flat_workgroup_size"] =
@@ -527,6 +518,7 @@ MetadataStreamerMsgPackV4::getHSAKernelProps(const MachineFunction &MF,
527518
}
528519

529520
bool MetadataStreamerMsgPackV4::emitTo(AMDGPUTargetStreamer &TargetStreamer) {
521+
DelayedExprs->resolveDelayedExpressions();
530522
return TargetStreamer.EmitHSAMetadata(*HSAMetadataDoc, true);
531523
}
532524

@@ -536,9 +528,11 @@ void MetadataStreamerMsgPackV4::begin(const Module &Mod,
536528
emitTargetID(TargetID);
537529
emitPrintf(Mod);
538530
getRootMetadata("amdhsa.kernels") = HSAMetadataDoc->getArrayNode();
531+
DelayedExprs->clear();
539532
}
540533

541534
void MetadataStreamerMsgPackV4::end() {
535+
DelayedExprs->resolveDelayedExpressions();
542536
std::string HSAMetadataString;
543537
raw_string_ostream StrOS(HSAMetadataString);
544538
HSAMetadataDoc->toYAML(StrOS);

llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
1616
#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
1717

18+
#include "Utils/AMDGPUDelayedMCExpr.h"
1819
#include "llvm/BinaryFormat/MsgPackDocument.h"
1920
#include "llvm/Support/AMDGPUMetadata.h"
2021
#include "llvm/Support/Alignment.h"
@@ -65,6 +66,9 @@ class MetadataStreamer {
6566
class LLVM_EXTERNAL_VISIBILITY MetadataStreamerMsgPackV4
6667
: public MetadataStreamer {
6768
protected:
69+
std::unique_ptr<DelayedMCExprs> DelayedExprs =
70+
std::make_unique<DelayedMCExprs>();
71+
6872
std::unique_ptr<msgpack::Document> HSAMetadataDoc =
6973
std::make_unique<msgpack::Document>();
7074

0 commit comments

Comments
 (0)