[AVX] Make DagInits Unique
Make sure DagInits are unique and created only once.
llvm-svn: 136501
diff --git a/llvm/utils/TableGen/Record.cpp b/llvm/utils/TableGen/Record.cpp
index d4e6083..ed271cb 100644
--- a/llvm/utils/TableGen/Record.cpp
+++ b/llvm/utils/TableGen/Record.cpp
@@ -1531,6 +1531,44 @@
return this;
}
+void ProfileDagInit(FoldingSetNodeID &ID,
+ const Init *V,
+ const std::string &VN,
+ ArrayRef<const Init *> ArgRange,
+ ArrayRef<std::string> NameRange) {
+ ID.AddPointer(V);
+ ID.AddString(VN);
+
+ ArrayRef<const Init *>::iterator Arg = ArgRange.begin();
+ ArrayRef<std::string>::iterator Name = NameRange.begin();
+ while (Arg != ArgRange.end()) {
+ assert(Name != NameRange.end() && "Arg name underflow!");
+ ID.AddPointer(*Arg++);
+ ID.AddString(*Name++);
+ }
+ assert(Name == NameRange.end() && "Arg name overflow!");
+}
+
+const DagInit *
+DagInit::get(const Init *V, const std::string &VN,
+ ArrayRef<const Init *> ArgRange,
+ ArrayRef<std::string> NameRange) {
+ typedef FoldingSet<DagInit> Pool;
+ static Pool ThePool;
+
+ FoldingSetNodeID ID;
+ ProfileDagInit(ID, V, VN, ArgRange, NameRange);
+
+ void *IP = 0;
+ if (const DagInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
+ return I;
+
+ DagInit *I = new DagInit(V, VN, ArgRange, NameRange);
+ ThePool.InsertNode(I, IP);
+
+ return I;
+}
+
const DagInit *
DagInit::get(const Init *V, const std::string &VN,
const std::vector<std::pair<const Init*, std::string> > &args) {
@@ -1550,11 +1588,8 @@
return DagInit::get(V, VN, Args, Names);
}
-const DagInit *
-DagInit::get(const Init *V, const std::string &VN,
- const std::vector<const Init*> &args,
- const std::vector<std::string> &argNames) {
- return new DagInit(V, VN, args, argNames);
+void DagInit::Profile(FoldingSetNodeID &ID) const {
+ ProfileDagInit(ID, Val, ValName, Args, ArgNames);
}
const Init *DagInit::resolveReferences(Record &R, const RecordVal *RV) const {