[AVX] Make ListInits Unique
authorDavid Greene <greened@obbligato.org>
Fri, 29 Jul 2011 19:07:16 +0000 (19:07 +0000)
committerDavid Greene <greened@obbligato.org>
Fri, 29 Jul 2011 19:07:16 +0000 (19:07 +0000)
Ensure ListInits are unique and only created once.  This will be
important for AVX as lists will be used extensively to pass generic
patterns, prefix information and other things to lower-level
pattern-generation classes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136493 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/Record.cpp
utils/TableGen/Record.h

index 133a1581c0e3dfd083f6e091aaf8e65fa8df57a9..4608d7aa149674690db316115e99a65caac795c5 100644 (file)
@@ -583,8 +583,43 @@ const CodeInit *CodeInit::get(const std::string &V) {
   return I;
 }
 
+static void ProfileListInit(FoldingSetNodeID &ID,
+                            ArrayRef<const Init *> Range,
+                            RecTy *EltTy) {
+  ID.AddInteger(Range.size());
+  ID.AddPointer(EltTy);
+
+  for (ArrayRef<const Init *>::iterator i = Range.begin(),
+         iend = Range.end();
+       i != iend;
+       ++i)
+    ID.AddPointer(*i);
+}
+
 const ListInit *ListInit::get(ArrayRef<const Init *> Range, RecTy *EltTy) {
-  return new ListInit(Range, EltTy);
+  typedef FoldingSet<ListInit> Pool;
+  static Pool ThePool;
+
+  // Just use the FoldingSetNodeID to compute a hash.  Use a DenseMap
+  // for actual storage.
+  FoldingSetNodeID ID;
+  ProfileListInit(ID, Range, EltTy);
+
+  void *IP = 0;
+  if (const ListInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
+    return I;
+
+  ListInit *I = new ListInit(Range, EltTy);
+  ThePool.InsertNode(I, IP);
+  return I;
+}
+
+void ListInit::Profile(FoldingSetNodeID &ID) const {
+  ListRecTy *ListType = dynamic_cast<ListRecTy *>(getType());
+  assert(ListType && "Bad type for ListInit!");
+  RecTy *EltTy = ListType->getElementType();
+
+  ProfileListInit(ID, Values, EltTy);
 }
 
 const Init *
index e70cad1a324b6ea6f6669d1ed55d38dad42c5fd0..cbde0e9bdbc783c70f3facd7e24c169e98ad2e70 100644 (file)
@@ -1,3 +1,4 @@
+
 //===- Record.h - Classes to represent Table Records ------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
@@ -801,15 +802,12 @@ public:
 
 /// ListInit - [AL, AH, CL] - Represent a list of defs
 ///
-class ListInit : public TypedInit {
+class ListInit : public TypedInit, public FoldingSetNode {
   std::vector<const Init*> Values;
 public:
   typedef std::vector<const Init*>::const_iterator const_iterator;
 
-  explicit ListInit(std::vector<const Init*> &Vs, RecTy *EltTy)
-    : TypedInit(ListRecTy::get(EltTy)) {
-    Values.swap(Vs);
-  }
+private:
   explicit ListInit(ArrayRef<const Init *> Range, RecTy *EltTy)
       : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {}
 
@@ -819,6 +817,8 @@ public:
 public:
   static const ListInit *get(ArrayRef<const Init *> Range, RecTy *EltTy);
 
+  void Profile(FoldingSetNodeID &ID) const;
+
   unsigned getSize() const { return Values.size(); }
   const Init *getElement(unsigned i) const {
     assert(i < Values.size() && "List element index out of range!");