diff options
Diffstat (limited to 'llvm/utils/TableGen/Common/CodeGenInstAlias.cpp')
| -rw-r--r-- | llvm/utils/TableGen/Common/CodeGenInstAlias.cpp | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp b/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp index f23ccf9aefd7..69e00295bf5b 100644 --- a/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp +++ b/llvm/utils/TableGen/Common/CodeGenInstAlias.cpp @@ -30,9 +30,9 @@ bool CodeGenInstAlias::tryAliasOpMatch(const DagInit *Result, ArrayRef<SMLoc> Loc, const CodeGenTarget &T, ResultOperand &ResOp) { - Init *Arg = Result->getArg(AliasOpNo); - DefInit *ADI = dyn_cast<DefInit>(Arg); - Record *ResultRecord = ADI ? ADI->getDef() : nullptr; + const Init *Arg = Result->getArg(AliasOpNo); + const DefInit *ADI = dyn_cast<DefInit>(Arg); + const Record *ResultRecord = ADI ? ADI->getDef() : nullptr; if (ADI && ADI->getDef() == InstOpRec) { // If the operand is a record, it must have a name, and the record type @@ -102,12 +102,12 @@ bool CodeGenInstAlias::tryAliasOpMatch(const DagInit *Result, // throw TGError(Loc, "reg0 used for result that is not an " // "OptionalDefOperand!"); - ResOp = ResultOperand(static_cast<Record *>(nullptr)); + ResOp = ResultOperand(nullptr); return true; } // Literal integers. - if (IntInit *II = dyn_cast<IntInit>(Arg)) { + if (const IntInit *II = dyn_cast<IntInit>(Arg)) { if (hasSubOps || !InstOpRec->isSubClassOf("Operand")) return false; // Integer arguments can't have names. @@ -119,17 +119,16 @@ bool CodeGenInstAlias::tryAliasOpMatch(const DagInit *Result, } // Bits<n> (also used for 0bxx literals) - if (BitsInit *BI = dyn_cast<BitsInit>(Arg)) { + if (const BitsInit *BI = dyn_cast<BitsInit>(Arg)) { if (hasSubOps || !InstOpRec->isSubClassOf("Operand")) return false; if (!BI->isComplete()) return false; // Convert the bits init to an integer and use that for the result. - IntInit *II = dyn_cast_or_null<IntInit>( - BI->convertInitializerTo(IntRecTy::get(BI->getRecordKeeper()))); - if (!II) + std::optional<int64_t> Value = BI->convertInitializerToInt(); + if (!Value) return false; - ResOp = ResultOperand(II->getValue()); + ResOp = ResultOperand(*Value); return true; } @@ -182,15 +181,15 @@ CodeGenInstAlias::CodeGenInstAlias(const Record *R, const CodeGenTarget &T) // NameClass - If argument names are repeated, we need to verify they have // the same class. - StringMap<Record *> NameClass; + StringMap<const Record *> NameClass; for (unsigned i = 0, e = Result->getNumArgs(); i != e; ++i) { - DefInit *ADI = dyn_cast<DefInit>(Result->getArg(i)); + const DefInit *ADI = dyn_cast<DefInit>(Result->getArg(i)); if (!ADI || !Result->getArgName(i)) continue; // Verify we don't have something like: (someinst GR16:$foo, GR32:$foo) // $foo can exist multiple times in the result list, but it must have the // same type. - Record *&Entry = NameClass[Result->getArgNameStr(i)]; + const Record *&Entry = NameClass[Result->getArgNameStr(i)]; if (Entry && Entry != ADI->getDef()) PrintFatalError(R->getLoc(), "result value $" + Result->getArgNameStr(i) + " is both " + Entry->getName() + @@ -235,9 +234,9 @@ CodeGenInstAlias::CodeGenInstAlias(const Record *R, const CodeGenTarget &T) // Otherwise, we need to match each of the suboperands individually. } else { - DagInit *MIOI = ResultInst->Operands[i].MIOperandInfo; + const DagInit *MIOI = ResultInst->Operands[i].MIOperandInfo; for (unsigned SubOp = 0; SubOp != NumSubOps; ++SubOp) { - Record *SubRec = cast<DefInit>(MIOI->getArg(SubOp))->getDef(); + const Record *SubRec = cast<DefInit>(MIOI->getArg(SubOp))->getDef(); // Take care to instantiate each of the suboperands with the correct // nomenclature: $foo.bar @@ -255,11 +254,11 @@ CodeGenInstAlias::CodeGenInstAlias(const Record *R, const CodeGenTarget &T) // If the argument did not match the instruction operand, and the operand // is composed of multiple suboperands, try matching the suboperands. if (NumSubOps > 1) { - DagInit *MIOI = ResultInst->Operands[i].MIOperandInfo; + const DagInit *MIOI = ResultInst->Operands[i].MIOperandInfo; for (unsigned SubOp = 0; SubOp != NumSubOps; ++SubOp) { if (AliasOpNo >= Result->getNumArgs()) PrintFatalError(R->getLoc(), "not enough arguments for instruction!"); - Record *SubRec = cast<DefInit>(MIOI->getArg(SubOp))->getDef(); + const Record *SubRec = cast<DefInit>(MIOI->getArg(SubOp))->getDef(); if (tryAliasOpMatch(Result, AliasOpNo, SubRec, false, R->getLoc(), T, ResOp)) { ResultOperands.push_back(ResOp); |
