diff options
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MIParser.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 90 |
1 files changed, 65 insertions, 25 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index bfd9286ff59c..ede4291fe26d 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -35,6 +35,7 @@ #include "llvm/CodeGen/MachineMemOperand.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/PseudoSourceValueManager.h" #include "llvm/CodeGen/RegisterBank.h" #include "llvm/CodeGen/RegisterBankInfo.h" #include "llvm/CodeGen/TargetInstrInfo.h" @@ -500,7 +501,8 @@ public: bool parseAlignment(uint64_t &Alignment); bool parseAddrspace(unsigned &Addrspace); bool parseSectionID(std::optional<MBBSectionID> &SID); - bool parseBBID(std::optional<unsigned> &BBID); + bool parseBBID(std::optional<UniqueBBID> &BBID); + bool parseCallFrameSize(unsigned &CallFrameSize); bool parseOperandsOffset(MachineOperand &Op); bool parseIRValue(const Value *&V); bool parseMemoryOperandFlag(MachineMemOperand::Flags &Flags); @@ -665,13 +667,31 @@ bool MIParser::parseSectionID(std::optional<MBBSectionID> &SID) { } // Parse Machine Basic Block ID. -bool MIParser::parseBBID(std::optional<unsigned> &BBID) { +bool MIParser::parseBBID(std::optional<UniqueBBID> &BBID) { assert(Token.is(MIToken::kw_bb_id)); lex(); + unsigned BaseID = 0; + unsigned CloneID = 0; + if (getUnsigned(BaseID)) + return error("Unknown BB ID"); + lex(); + if (Token.is(MIToken::IntegerLiteral)) { + if (getUnsigned(CloneID)) + return error("Unknown Clone ID"); + lex(); + } + BBID = {BaseID, CloneID}; + return false; +} + +// Parse basic block call frame size. +bool MIParser::parseCallFrameSize(unsigned &CallFrameSize) { + assert(Token.is(MIToken::kw_call_frame_size)); + lex(); unsigned Value = 0; if (getUnsigned(Value)) - return error("Unknown BB ID"); - BBID = Value; + return error("Unknown call frame size"); + CallFrameSize = Value; lex(); return false; } @@ -692,7 +712,8 @@ bool MIParser::parseBasicBlockDefinition( bool IsEHFuncletEntry = false; std::optional<MBBSectionID> SectionID; uint64_t Alignment = 0; - std::optional<unsigned> BBID; + std::optional<UniqueBBID> BBID; + unsigned CallFrameSize = 0; BasicBlock *BB = nullptr; if (consumeIfPresent(MIToken::lparen)) { do { @@ -737,6 +758,10 @@ bool MIParser::parseBasicBlockDefinition( if (parseBBID(BBID)) return true; break; + case MIToken::kw_call_frame_size: + if (parseCallFrameSize(CallFrameSize)) + return true; + break; default: break; } @@ -781,6 +806,7 @@ bool MIParser::parseBasicBlockDefinition( MF.setBBSectionsType(BasicBlockSection::Labels); MBB->setBBID(BBID.value()); } + MBB->setCallFrameSize(CallFrameSize); return false; } @@ -1150,19 +1176,10 @@ bool MIParser::parse(MachineInstr *&MI) { MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true); MI->setFlags(Flags); - unsigned NumExplicitOps = 0; - for (const auto &Operand : Operands) { - bool IsImplicitOp = Operand.Operand.isReg() && Operand.Operand.isImplicit(); - if (!IsImplicitOp) { - if (!MCID.isVariadic() && NumExplicitOps >= MCID.getNumOperands() && - !Operand.Operand.isValidExcessOperand()) - return error(Operand.Begin, "too many operands for instruction"); - - ++NumExplicitOps; - } - + // Don't check the operands make sense, let the verifier catch any + // improprieties. + for (const auto &Operand : Operands) MI->addOperand(MF, Operand.Operand); - } if (assignRegisterTies(*MI, Operands)) return true; @@ -1439,6 +1456,7 @@ bool MIParser::verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands, bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) { // Allow frame and fast math flags for OPCODE + // clang-format off while (Token.is(MIToken::kw_frame_setup) || Token.is(MIToken::kw_frame_destroy) || Token.is(MIToken::kw_nnan) || @@ -1452,7 +1470,9 @@ bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) { Token.is(MIToken::kw_nsw) || Token.is(MIToken::kw_exact) || Token.is(MIToken::kw_nofpexcept) || + Token.is(MIToken::kw_noconvergent) || Token.is(MIToken::kw_unpredictable)) { + // clang-format on // Mine frame and fast math flags if (Token.is(MIToken::kw_frame_setup)) Flags |= MachineInstr::FrameSetup; @@ -1482,6 +1502,8 @@ bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) { Flags |= MachineInstr::NoFPExcept; if (Token.is(MIToken::kw_unpredictable)) Flags |= MachineInstr::Unpredictable; + if (Token.is(MIToken::kw_noconvergent)) + Flags |= MachineInstr::NoConvergent; lex(); } @@ -1916,12 +1938,28 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) { // Now we're looking for a vector. if (Token.isNot(MIToken::less)) - return error(Loc, - "expected sN, pA, <M x sN>, or <M x pA> for GlobalISel type"); + return error(Loc, "expected sN, pA, <M x sN>, <M x pA>, <vscale x M x sN>, " + "or <vscale x M x pA> for GlobalISel type"); lex(); - if (Token.isNot(MIToken::IntegerLiteral)) + bool HasVScale = + Token.is(MIToken::Identifier) && Token.stringValue() == "vscale"; + if (HasVScale) { + lex(); + if (Token.isNot(MIToken::Identifier) || Token.stringValue() != "x") + return error("expected <vscale x M x sN> or <vscale x M x pA>"); + lex(); + } + + auto GetError = [this, &HasVScale, Loc]() { + if (HasVScale) + return error( + Loc, "expected <vscale x M x sN> or <vscale M x pA> for vector type"); return error(Loc, "expected <M x sN> or <M x pA> for vector type"); + }; + + if (Token.isNot(MIToken::IntegerLiteral)) + return GetError(); uint64_t NumElements = Token.integerValue().getZExtValue(); if (!verifyVectorElementCount(NumElements)) return error("invalid number of vector elements"); @@ -1929,11 +1967,12 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) { lex(); if (Token.isNot(MIToken::Identifier) || Token.stringValue() != "x") - return error(Loc, "expected <M x sN> or <M x pA> for vector type"); + return GetError(); lex(); if (Token.range().front() != 's' && Token.range().front() != 'p') - return error(Loc, "expected <M x sN> or <M x pA> for vector type"); + return GetError(); + StringRef SizeStr = Token.range().drop_front(); if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit)) return error("expected integers after 's'/'p' type character"); @@ -1951,14 +1990,15 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) { Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS)); } else - return error(Loc, "expected <M x sN> or <M x pA> for vector type"); + return GetError(); lex(); if (Token.isNot(MIToken::greater)) - return error(Loc, "expected <M x sN> or <M x pA> for vector type"); + return GetError(); + lex(); - Ty = LLT::fixed_vector(NumElements, Ty); + Ty = LLT::vector(ElementCount::get(NumElements, HasVScale), Ty); return false; } |
