[PATCH] D50903: [TableGen] TypeInfer - Cache the legal types as TypeSetByHwMode
Simon Pilgrim via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 17 08:16:03 PDT 2018
RKSimon created this revision.
RKSimon added reviewers: kparzysz, fhahn, sdardis, zturner.
We were just caching the MVT set of legal types, then every call creating a new TypeSetByHwMode with it and passing it back on the stack. There's no need to do this - we can create and cache the whole TypeSetByHwMode once and return a const reference to it each time.
Additionally, TypeInfer::expandOverloads wasn't making use of the fact that the cache just contains a default mode containing all the types.
Saves up to 30secs in debug builds of x86 -gen-dag-isel.
Repository:
rL LLVM
https://reviews.llvm.org/D50903
Files:
utils/TableGen/CodeGenDAGPatterns.cpp
utils/TableGen/CodeGenDAGPatterns.h
Index: utils/TableGen/CodeGenDAGPatterns.h
===================================================================
--- utils/TableGen/CodeGenDAGPatterns.h
+++ utils/TableGen/CodeGenDAGPatterns.h
@@ -350,11 +350,11 @@
bool Validate = true; // Indicate whether to validate types.
private:
- TypeSetByHwMode getLegalTypes();
+ const TypeSetByHwMode &getLegalTypes();
- /// Cached legal types.
+ /// Cached legal types (in default mode).
bool LegalTypesCached = false;
- TypeSetByHwMode::SetType LegalCache = {};
+ TypeSetByHwMode LegalCache;
};
/// Set type used to track multiply used variables in patterns
Index: utils/TableGen/CodeGenDAGPatterns.cpp
===================================================================
--- utils/TableGen/CodeGenDAGPatterns.cpp
+++ utils/TableGen/CodeGenDAGPatterns.cpp
@@ -740,17 +740,12 @@
void TypeInfer::expandOverloads(TypeSetByHwMode &VTS) {
ValidateOnExit _1(VTS, *this);
- TypeSetByHwMode Legal = getLegalTypes();
- bool HaveLegalDef = Legal.hasDefault();
+ const TypeSetByHwMode &Legal = getLegalTypes();
+ assert(Legal.isDefaultOnly() && "Default-model only expected");
+ const TypeSetByHwMode::SetType &LegalTypes = Legal.get(DefaultMode);
- for (auto &I : VTS) {
- unsigned M = I.first;
- if (!Legal.hasMode(M) && !HaveLegalDef) {
- TP.error("Invalid mode " + Twine(M));
- return;
- }
- expandOverloads(I.second, Legal.get(M));
- }
+ for (auto &I : VTS)
+ expandOverloads(I.second, LegalTypes);
}
void TypeInfer::expandOverloads(TypeSetByHwMode::SetType &Out,
@@ -802,17 +797,17 @@
}
}
-TypeSetByHwMode TypeInfer::getLegalTypes() {
+const TypeSetByHwMode &TypeInfer::getLegalTypes() {
if (!LegalTypesCached) {
+ TypeSetByHwMode::SetType &LegalTypes = LegalCache.getOrCreate(DefaultMode);
// Stuff all types from all modes into the default mode.
const TypeSetByHwMode <S = TP.getDAGPatterns().getLegalTypes();
for (const auto &I : LTS)
- LegalCache.insert(I.second);
+ LegalTypes.insert(I.second);
LegalTypesCached = true;
}
- TypeSetByHwMode VTS;
- VTS.getOrCreate(DefaultMode) = LegalCache;
- return VTS;
+ assert(LegalCache.isDefaultOnly() && "Default-mode only expected");
+ return LegalCache;
}
#ifndef NDEBUG
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50903.161255.patch
Type: text/x-patch
Size: 2336 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180817/71eeb345/attachment.bin>
More information about the llvm-commits
mailing list