#pragma once #include class Access; class Array; class Loop; class AllLoops; class Access { public: Access(SgExpression *_exp, Array *_parent); ~Access() { } void setExp(char* _exp); void setExp(SgExpression *_exp); char* getExpChar(); SgExpression* getExp(); void incOperW(); void incOperR(); Array* getParentArray(); void setParentArray(Array *_parent); std::vector* getAlignOnLoop(); void matchLoopIdxs(std::vector &symbols); private: char *expAcc; SgExpression *exp; int operation[2]; Array *parentArray; std::vector alignOnLoop; bool matchRecursion(SgExpression *_exp, SgSymbol *symb); }; class Array { public: Array(int _dim, char *_name, Loop *_parent); Array(char *_name, Loop *_parent); ~Array() { } void setDimNum(int _num); int getDimNum(); std::vector* getAcrDims(); std::vector* getAlignOnLoop(); void addTfmDim(int _dim); std::vector *getTfmDims(); void addAccess(Access* _newAccess); Access* getAccess(char* _expAcc); std::vector* getAccesses(); Loop* getParentLoop(); void setParentLoop(Loop *_loop); void setArrayName(char* _name); char* getArrayName(); int getAcrType(); void setAcrType(int _type); std::vector* getIfCals(); std::vector* getElseCals(); std::vector* getZeroSt(); std::vector* getCoefInAccess(); void analyzeAcrDims(); void analyzeAlignOnLoop(); void analyzeTrDims(); // diagTransform SgSymbol* findAccess(SgExpression *_exp, char *&_charEx); void addNewCoef(SgExpression *_exp, char *_charEx, SgSymbol *_symb); void generateAssigns(SgVarRefExp *offsetX, SgVarRefExp *offsetY, SgVarRefExp *Rx, SgVarRefExp *Ry, SgVarRefExp *slash); private: int dimNum; int acrossType; std::vector acrossDims; std::vector alignOnLoop; std::vector transformDims; std::vector accesses; char *name; Loop *parentLoop; // diagTransform std::vector coefInAccess; std::vector firstEx; std::vector secondEx; std::vector charEx; std::vector zeroSt; std::vector ifCalls; std::vector elseCalls; }; class Loop { public: Loop(int _line, SgStatement *_body, bool withAnalyze); Loop(int _acrType, int _line, SgStatement *_body); Loop(int _line, SgStatement *_body); Loop(int _line); ~Loop() {}; void setLine(int _line); int getLine(); void setAcrType(int _type); int getAcrType(); std::vector* getArrays(); void addArray(Array *_array); Array* getArray(char *name, int *_idx); Array* getArray(char *name); std::vector* getSymbols(); int getLoopDim(); void analyzeLoopBody(); void analyzeAcrossType(); bool isArrayInPrivate(char *name); void unroll(int level); // TODO private: int loopDim; std::vector symbols; int line; int acrossType; std::vector arrays; SgStatement* loopBody; std::vector privateList; std::vector acrDims; void analyzeAssignOp(SgExpression *_exp, int oper); }; // ---------------------------------------------------------------------- // AllLoops class AllLoops { public: AllLoops() {} ~AllLoops() {} void addLoop(Loop *_loop) { loops.push_back(_loop); } std::vector* getLoops() { return &loops; } private: std::vector loops; };