diff options
Diffstat (limited to 'llvm/utils')
| -rw-r--r-- | llvm/utils/TableGen/GlobalISelEmitter.cpp | 54 | 
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" | 

