diff options
author | Rahul Joshi <rjoshi@nvidia.com> | 2024-09-04 14:58:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-04 14:58:01 -0700 |
commit | 660cc98647677815a3f5d97d00220071d8cf7a4f (patch) | |
tree | 97ced5182f7c0df7c4b2db67f10b261fb6ca6ba1 | |
parent | dcf0160bd61d150e7b94067fcd991b466a361b08 (diff) | |
download | llvm-660cc98647677815a3f5d97d00220071d8cf7a4f.zip llvm-660cc98647677815a3f5d97d00220071d8cf7a4f.tar.gz llvm-660cc98647677815a3f5d97d00220071d8cf7a4f.tar.bz2 |
[TableGen] Add `CodeGenIntrinsicsMap` for on-demand intrinsic creation (#107100)
- Add class `CodeGenIntrinsicMap` for on-demand creation of
`CodeGenIntrinsic`.
- Add class `CodeGenIntrinsicContext` to capture global information
required to build `CodeGenIntrinsic` objects.
- Adopt GlobalISel PatternParser and SearchableTableEmitter to use it.
-rw-r--r-- | llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp | 28 | ||||
-rw-r--r-- | llvm/utils/TableGen/Basic/CodeGenIntrinsics.h | 22 | ||||
-rw-r--r-- | llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp | 6 | ||||
-rw-r--r-- | llvm/utils/TableGen/Common/GlobalISel/PatternParser.cpp | 11 | ||||
-rw-r--r-- | llvm/utils/TableGen/SearchableTableEmitter.cpp | 13 |
5 files changed, 52 insertions, 28 deletions
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp index 4bca904..c0edbf0f 100644 --- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp +++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp @@ -25,20 +25,20 @@ using namespace llvm; // CodeGenIntrinsic Implementation //===----------------------------------------------------------------------===// -CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) { - std::vector<Record *> IntrProperties = - RC.getAllDerivedDefinitions("IntrinsicProperty"); - - std::vector<const Record *> DefaultProperties; - for (const Record *Rec : IntrProperties) +CodeGenIntrinsicContext::CodeGenIntrinsicContext(const RecordKeeper &RC) { + for (const Record *Rec : RC.getAllDerivedDefinitions("IntrinsicProperty")) if (Rec->getValueAsBit("IsDefault")) DefaultProperties.push_back(Rec); +} + +CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) { + CodeGenIntrinsicContext Ctx(RC); std::vector<Record *> Defs = RC.getAllDerivedDefinitions("Intrinsic"); Intrinsics.reserve(Defs.size()); for (const Record *Def : Defs) - Intrinsics.push_back(CodeGenIntrinsic(Def, DefaultProperties)); + Intrinsics.push_back(CodeGenIntrinsic(Def, Ctx)); llvm::sort(Intrinsics, [](const CodeGenIntrinsic &LHS, const CodeGenIntrinsic &RHS) { @@ -54,8 +54,18 @@ CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) { Targets.back().Count = Intrinsics.size() - Targets.back().Offset; } +CodeGenIntrinsic &CodeGenIntrinsicMap::operator[](const Record *Record) { + if (!Record->isSubClassOf("Intrinsic")) + PrintFatalError("Intrinsic defs should be subclass of 'Intrinsic' class"); + + auto [Iter, Inserted] = Map.try_emplace(Record); + if (Inserted) + Iter->second = std::make_unique<CodeGenIntrinsic>(Record, Ctx); + return *Iter->second; +} + CodeGenIntrinsic::CodeGenIntrinsic(const Record *R, - ArrayRef<const Record *> DefaultProperties) + const CodeGenIntrinsicContext &Ctx) : TheDef(R) { StringRef DefName = TheDef->getName(); ArrayRef<SMLoc> DefLoc = R->getLoc(); @@ -119,7 +129,7 @@ CodeGenIntrinsic::CodeGenIntrinsic(const Record *R, } // Set default properties to true. - setDefaultProperties(DefaultProperties); + setDefaultProperties(Ctx.DefaultProperties); // Also record the SDPatternOperator Properties. Properties = parseSDPatternOperatorProperties(R); diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h index 19e29af..51c2359 100644 --- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h +++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h @@ -15,6 +15,7 @@ #include "SDNodeProperties.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/ModRef.h" #include <string> @@ -25,6 +26,12 @@ namespace llvm { class Record; class RecordKeeper; +// Global information needed to build intrinsics. +struct CodeGenIntrinsicContext { + explicit CodeGenIntrinsicContext(const RecordKeeper &RC); + std::vector<const Record *> DefaultProperties; +}; + struct CodeGenIntrinsic { const Record *TheDef; // The actual record defining this intrinsic. std::string Name; // The name of the LLVM function "llvm.bswap.i32" @@ -155,8 +162,7 @@ struct CodeGenIntrinsic { bool isParamImmArg(unsigned ParamIdx) const; - CodeGenIntrinsic(const Record *R, - ArrayRef<const Record *> DefaultProperties = {}); + CodeGenIntrinsic(const Record *R, const CodeGenIntrinsicContext &Ctx); }; class CodeGenIntrinsicTable { @@ -171,7 +177,6 @@ public: std::vector<TargetSet> Targets; explicit CodeGenIntrinsicTable(const RecordKeeper &RC); - CodeGenIntrinsicTable() = default; bool empty() const { return Intrinsics.empty(); } size_t size() const { return Intrinsics.size(); } @@ -182,6 +187,17 @@ public: return Intrinsics[Pos]; } }; + +// This class builds `CodeGenIntrinsic` on demand for a given Def. +class CodeGenIntrinsicMap { + DenseMap<const Record *, std::unique_ptr<CodeGenIntrinsic>> Map; + const CodeGenIntrinsicContext Ctx; + +public: + explicit CodeGenIntrinsicMap(const RecordKeeper &RC) : Ctx(RC) {} + CodeGenIntrinsic &operator[](const Record *Def); +}; + } // namespace llvm #endif // LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp index a8cecca..df3f72ff 100644 --- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp @@ -3160,10 +3160,8 @@ void TreePattern::dump() const { print(errs()); } CodeGenDAGPatterns::CodeGenDAGPatterns(RecordKeeper &R, PatternRewriterFn PatternRewriter) - : Records(R), Target(R), LegalVTS(Target.getLegalValueTypes()), - PatternRewriter(PatternRewriter) { - - Intrinsics = CodeGenIntrinsicTable(Records); + : Records(R), Target(R), Intrinsics(R), + LegalVTS(Target.getLegalValueTypes()), PatternRewriter(PatternRewriter) { ParseNodeInfo(); ParseNodeTransforms(); ParseComplexPatterns(); diff --git a/llvm/utils/TableGen/Common/GlobalISel/PatternParser.cpp b/llvm/utils/TableGen/Common/GlobalISel/PatternParser.cpp index 82fa3c8..73b6097 100644 --- a/llvm/utils/TableGen/Common/GlobalISel/PatternParser.cpp +++ b/llvm/utils/TableGen/Common/GlobalISel/PatternParser.cpp @@ -107,13 +107,10 @@ getInstrForIntrinsic(const CodeGenTarget &CGT, const CodeGenIntrinsic *I) { static const CodeGenIntrinsic *getCodeGenIntrinsic(Record *R) { // Intrinsics need to have a static lifetime because the match table keeps // references to CodeGenIntrinsic objects. - static DenseMap<const Record *, std::unique_ptr<CodeGenIntrinsic>> - AllIntrinsics; - - auto &Ptr = AllIntrinsics[R]; - if (!Ptr) - Ptr = std::make_unique<CodeGenIntrinsic>(R); - return Ptr.get(); + static CodeGenIntrinsicMap *AllIntrinsics; + if (!AllIntrinsics) + AllIntrinsics = new CodeGenIntrinsicMap(R->getRecords()); + return &(*AllIntrinsics)[R]; } std::unique_ptr<Pattern> diff --git a/llvm/utils/TableGen/SearchableTableEmitter.cpp b/llvm/utils/TableGen/SearchableTableEmitter.cpp index 59ae3bf..8d394f8 100644 --- a/llvm/utils/TableGen/SearchableTableEmitter.cpp +++ b/llvm/utils/TableGen/SearchableTableEmitter.cpp @@ -94,7 +94,7 @@ struct GenericTable { class SearchableTableEmitter { RecordKeeper &Records; std::unique_ptr<CodeGenTarget> Target; - DenseMap<Init *, std::unique_ptr<CodeGenIntrinsic>> Intrinsics; + std::unique_ptr<CodeGenIntrinsicMap> Intrinsics; std::vector<std::unique_ptr<GenericEnum>> Enums; DenseMap<Record *, GenericEnum *> EnumMap; std::set<std::string> PreprocessorGuards; @@ -146,10 +146,13 @@ private: } CodeGenIntrinsic &getIntrinsic(Init *I) { - std::unique_ptr<CodeGenIntrinsic> &Intr = Intrinsics[I]; - if (!Intr) - Intr = std::make_unique<CodeGenIntrinsic>(cast<DefInit>(I)->getDef()); - return *Intr; + const Record *Def = cast<DefInit>(I)->getDef(); + // Build the Intrinsics map on demand. If we instantiate one in the + // constructor, we may get errors if the TableGen file being processed does + // not include Intrinsics.td and does not do anything with intrinsics. + if (!Intrinsics) + Intrinsics = std::make_unique<CodeGenIntrinsicMap>(Records); + return (*Intrinsics)[Def]; } bool compareBy(Record *LHS, Record *RHS, const SearchIndex &Index); |