From 594d93848abbc5aed0f49bedd5cd1163dc424272 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 17 Aug 2018 15:54:07 +0000 Subject: [PATCH] [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 --- utils/TableGen/CodeGenDAGPatterns.cpp | 25 ++++++++++--------------- utils/TableGen/CodeGenDAGPatterns.h | 6 +++--- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp index c9dc8a96c8c..dc88da220e8 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -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 diff --git a/utils/TableGen/CodeGenDAGPatterns.h b/utils/TableGen/CodeGenDAGPatterns.h index 9be3816cc7f..104feb90792 100644 --- a/utils/TableGen/CodeGenDAGPatterns.h +++ b/utils/TableGen/CodeGenDAGPatterns.h @@ -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