summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Greene <greened@obbligato.org>2011-07-29 19:07:11 +0000
committerDavid Greene <greened@obbligato.org>2011-07-29 19:07:11 +0000
commitdc7b96e909ec5fb8f49f900936356cc2f2e478aa (patch)
tree1d06bd5885f7e6a9da89d16f5b24d77f26c773dc
parent772b2c6bf14f6d2deebedebb08d2096928222e76 (diff)
downloadbcm5719-llvm-dc7b96e909ec5fb8f49f900936356cc2f2e478aa.tar.gz
bcm5719-llvm-dc7b96e909ec5fb8f49f900936356cc2f2e478aa.zip
[AVX] Make BitsInit Unique
Make BitsInit a FoldingSetNode so we can unique it. llvm-svn: 136489
-rw-r--r--llvm/utils/TableGen/Record.cpp32
-rw-r--r--llvm/utils/TableGen/Record.h7
2 files changed, 35 insertions, 4 deletions
diff --git a/llvm/utils/TableGen/Record.cpp b/llvm/utils/TableGen/Record.cpp
index 3e0038c9e67..77c0d1a491d 100644
--- a/llvm/utils/TableGen/Record.cpp
+++ b/llvm/utils/TableGen/Record.cpp
@@ -16,6 +16,8 @@
#include "Error.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/Format.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
@@ -455,8 +457,36 @@ const BitInit *BitInit::get(bool V) {
return V ? &True : &False;
}
+static void
+ProfileBitsInit(FoldingSetNodeID &ID, ArrayRef<const Init *> Range) {
+ ID.AddInteger(Range.size());
+
+ for (ArrayRef<const Init *>::iterator i = Range.begin(),
+ iend = Range.end();
+ i != iend;
+ ++i)
+ ID.AddPointer(*i);
+}
+
const BitsInit *BitsInit::get(ArrayRef<const Init *> Range) {
- return new BitsInit(Range);
+ typedef FoldingSet<BitsInit> Pool;
+ static Pool ThePool;
+
+ FoldingSetNodeID ID;
+ ProfileBitsInit(ID, Range);
+
+ void *IP = 0;
+ if (const BitsInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
+ return I;
+
+ BitsInit *I = new BitsInit(Range);
+ ThePool.InsertNode(I, IP);
+
+ return I;
+}
+
+void BitsInit::Profile(FoldingSetNodeID &ID) const {
+ ProfileBitsInit(ID, Bits);
}
const Init *
diff --git a/llvm/utils/TableGen/Record.h b/llvm/utils/TableGen/Record.h
index c3ce2dd6046..e70cad1a324 100644
--- a/llvm/utils/TableGen/Record.h
+++ b/llvm/utils/TableGen/Record.h
@@ -16,6 +16,7 @@
#define RECORD_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/FoldingSet.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/DataTypes.h"
@@ -648,11 +649,9 @@ public:
/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
/// It contains a vector of bits, whose size is determined by the type.
///
-class BitsInit : public Init {
+class BitsInit : public Init, public FoldingSetNode {
std::vector<const Init*> Bits;
- BitsInit(unsigned Size) : Bits(Size) {}
-
BitsInit(ArrayRef<const Init *> Range) : Bits(Range.begin(), Range.end()) {}
BitsInit(const BitsInit &Other); // Do not define.
@@ -661,6 +660,8 @@ class BitsInit : public Init {
public:
static const BitsInit *get(ArrayRef<const Init *> Range);
+ void Profile(FoldingSetNodeID &ID) const;
+
unsigned getNumBits() const { return Bits.size(); }
const Init *getBit(unsigned Bit) const {
OpenPOWER on IntegriCloud