summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2017-12-19 02:57:23 +0000
committerQuentin Colombet <qcolombet@apple.com>2017-12-19 02:57:23 +0000
commit63a328c30c8d02f79944f1496356bf13d2a2ac12 (patch)
treef45bc88818850e01fde1d79e6b41f8f5fa15f76a /llvm
parent8516b7f6b5b079fd617882cd739d377f5bb38678 (diff)
downloadbcm5719-llvm-63a328c30c8d02f79944f1496356bf13d2a2ac12.tar.gz
bcm5719-llvm-63a328c30c8d02f79944f1496356bf13d2a2ac12.zip
[TableGen][GlobalISel] Reset the internal map of RuleMatchers just before the emission
Between the creation of the last InstructionMatcher and the first emission of the related Rule, we need to clear the internal map of IDs. We used to do that right after the creation of the main InstructionMatcher when building the rule and although that worked, this is fragile because if for some reason some later code decides to create more InstructionMatcher before the final call to emit, then the IDs would be completely messed up. Move that to the beginning of "emit" so that the IDs are guarantee to be consistent. NFC. llvm-svn: 321053
Diffstat (limited to 'llvm')
-rw-r--r--llvm/utils/TableGen/GlobalISelEmitter.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp
index d7f87eac8d4..15400c07279 100644
--- a/llvm/utils/TableGen/GlobalISelEmitter.cpp
+++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp
@@ -2346,6 +2346,10 @@ void RuleMatcher::emit(MatchTable &Table) {
if (Matchers.empty())
llvm_unreachable("Unexpected empty matcher!");
+ // Reset the ID generation so that the emitted IDs match the ones
+ // we set while building the InstructionMatcher and such.
+ clearImplicitMap();
+
// The representation supports rules that require multiple roots such as:
// %ptr(p0) = ...
// %elt0(s32) = G_LOAD %ptr
@@ -3352,9 +3356,6 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
unsigned TempOpIdx = 0;
auto InsnMatcherOrError =
createAndImportSelDAGMatcher(M, InsnMatcherTemp, Src, TempOpIdx);
- // Reset the ID generation so that the emitted IDs match the ones
- // in the InstructionMatcher and such.
- M.clearImplicitMap();
if (auto Error = InsnMatcherOrError.takeError())
return std::move(Error);
InstructionMatcher &InsnMatcher = InsnMatcherOrError.get();
OpenPOWER on IntegriCloud