From: David Greene Date: Fri, 29 Jul 2011 19:07:20 +0000 (+0000) Subject: [AVX] Make TernOpInit Unique X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b76a1e6993fa4020a6c1ef552fdf4f564b706fac;p=oota-llvm.git [AVX] Make TernOpInit Unique Make sure TernOpInits are unique and created only once. This will be important for AVX/SIMD as many operators will be used to generate patterns and other relevant data. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136496 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp index 56a46e195b4..a6b5c4b884d 100644 --- a/utils/TableGen/Record.cpp +++ b/utils/TableGen/Record.cpp @@ -975,7 +975,26 @@ std::string BinOpInit::getAsString() const { const TernOpInit *TernOpInit::get(TernaryOp opc, const Init *lhs, const Init *mhs, const Init *rhs, RecTy *Type) { - return new TernOpInit(opc, lhs, mhs, rhs, Type); + typedef std::pair< + std::pair< + std::pair, const Init *>, + const Init * + >, + const Init * + > Key; + + typedef DenseMap Pool; + static Pool ThePool; + + Key TheKey(std::make_pair(std::make_pair(std::make_pair(std::make_pair(opc, + Type), + lhs), + mhs), + rhs)); + + TernOpInit *&I = ThePool[TheKey]; + if (!I) I = new TernOpInit(opc, lhs, mhs, rhs, Type); + return I; } static const Init *ForeachHelper(const Init *LHS, const Init *MHS,