From 329a30820af098c20ed244bafd6b871081244c91 Mon Sep 17 00:00:00 2001 From: Alex Richardson Date: Thu, 4 Dec 2025 17:41:01 -0800 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20change?= =?UTF-8?q?s=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.8-beta.1 [skip ci] --- llvm/utils/TableGen/Common/CodeGenInstAlias.cpp | 17 ++++++----------- llvm/utils/TableGen/Common/CodeGenTarget.cpp | 10 ++++++---- llvm/utils/TableGen/Common/CodeGenTarget.h | 1 + 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp b/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp index 6c1a3e9977c28..04d4855b81d3b 100644 --- a/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp +++ b/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp @@ -44,20 +44,17 @@ static Expected matchSimpleOperand(const Init *Arg, const StringInit *ArgName, const Record *Op, const CodeGenTarget &T) { - if (Op->isSubClassOf("RegisterClass") || - Op->isSubClassOf("RegisterOperand")) { - const Record *OpRC = - Op->isSubClassOf("RegisterClass") ? Op : Op->getValueAsDef("RegClass"); - + if (const Record *OpRC = T.getAsRegClassLike(Op)) { if (const auto *ArgDef = dyn_cast(Arg)) { const Record *ArgRec = ArgDef->getDef(); // Match 'RegClass:$name' or 'RegOp:$name'. if (const Record *ArgRC = T.getInitValueAsRegClassLike(Arg)) { if (ArgRC->isSubClassOf("RegisterClass")) { - if (!T.getRegisterClass(OpRC).hasSubClass(&T.getRegisterClass(ArgRC))) + if (!OpRC->isSubClassOf("RegisterClass") || + !T.getRegisterClass(OpRC).hasSubClass(&T.getRegisterClass(ArgRC))) return createStringError( - "argument register class" + ArgRC->getName() + + "argument register class " + ArgRC->getName() + " is not a subclass of operand register class " + OpRC->getName()); if (!ArgName) @@ -111,11 +108,9 @@ static Expected matchSimpleOperand(const Init *Arg, return ResultOperand::createRecord(ArgName->getAsUnquotedString(), ArgDef->getDef()); } - - return createStringError("argument must be a subclass of Operand"); } - - llvm_unreachable("Unknown operand kind"); + return createStringError("argument must be a subclass of 'Operand' but got " + + Op->getName() + " instead"); } static Expected matchComplexOperand(const Init *Arg, diff --git a/llvm/utils/TableGen/Common/CodeGenTarget.cpp b/llvm/utils/TableGen/Common/CodeGenTarget.cpp index 9b05bcc76bf33..f093a61e5a6f6 100644 --- a/llvm/utils/TableGen/Common/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/Common/CodeGenTarget.cpp @@ -227,12 +227,14 @@ const Record *CodeGenTarget::getInitValueAsRegClassLike(const Init *V) const { const DefInit *VDefInit = dyn_cast(V); if (!VDefInit) return nullptr; + return getAsRegClassLike(VDefInit->getDef()); +} - const Record *RegClass = VDefInit->getDef(); - if (RegClass->isSubClassOf("RegisterOperand")) - return RegClass->getValueAsDef("RegClass"); +const Record *CodeGenTarget::getAsRegClassLike(const Record *Rec) const { + if (Rec->isSubClassOf("RegisterOperand")) + return Rec->getValueAsDef("RegClass"); - return RegClass->isSubClassOf("RegisterClassLike") ? RegClass : nullptr; + return Rec->isSubClassOf("RegisterClassLike") ? Rec : nullptr; } CodeGenSchedModels &CodeGenTarget::getSchedModels() const { diff --git a/llvm/utils/TableGen/Common/CodeGenTarget.h b/llvm/utils/TableGen/Common/CodeGenTarget.h index 5a9be8617dc18..d7390c72ea352 100644 --- a/llvm/utils/TableGen/Common/CodeGenTarget.h +++ b/llvm/utils/TableGen/Common/CodeGenTarget.h @@ -165,6 +165,7 @@ class CodeGenTarget { /// return the Record. This is used as a convenience function to handle direct /// RegisterClass references, or those wrapped in a RegisterOperand. const Record *getInitValueAsRegClassLike(const Init *V) const; + const Record *getAsRegClassLike(const Record *V) const; CodeGenSchedModels &getSchedModels() const;