summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/GlobalISelEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen/GlobalISelEmitter.cpp')
-rw-r--r--llvm/utils/TableGen/GlobalISelEmitter.cpp54
1 files changed, 28 insertions, 26 deletions
diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp
index 47f974ac5ed..2cfcadd5e80 100644
--- a/llvm/utils/TableGen/GlobalISelEmitter.cpp
+++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp
@@ -53,6 +53,8 @@ STATISTIC(NumPatternTotal, "Total number of patterns");
STATISTIC(NumPatternImported, "Number of patterns imported from SelectionDAG");
STATISTIC(NumPatternImportsSkipped, "Number of SelectionDAG imports skipped");
STATISTIC(NumPatternEmitted, "Number of patterns emitted");
+/// A unique identifier for a MatchTable.
+static unsigned CurrentMatchTableID = 0;
cl::OptionCategory GlobalISelEmitterCat("Options for -gen-global-isel");
@@ -301,9 +303,6 @@ class MatchTable {
/// Tracks the sum of MatchTableRecord::NumElements as the table is built.
unsigned CurrentSize;
- /// A unique identifier for a MatchTable label.
- static unsigned CurrentLabelID;
-
public:
static MatchTableRecord LineBreak;
static MatchTableRecord Comment(StringRef Comment) {
@@ -339,7 +338,7 @@ public:
MatchTableRecord::MTRF_LineBreakFollows);
}
static MatchTableRecord JumpTarget(unsigned LabelID) {
- return MatchTableRecord(LabelID, "Label " + llvm::to_string(LabelID), 1,
+ return MatchTableRecord(LabelID, "Label " + llvm::to_string(LabelID), 0,
MatchTableRecord::MTRF_JumpTarget |
MatchTableRecord::MTRF_Comment |
MatchTableRecord::MTRF_CommaFollows);
@@ -354,10 +353,8 @@ public:
CurrentSize += Value.size();
}
- unsigned allocateLabelID() const { return CurrentLabelID++; }
-
void defineLabel(unsigned LabelID) {
- LabelMap.insert(std::make_pair(LabelID, CurrentSize));
+ LabelMap.insert(std::make_pair(LabelID, CurrentSize + 1));
}
unsigned getLabelIndex(unsigned LabelID) const {
@@ -366,9 +363,7 @@ public:
return I->second;
}
- void emitUse(raw_ostream &OS) const { OS << "MatchTable" << ID; }
-
- void emitDeclaration(raw_ostream &OS) const {
+ void emit(raw_ostream &OS) const {
unsigned Indentation = 4;
OS << " const static int64_t MatchTable" << ID << "[] = {";
LineBreak.emit(OS, true, *this);
@@ -399,8 +394,6 @@ public:
}
};
-unsigned MatchTable::CurrentLabelID = 0;
-
MatchTableRecord MatchTable::LineBreak = {
None, "" /* Emit String */, 0 /* Elements */,
MatchTableRecord::MTRF_LineBreakFollows};
@@ -443,6 +436,11 @@ MatchTable &operator<<(MatchTable &Table, const MatchTableRecord &Value) {
return Table;
}
+raw_ostream &operator<<(raw_ostream &OS, const MatchTable &Table) {
+ Table.emit(OS);
+ return OS;
+}
+
//===- Matchers -----------------------------------------------------------===//
class OperandMatcher;
@@ -491,7 +489,7 @@ public:
void emitCaptureOpcodes(MatchTable &Table);
- void emit(MatchTable &Table);
+ void emit(raw_ostream &OS);
/// Compare the priority of this object and B.
///
@@ -1550,7 +1548,7 @@ void RuleMatcher::emitCaptureOpcodes(MatchTable &Table) {
Matchers.front()->emitCaptureOpcodes(Table, *this, InsnVarID);
}
-void RuleMatcher::emit(MatchTable &Table) {
+void RuleMatcher::emit(raw_ostream &OS) {
if (Matchers.empty())
llvm_unreachable("Unexpected empty matcher!");
@@ -1565,9 +1563,9 @@ void RuleMatcher::emit(MatchTable &Table) {
// on some targets but we don't need to make use of that yet.
assert(Matchers.size() == 1 && "Cannot handle multi-root matchers yet");
- unsigned LabelID = Table.allocateLabelID();
+ MatchTable Table(CurrentMatchTableID);
Table << MatchTable::Opcode("GIM_Try", +1)
- << MatchTable::Comment("On fail goto") << MatchTable::JumpTarget(LabelID)
+ << MatchTable::Comment("On fail goto") << MatchTable::JumpTarget(0)
<< MatchTable::LineBreak;
if (!RequiredFeatures.empty()) {
@@ -1641,7 +1639,16 @@ void RuleMatcher::emit(MatchTable &Table) {
for (const auto &MA : Actions)
MA->emitActionOpcodes(Table, *this, 0);
Table << MatchTable::Opcode("GIR_Done", -1) << MatchTable::LineBreak
- << MatchTable::Label(LabelID);
+ << MatchTable::Label(0) << MatchTable::Opcode("GIM_Reject")
+ << MatchTable::LineBreak;
+ OS << Table
+ << " State.MIs.resize(1);\n"
+ << " DEBUG(dbgs() << \"Processing MatchTable" << CurrentMatchTableID
+ << "\\n\");\n"
+ << " if (executeMatchTable(*this, OutMIs, State, MatcherInfo, MatchTable"
+ << CurrentMatchTableID << ", TII, MRI, TRI, RBI, AvailableFeatures)) {\n"
+ << " return true;\n"
+ << " }\n\n";
}
bool RuleMatcher::isHigherPriorityThan(const RuleMatcher &B) const {
@@ -2491,18 +2498,13 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
<< " State.MIs.clear();\n"
<< " State.MIs.push_back(&I);\n\n";
- MatchTable Table(0);
for (auto &Rule : Rules) {
- Rule.emit(Table);
+ Rule.emit(OS);
+ ++CurrentMatchTableID;
++NumPatternEmitted;
+ assert(CurrentMatchTableID == NumPatternEmitted &&
+ "Statistic deviates from number of emitted tables");
}
- Table << MatchTable::Opcode("GIM_Reject") << MatchTable::LineBreak;
- Table.emitDeclaration(OS);
- OS << " if (executeMatchTable(*this, OutMIs, State, MatcherInfo, ";
- Table.emitUse(OS);
- OS << ", TII, MRI, TRI, RBI, AvailableFeatures)) {\n"
- << " return true;\n"
- << " }\n\n";
OS << " return false;\n"
<< "}\n"
OpenPOWER on IntegriCloud