summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/Record.cpp
diff options
context:
space:
mode:
authorDavid Greene <greened@obbligato.org>2011-07-29 19:07:26 +0000
committerDavid Greene <greened@obbligato.org>2011-07-29 19:07:26 +0000
commita74bd90d3b899e398b58854224c8204e50f64d3c (patch)
tree5eb69a8a394888e3c7cfe641ad7d3599629655b2 /llvm/utils/TableGen/Record.cpp
parent760f867c7dda5ce55e493e4670f305e376c793eb (diff)
downloadbcm5719-llvm-a74bd90d3b899e398b58854224c8204e50f64d3c.tar.gz
bcm5719-llvm-a74bd90d3b899e398b58854224c8204e50f64d3c.zip
[AVX] Make DagInits Unique
Make sure DagInits are unique and created only once. llvm-svn: 136501
Diffstat (limited to 'llvm/utils/TableGen/Record.cpp')
-rw-r--r--llvm/utils/TableGen/Record.cpp45
1 files changed, 40 insertions, 5 deletions
diff --git a/llvm/utils/TableGen/Record.cpp b/llvm/utils/TableGen/Record.cpp
index d4e60839753..ed271cbdce0 100644
--- a/llvm/utils/TableGen/Record.cpp
+++ b/llvm/utils/TableGen/Record.cpp
@@ -1531,6 +1531,44 @@ const Init *FieldInit::resolveReferences(Record &R, const RecordVal *RV) const {
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 @@ DagInit::get(const Init *V, const std::string &VN,
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 {
OpenPOWER on IntegriCloud