forked from OSchip/llvm-project
[TableGen] TypeInfer - Cache the legal types as TypeSetByHwMode
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. Differential Revision: https://reviews.llvm.org/D50903 llvm-svn: 340042
This commit is contained in:
parent
2ec36f08a6
commit
45e61c5f99
|
@ -740,17 +740,12 @@ bool TypeInfer::EnforceSameSize(TypeSetByHwMode &A, TypeSetByHwMode &B) {
|
|||
|
||||
void TypeInfer::expandOverloads(TypeSetByHwMode &VTS) {
|
||||
ValidateOnExit _1(VTS, *this);
|
||||
TypeSetByHwMode Legal = getLegalTypes();
|
||||
bool HaveLegalDef = Legal.hasDefault();
|
||||
const TypeSetByHwMode &Legal = getLegalTypes();
|
||||
assert(Legal.isDefaultOnly() && "Default-mode 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 @@ void TypeInfer::expandOverloads(TypeSetByHwMode::SetType &Out,
|
|||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -350,11 +350,11 @@ struct TypeInfer {
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue