[llvm] [AMDGPU] Account for inline asm size in inst_pref_size calculation (PR #192306)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 16 07:24:18 PDT 2026
================
@@ -232,13 +232,61 @@ void AMDGPUAsmPrinter::emitFunctionBodyStart() {
HSAMetadataStream->emitKernel(*MF, CurrentProgramInfo);
}
+/// Set bits in a kernel descriptor MCExpr field:
+/// return ((Dst & ~Mask) | (Value << Shift))
+static const MCExpr *setBits(const MCExpr *Dst, const MCExpr *Value,
+ uint32_t Mask, uint32_t Shift, MCContext &Ctx) {
+ const auto *Shft = MCConstantExpr::create(Shift, Ctx);
+ const auto *Msk = MCConstantExpr::create(Mask, Ctx);
+ Dst = MCBinaryExpr::createAnd(Dst, MCUnaryExpr::createNot(Msk, Ctx), Ctx);
+ Dst = MCBinaryExpr::createOr(Dst, MCBinaryExpr::createShl(Value, Shft, Ctx),
+ Ctx);
+ return Dst;
+}
+
void AMDGPUAsmPrinter::endFunction(const MachineFunction *MF) {
const SIMachineFunctionInfo &MFI = *MF->getInfo<SIMachineFunctionInfo>();
if (!MFI.isEntryFunction())
return;
assert(TM.getTargetTriple().getOS() == Triple::AMDHSA);
+ const GCNSubtarget &STM = MF->getSubtarget<GCNSubtarget>();
+ MCContext &Ctx = MF->getContext();
+
+ AMDGPU::MCKernelDescriptor KD =
+ getAmdhsaKernelDescriptor(*MF, CurrentProgramInfo);
+
+ // Compute inst_pref_size using MCExpr label subtraction for exact code
+ // size. At this point .Lfunc_end has been emitted (by the base AsmPrinter)
+ // right after the function code, so (Lfunc_end - func_sym) gives the
+ // exact function code size in bytes.
+ // We store it as a separate KD field rather than OR'ing into
+ // compute_pgm_rsrc3, because the label subtraction MCExpr is unresolvable
+ // in text mode and would prevent printing of other fields (e.g.
+ // named_barrier_count) that share the same register.
+ if (isGFX11Plus(STM)) {
+ const MCExpr *CodeSizeExpr = MCBinaryExpr::createSub(
+ MCSymbolRefExpr::create(getFunctionEnd(), OutContext),
+ MCSymbolRefExpr::create(CurrentFnSym, OutContext), OutContext);
+
+ uint32_t Width;
+ if (isGFX11(STM)) {
----------------
arsenm wrote:
Same, also should really bee a hasInstPrefSize
https://github.com/llvm/llvm-project/pull/192306
More information about the llvm-commits
mailing list