Ignore:
Timestamp:
Oct 22, 2014, 10:38:57 AM (5 years ago)
Author:
nmedfort
Message:

Couple changes in preperation for using phi nodes for test/accum variables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/codegenstate.h

    r4255 r4258  
    4040
    4141    PabloBlock(SymbolGenerator & symgen)
    42     : mSymbolGenerator(symgen)
    43     , mZeroes(new Zeroes())
     42    : mZeroes(new Zeroes())
    4443    , mOnes(new Ones())
     44    , mSymbolGenerator(symgen)
    4545    , mUnary(nullptr, this)
    4646    , mBinary(nullptr, this)
     
    5151
    5252    PabloBlock(PabloBlock & cg)
    53     : mSymbolGenerator(cg.mSymbolGenerator)
    54     , mZeroes(cg.mZeroes) // inherit the original "Zeroes" variable for simplicity
     53    : mZeroes(cg.mZeroes) // inherit the original "Zeroes" variable for simplicity
    5554    , mOnes(cg.mOnes) // inherit the original "Ones" variable for simplicity
     55    , mSymbolGenerator(cg.mSymbolGenerator)
    5656    , mUnary(&(cg.mUnary), this)
    5757    , mBinary(&(cg.mBinary), this)
     
    7474
    7575    inline Assign * createAssign(const std::string prefix, PabloAST * expr) {
     76        // TODO: should this test whether we've somehow created a var for this prior to
     77        // making the assignment?
    7678        Assign * assign = new Assign(mSymbolGenerator.get_ssa(prefix), expr);
    7779        mStatements.push_back(assign);
     
    7981    }
    8082
    81     Var * createVar(String * name);
    82 
    8383    inline Var * createVar(const std::string name) {
    84         return createVar(mSymbolGenerator.get(name));
     84        return createVar(mSymbolGenerator.get(name), false);
    8585    }
    8686
    8787    inline Var * createVar(Assign * assign) {
    88         return createVar(assign->mName);
     88        return createVar(assign->mName, true);
    8989    }
    9090
    9191    inline Var * createVar(Next * next) {
    92         return createVar(next->mInitial->mName);
     92        return createVar(next->mInitial->mName, true);
    9393    }
    9494
     
    134134    template<typename... Args>
    135135    struct ExpressionMap {
     136        enum {N = sizeof...(Args)};
    136137        typedef ExpressionMap<Args...> MapType;
    137138        typedef std::tuple<PabloAST::ClassTypeId, Args...> Key;
     
    144145        }
    145146
    146         template <class Type>
    147         inline Type * findOrMake(const PabloAST::ClassTypeId type, Args... args) {
     147        template <class Type, typename... Params>
     148        inline Type * findOrMake(const PabloAST::ClassTypeId type, Args... args, Params... params) {
    148149            Key key = std::make_tuple(type, args...);
    149             PabloAST * f = find(key);
     150            PabloAST * const f = find(key);
    150151            if (f) {
    151152                return cast<Type>(f);
    152153            }
    153             Type * expr = new Type(args...);
     154            Type * const expr = new Type(std::forward<Args>(args)..., std::forward<Params>(params)...);
    154155            insert(std::move(key), expr);
    155156            return expr;
    156157        }
    157158
    158         template <class Functor>
    159         inline PabloAST * findOrCall(const PabloAST::ClassTypeId type, Args... args) {
     159
     160        template <class Functor, typename... Params>
     161        inline PabloAST * findOrCall(const PabloAST::ClassTypeId type, Args... args, Params... params) {
    160162            Key key = std::make_tuple(type, args...);
    161             PabloAST * f = find(key);
     163            PabloAST * const f = find(key);
    162164            if (f) {
    163165                return f;
    164166            }
    165167            Functor mf(mCodeGenState);
    166             PabloAST * expr = mf(args...);
     168            PabloAST * const expr = mf(std::forward<Args>(args)..., std::forward<Params>(params)...);
    167169            insert(std::move(key), expr);
    168170            return expr;
     
    202204    }
    203205
    204 private:   
     206protected:
     207
     208    Var * createVar(String * name, const bool internal);
     209
     210private:       
     211    Zeroes * const                                      mZeroes;
     212    Ones * const                                        mOnes;
    205213    SymbolGenerator &                                   mSymbolGenerator;
    206     Zeroes *                                            mZeroes;
    207     Ones *                                              mOnes;
    208214    ExpressionMap<PabloAST *>                           mUnary;
    209215    ExpressionMap<PabloAST *, PabloAST *>               mBinary;
Note: See TracChangeset for help on using the changeset viewer.