mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[TableGen] Use FoldingSets instead of DenseMaps to unique UnOpInit, BinOpInit and TernOpInit. This remove the memory needed to store the key for the DenseMap. NFC
llvm-svn: 258071
This commit is contained in:
parent
4b8a0e95c4
commit
7b0b0f6cca
@ -683,7 +683,7 @@ public:
|
||||
|
||||
/// UnOpInit - !op (X) - Transform an init.
|
||||
///
|
||||
class UnOpInit : public OpInit {
|
||||
class UnOpInit : public OpInit, public FoldingSetNode {
|
||||
public:
|
||||
enum UnaryOp : uint8_t { CAST, HEAD, TAIL, EMPTY };
|
||||
|
||||
@ -702,6 +702,8 @@ public:
|
||||
}
|
||||
static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
|
||||
|
||||
void Profile(FoldingSetNodeID &ID) const;
|
||||
|
||||
// Clone - Clone this operator, replacing arguments with the new list
|
||||
OpInit *clone(std::vector<Init *> &Operands) const override {
|
||||
assert(Operands.size() == 1 &&
|
||||
@ -729,7 +731,7 @@ public:
|
||||
|
||||
/// BinOpInit - !op (X, Y) - Combine two inits.
|
||||
///
|
||||
class BinOpInit : public OpInit {
|
||||
class BinOpInit : public OpInit, public FoldingSetNode {
|
||||
public:
|
||||
enum BinaryOp : uint8_t { ADD, AND, SHL, SRA, SRL, LISTCONCAT,
|
||||
STRCONCAT, CONCAT, EQ };
|
||||
@ -750,6 +752,8 @@ public:
|
||||
static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
|
||||
RecTy *Type);
|
||||
|
||||
void Profile(FoldingSetNodeID &ID) const;
|
||||
|
||||
// Clone - Clone this operator, replacing arguments with the new list
|
||||
OpInit *clone(std::vector<Init *> &Operands) const override {
|
||||
assert(Operands.size() == 2 &&
|
||||
@ -781,7 +785,7 @@ public:
|
||||
|
||||
/// TernOpInit - !op (X, Y, Z) - Combine two inits.
|
||||
///
|
||||
class TernOpInit : public OpInit {
|
||||
class TernOpInit : public OpInit, public FoldingSetNode {
|
||||
public:
|
||||
enum TernaryOp : uint8_t { SUBST, FOREACH, IF };
|
||||
|
||||
@ -803,6 +807,8 @@ public:
|
||||
Init *mhs, Init *rhs,
|
||||
RecTy *Type);
|
||||
|
||||
void Profile(FoldingSetNodeID &ID) const;
|
||||
|
||||
// Clone - Clone this operator, replacing arguments with the new list
|
||||
OpInit *clone(std::vector<Init *> &Operands) const override {
|
||||
assert(Operands.size() == 3 &&
|
||||
|
@ -609,15 +609,32 @@ Init *OpInit::getBit(unsigned Bit) const {
|
||||
return VarBitInit::get(const_cast<OpInit*>(this), Bit);
|
||||
}
|
||||
|
||||
UnOpInit *UnOpInit::get(UnaryOp opc, Init *lhs, RecTy *Type) {
|
||||
typedef std::pair<std::pair<unsigned, Init *>, RecTy *> Key;
|
||||
static DenseMap<Key, std::unique_ptr<UnOpInit>> ThePool;
|
||||
static void
|
||||
ProfileUnOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *Op, RecTy *Type) {
|
||||
ID.AddInteger(Opcode);
|
||||
ID.AddPointer(Op);
|
||||
ID.AddPointer(Type);
|
||||
}
|
||||
|
||||
Key TheKey(std::make_pair(std::make_pair(opc, lhs), Type));
|
||||
UnOpInit *UnOpInit::get(UnaryOp Opc, Init *LHS, RecTy *Type) {
|
||||
static FoldingSet<UnOpInit> ThePool;
|
||||
static std::vector<std::unique_ptr<UnOpInit>> TheActualPool;
|
||||
|
||||
std::unique_ptr<UnOpInit> &I = ThePool[TheKey];
|
||||
if (!I) I.reset(new UnOpInit(opc, lhs, Type));
|
||||
return I.get();
|
||||
FoldingSetNodeID ID;
|
||||
ProfileUnOpInit(ID, Opc, LHS, Type);
|
||||
|
||||
void *IP = nullptr;
|
||||
if (UnOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
|
||||
return I;
|
||||
|
||||
UnOpInit *I = new UnOpInit(Opc, LHS, Type);
|
||||
ThePool.InsertNode(I, IP);
|
||||
TheActualPool.push_back(std::unique_ptr<UnOpInit>(I));
|
||||
return I;
|
||||
}
|
||||
|
||||
void UnOpInit::Profile(FoldingSetNodeID &ID) const {
|
||||
ProfileUnOpInit(ID, getOpcode(), getOperand(), getType());
|
||||
}
|
||||
|
||||
Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
|
||||
@ -737,21 +754,35 @@ std::string UnOpInit::getAsString() const {
|
||||
return Result + "(" + LHS->getAsString() + ")";
|
||||
}
|
||||
|
||||
BinOpInit *BinOpInit::get(BinaryOp opc, Init *lhs,
|
||||
Init *rhs, RecTy *Type) {
|
||||
typedef std::pair<
|
||||
std::pair<std::pair<unsigned, Init *>, Init *>,
|
||||
RecTy *
|
||||
> Key;
|
||||
static void
|
||||
ProfileBinOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *LHS, Init *RHS,
|
||||
RecTy *Type) {
|
||||
ID.AddInteger(Opcode);
|
||||
ID.AddPointer(LHS);
|
||||
ID.AddPointer(RHS);
|
||||
ID.AddPointer(Type);
|
||||
}
|
||||
|
||||
static DenseMap<Key, std::unique_ptr<BinOpInit>> ThePool;
|
||||
BinOpInit *BinOpInit::get(BinaryOp Opc, Init *LHS,
|
||||
Init *RHS, RecTy *Type) {
|
||||
static FoldingSet<BinOpInit> ThePool;
|
||||
static std::vector<std::unique_ptr<BinOpInit>> TheActualPool;
|
||||
|
||||
Key TheKey(std::make_pair(std::make_pair(std::make_pair(opc, lhs), rhs),
|
||||
Type));
|
||||
FoldingSetNodeID ID;
|
||||
ProfileBinOpInit(ID, Opc, LHS, RHS, Type);
|
||||
|
||||
std::unique_ptr<BinOpInit> &I = ThePool[TheKey];
|
||||
if (!I) I.reset(new BinOpInit(opc, lhs, rhs, Type));
|
||||
return I.get();
|
||||
void *IP = nullptr;
|
||||
if (BinOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
|
||||
return I;
|
||||
|
||||
BinOpInit *I = new BinOpInit(Opc, LHS, RHS, Type);
|
||||
ThePool.InsertNode(I, IP);
|
||||
TheActualPool.push_back(std::unique_ptr<BinOpInit>(I));
|
||||
return I;
|
||||
}
|
||||
|
||||
void BinOpInit::Profile(FoldingSetNodeID &ID) const {
|
||||
ProfileBinOpInit(ID, getOpcode(), getLHS(), getRHS(), getType());
|
||||
}
|
||||
|
||||
Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
|
||||
@ -870,27 +901,36 @@ std::string BinOpInit::getAsString() const {
|
||||
return Result + "(" + LHS->getAsString() + ", " + RHS->getAsString() + ")";
|
||||
}
|
||||
|
||||
TernOpInit *TernOpInit::get(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
|
||||
static void
|
||||
ProfileTernOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *LHS, Init *MHS,
|
||||
Init *RHS, RecTy *Type) {
|
||||
ID.AddInteger(Opcode);
|
||||
ID.AddPointer(LHS);
|
||||
ID.AddPointer(MHS);
|
||||
ID.AddPointer(RHS);
|
||||
ID.AddPointer(Type);
|
||||
}
|
||||
|
||||
TernOpInit *TernOpInit::get(TernaryOp Opc, Init *LHS, Init *MHS, Init *RHS,
|
||||
RecTy *Type) {
|
||||
typedef std::pair<
|
||||
std::pair<
|
||||
std::pair<std::pair<unsigned, RecTy *>, Init *>,
|
||||
Init *
|
||||
>,
|
||||
Init *
|
||||
> Key;
|
||||
static FoldingSet<TernOpInit> ThePool;
|
||||
static std::vector<std::unique_ptr<TernOpInit>> TheActualPool;
|
||||
|
||||
static DenseMap<Key, std::unique_ptr<TernOpInit>> ThePool;
|
||||
FoldingSetNodeID ID;
|
||||
ProfileTernOpInit(ID, Opc, LHS, MHS, RHS, Type);
|
||||
|
||||
Key TheKey(std::make_pair(std::make_pair(std::make_pair(std::make_pair(opc,
|
||||
Type),
|
||||
lhs),
|
||||
mhs),
|
||||
rhs));
|
||||
void *IP = nullptr;
|
||||
if (TernOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP))
|
||||
return I;
|
||||
|
||||
std::unique_ptr<TernOpInit> &I = ThePool[TheKey];
|
||||
if (!I) I.reset(new TernOpInit(opc, lhs, mhs, rhs, Type));
|
||||
return I.get();
|
||||
TernOpInit *I = new TernOpInit(Opc, LHS, MHS, RHS, Type);
|
||||
ThePool.InsertNode(I, IP);
|
||||
TheActualPool.push_back(std::unique_ptr<TernOpInit>(I));
|
||||
return I;
|
||||
}
|
||||
|
||||
void TernOpInit::Profile(FoldingSetNodeID &ID) const {
|
||||
ProfileTernOpInit(ID, getOpcode(), getLHS(), getMHS(), getRHS(), getType());
|
||||
}
|
||||
|
||||
static Init *ForeachHelper(Init *LHS, Init *MHS, Init *RHS, RecTy *Type,
|
||||
|
Loading…
x
Reference in New Issue
Block a user