summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MIRParser/MIParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MIParser.cpp')
-rw-r--r--llvm/lib/CodeGen/MIRParser/MIParser.cpp90
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;
}