Skip to content

Commit

Permalink
[AVX] Make BitsInit Unique
Browse files Browse the repository at this point in the history
Make BitsInit a FoldingSetNode so we can unique it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136489 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
greened committed Jul 29, 2011
1 parent 0ffd167 commit 726bbde
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
32 changes: 31 additions & 1 deletion utils/TableGen/Record.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 *
Expand Down
7 changes: 4 additions & 3 deletions utils/TableGen/Record.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -648,11 +649,9 @@ class BitInit : public Init {
/// 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.
Expand All @@ -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 {
Expand Down

0 comments on commit 726bbde

Please sign in to comment.