diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h index 6d3d3bf39070..02aa7ee8b56a 100644 --- a/llvm/include/llvm/TableGen/Record.h +++ b/llvm/include/llvm/TableGen/Record.h @@ -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 &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 &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 &Operands) const override { assert(Operands.size() == 3 && diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index e1eb1d765ceb..31f2f6aa564b 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -609,15 +609,32 @@ Init *OpInit::getBit(unsigned Bit) const { return VarBitInit::get(const_cast(this), Bit); } -UnOpInit *UnOpInit::get(UnaryOp opc, Init *lhs, RecTy *Type) { - typedef std::pair, RecTy *> Key; - static DenseMap> 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 ThePool; + static std::vector> TheActualPool; - std::unique_ptr &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(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, 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> ThePool; +BinOpInit *BinOpInit::get(BinaryOp Opc, Init *LHS, + Init *RHS, RecTy *Type) { + static FoldingSet ThePool; + static std::vector> 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 &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(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, Init *>, - Init * - >, - Init * - > Key; + static FoldingSet ThePool; + static std::vector> TheActualPool; - static DenseMap> 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 &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(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,