[llvm] MCExpr-ify SIProgramInfo (PR #88257)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 16 00:20:33 PDT 2024
================
@@ -86,6 +105,158 @@ bool AMDGPUVariadicMCExpr::evaluateAsRelocatableImpl(
MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const {
std::optional<int64_t> Total;
+ auto TryGetMCExprValue = [&](const MCExpr *Arg, uint64_t &ConstantValue) {
+ MCValue MCVal;
+ if (!Arg->evaluateAsRelocatable(MCVal, Layout, Fixup) ||
+ !MCVal.isAbsolute())
+ return false;
+
+ ConstantValue = MCVal.getConstant();
+ return true;
+ };
+
+ if (Kind == AGVK_ExtraSGPRs) {
+ assert(Args.size() == 5 &&
+ "AMDGPUVariadic Argument count incorrect for ExtraSGPRs");
+ uint64_t VCCUsed, FlatScrUsed, MajorVersion, XNACKUsed,
+ hasArchitectedFlatScr, ExtraSGPRs = 0;
+
+ bool Success = true;
+ Success &= TryGetMCExprValue(Args[0], MajorVersion);
+ Success &= TryGetMCExprValue(Args[3], XNACKUsed);
+ Success &= TryGetMCExprValue(Args[4], hasArchitectedFlatScr);
+
+ assert(Success &&
+ "Arguments 1, 4, and 5 for ExtraSGPRs should be known constants");
+ if (!Success || !TryGetMCExprValue(Args[1], VCCUsed) ||
+ !TryGetMCExprValue(Args[2], FlatScrUsed))
+ return false;
+
+ if (VCCUsed)
+ ExtraSGPRs = 2;
+ if (MajorVersion >= 10) {
+ Res = MCValue::get(ExtraSGPRs);
+ return true;
+ }
+ if (MajorVersion < 8) {
+ if (FlatScrUsed)
+ ExtraSGPRs = 4;
+ } else {
+ if (XNACKUsed)
+ ExtraSGPRs = 4;
+ if (FlatScrUsed || hasArchitectedFlatScr)
+ ExtraSGPRs = 6;
+ }
+
+ Res = MCValue::get(ExtraSGPRs);
+ return true;
+ }
+
+ if (Kind == AGVK_AlignTo) {
+ assert(Args.size() == 2 &&
+ "AMDGPUVariadic Argument count incorrect for AlignTo");
+ uint64_t Value, Align;
+ if (!TryGetMCExprValue(Args[0], Value) ||
+ !TryGetMCExprValue(Args[1], Align))
+ return false;
+
+ Res = MCValue::get(alignTo(Value, Align));
+ return true;
+ }
+
+ if (Kind == AGVK_TotalNumVGPRs90A) {
+ assert(Args.size() == 2 &&
+ "AMDGPUVariadic Argument count incorrect for TotalNumVGPRs90A");
+ uint64_t NumAGPR, NumVGPR, Total;
+ if (!TryGetMCExprValue(Args[0], NumAGPR) ||
+ !TryGetMCExprValue(Args[1], NumVGPR))
+ return false;
+
+ if (NumAGPR) {
+ Total = alignTo(NumVGPR, 4) + NumAGPR;
+ } else {
+ Total = std::max(NumVGPR, NumAGPR);
+ }
----------------
Pierre-vh wrote:
nit: can drop `{}` here or just use a ternary
https://github.com/llvm/llvm-project/pull/88257
More information about the llvm-commits
mailing list