[globalisel] Separate the SelectionDAG importer from the emitter. NFC

Summary:
In the near future the rules will be sorted between these two steps to
ensure that more important rules are not prevented by less important ones.

Reviewers: t.p.northover, ab, rovka, qcolombet, aditya_nandakumar

Reviewed By: ab

Subscribers: dberris, kristof.beyls, llvm-commits

Differential Revision: https://reviews.llvm.org/D29709

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295661 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Sanders 2017-02-20 14:31:27 +00:00
parent 05a06cba9e
commit 96269a3b39

View File

@ -45,7 +45,8 @@ using namespace llvm;
#define DEBUG_TYPE "gisel-emitter"
STATISTIC(NumPatternTotal, "Total number of patterns");
STATISTIC(NumPatternSkipped, "Number of patterns skipped");
STATISTIC(NumPatternImported, "Number of patterns imported from SelectionDAG");
STATISTIC(NumPatternImportsSkipped, "Number of SelectionDAG imports skipped");
STATISTIC(NumPatternEmitted, "Number of patterns emitted");
static cl::opt<bool> WarnOnSkippedPatterns(
@ -55,7 +56,6 @@ static cl::opt<bool> WarnOnSkippedPatterns(
cl::init(false));
namespace {
class RuleMatcher;
//===- Helper functions ---------------------------------------------------===//
@ -322,7 +322,7 @@ public:
return *static_cast<Kind *>(Actions.back().get());
}
void emit(raw_ostream &OS) {
void emit(raw_ostream &OS) const {
if (Matchers.empty())
llvm_unreachable("Unexpected empty matcher!");
@ -516,6 +516,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
}
// We're done with this pattern! It's eligible for GISel emission; return it.
++NumPatternImported;
return std::move(M);
}
@ -530,6 +531,7 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
"(MachineInstr &I) const {\n const MachineRegisterInfo &MRI = "
"I.getParent()->getParent()->getRegInfo();\n\n";
std::vector<RuleMatcher> Rules;
// Look through the SelectionDAG patterns we found, possibly emitting some.
for (const PatternToMatch &Pat : CGP.ptms()) {
++NumPatternTotal;
@ -544,11 +546,15 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
} else {
consumeError(std::move(Err));
}
++NumPatternSkipped;
++NumPatternImportsSkipped;
continue;
}
MatcherOrErr->emit(OS);
Rules.push_back(std::move(MatcherOrErr.get()));
}
for (const auto &Rule : Rules) {
Rule.emit(OS);
++NumPatternEmitted;
}