auto_ManagerAvailableExpressionsStandard.cpp

Go to the documentation of this file.
00001 
00002 // ManagerAvailableExpressionsStandard.cpp
00003 
00004 #include "auto_ManagerAvailableExpressionsStandard.hpp"
00005 
00006 using namespace std;
00007 using namespace OA::DataFlow;
00008 using namespace OA::CFG;
00009 using namespace OA::Alias;
00010 using namespace OA::SideEffect;
00011 
00012 namespace OA {
00013   namespace AvailableExpressions {
00014 
00015 static bool debug = false;
00016 
00017 
00018 ManagerAvailableExpressionsStandard::ManagerAvailableExpressionsStandard(
00019     OA_ptr<AvailableExpressionsIRInterface> _ir)
00020     :
00021     mIR(_ir)
00022 {
00023     OA_DEBUG_CTRL_MACRO("DEBUG_ManagerAvailableExpressionsStandard:ALL", debug);
00024     mSolver = new CFGDFSolver(CFGDFSolver::Forward, *this);
00025 }
00026 
00027 
00028 OA_ptr<DataFlowSet> ManagerAvailableExpressionsStandard::initializeTop()
00029 {
00030     OA_ptr<AvailableExpressionsDFSet> retval;
00031     retval = new AvailableExpressionsDFSet();
00032     return retval;
00033 }
00034 
00035 
00036 OA_ptr<DataFlowSet> ManagerAvailableExpressionsStandard::initializeBottom()
00037 {
00038     OA_ptr<AvailableExpressionsDFSet> retval;
00039     retval = new AvailableExpressionsDFSet();
00040     return retval;
00041 }
00042 
00043 
00044 OA_ptr<DataFlowSet>
00045 ManagerAvailableExpressionsStandard::initializeNodeIN(OA_ptr<NodeInterface> n)
00046 {
00047     OA_ptr<AvailableExpressionsDFSet> retval;
00048     retval = new AvailableExpressionsDFSet();
00049     return retval;
00050 }
00051 
00052 
00053 OA_ptr<DataFlowSet>
00054 ManagerAvailableExpressionsStandard::initializeNodeOUT(OA_ptr<NodeInterface> n)
00055 {
00056     OA_ptr<AvailableExpressionsDFSet> retval;
00057     retval = new AvailableExpressionsDFSet();
00058     return retval;
00059 }
00060 
00061 
00062 OA_ptr<AvailableExpressionsStandard> ManagerAvailableExpressionsStandard::performAnalysis(
00063     ProcHandle proc,
00064     OA_ptr<CFGInterface> cfg,
00065     OA_ptr<OA::Alias::Interface> alias,
00066     OA_ptr<InterSideEffectInterface> interSE)
00067 {
00068     if (debug) {
00069         cout << "In AvailableExpressions::ManagerAvailableExpressionsStandard::performAnalysis"
00070              << endl;
00071     }
00072 
00073     // create the object we'll store results in
00074     mAvailableExpressionsMap = new AvailableExpressionsStandard(proc, mIR);
00075 
00076     // store Alias information for use within the transfer function
00077     mAlias = alias;
00078 
00079     {
00080 
00081         // maycode for defs[s]
00082         OA_ptr<IRStmtIterator> stmtIter;
00083         stmtIter = mIR->getStmtIterator(proc);
00084         for(; stmtIter->isValid(); ++(*stmtIter)) {
00085             StmtHandle stmt = stmtIter->current();
00086 
00087             OA_ptr<MemRefHandleIterator> defsIter;
00088             defsIter = mIR->getDefMemRefs(stmt);
00089             for (; defsIter->isValid(); (*defsIter)++) {
00090                 MemRefHandle ref = defsIter->current();
00091 
00092                 OA_ptr<LocIterator> locIter;
00093                 locIter = alias->getMayLocs(ref);
00094                 for (; locIter->isValid(); ++(*locIter)) {
00095                     mStmt2MayDefMap[stmt].insert(locIter->current());
00096                 }
00097             }
00098         }
00099     } {
00100 
00101         // mustcode for defs[s]
00102         OA_ptr<IRStmtIterator> stmtIter;
00103         stmtIter = mIR->getStmtIterator(proc);
00104         for(; stmtIter->isValid(); ++(*stmtIter)) {
00105             StmtHandle stmt = stmtIter->current();
00106 
00107             OA_ptr<MemRefHandleIterator> defsIter;
00108             defsIter = mIR->getDefMemRefs(stmt);
00109             for (; defsIter->isValid(); (*defsIter)++) {
00110                 MemRefHandle ref = defsIter->current();
00111                 OA_ptr<LocIterator> locIter;
00112                 locIter = alias->getMayLocs(ref);
00113                 for (; locIter->isValid(); ++(*locIter)) {
00114                     mStmt2MustDefMap[stmt].insert(locIter->current());
00115                 }
00116             }
00117         }
00118     }
00119     {
00120 
00121       OA_ptr<IRStmtIterator> stmtIter;
00122       OA_ptr<ExprHandleIterator> iterHdlExpr;
00123       OA_ptr<NewExprTree> eTree;
00124 
00125       iterHdlExp = getExprHandleIterator(OA::StmtHandle stmt);
00126 
00127       // iterate through all statements in the procedure
00128       stmtIter = mIR->getStmtIterator(proc);
00129       for(; stmtIter->isValid(); ++(*stmtIter)) {
00130           StmtHandle stmt = stmtIter->current();
00131 
00132           // iterate through all expressions in the statement
00133           iterHdlExpr = mIR->getExprHandleIterator(stmt);
00134           for(; iterHdlExpr->isValid(); ++(*iterHdlExpr)) {
00135               ExprHandle hExp = iterHdlExpr->current();
00136               
00137               eTree = mIR->getNewExprTree(hExp);
00138               mStmt2MayExprMap[hExp].insert(eTree);
00139           }
00140       }
00141     } {
00142 
00143       OA_ptr<IRStmtIterator> stmtIter;
00144       OA_ptr<ExprHandleIterator> iterHdlExpr;
00145       OA_ptr<NewExprTree> eTree;
00146 
00147       iterHdlExp = getExprHandleIterator(OA::StmtHandle stmt);
00148 
00149       // iterate through all statements in the procedure
00150       stmtIter = mIR->getStmtIterator(proc);
00151       for(; stmtIter->isValid(); ++(*stmtIter)) {
00152           StmtHandle stmt = stmtIter->current();
00153 
00154           // iterate through all expressions in the statement
00155           iterHdlExpr = mIR->getExprHandleIterator(stmt);
00156           for(; iterHdlExpr->isValid(); ++(*iterHdlExpr)) {
00157               ExprHandle hExp = iterHdlExpr->current();
00158               
00159               eTree = mIR->getNewExprTree(hExp);
00160               mStmt2MayExprMap[hExp].insert(eTree);
00161           }
00162       }
00163     }
00164     {
00165 
00166         // maycode for uses[s]
00167         OA_ptr<IRStmtIterator> stmtIter;
00168         stmtIter = mIR->getStmtIterator(proc);
00169         for(; stmtIter->isValid(); ++(*stmtIter)) {
00170             StmtHandle stmt = stmtIter->current();
00171 
00172             OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
00173             for (; useIterPtr->isValid(); (*useIterPtr)++) {
00174                 MemRefHandle ref = useIterPtr->current();
00175                 OA_ptr<LocIterator> locIterPtr = alias->getMayLocs(ref);
00176                 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00177                     mStmt2MayUseMap[stmt].insert(locIterPtr->current());
00178                 }
00179             }
00180         }
00181     } {
00182 
00183         // mustcode for uses[s]
00184         OA_ptr<IRStmtIterator> stmtIter;
00185         stmtIter = mIR->getStmtIterator(proc);
00186         for(; stmtIter->isValid(); ++(*stmtIter)) {
00187             StmtHandle stmt = stmtIter->current();
00188 
00189             OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
00190             for (; useIterPtr->isValid(); (*useIterPtr)++) {
00191                 MemRefHandle ref = useIterPtr->current();
00192                 OA_ptr<LocIterator> locIterPtr = alias->getMustLocs(ref);
00193                 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00194                     mStmt2MustUseMap[stmt].insert(locIterPtr->current());
00195                 }
00196             }
00197         }
00198     }
00199 
00200     // use the dataflow solver to get the In and Out sets for the
00201     // basic blocks (BBs).
00202     mSolver->solve(cfg, ITERATIVE);
00203 
00204     // get exit node for CFG and determine what data flow values exit it.
00205     // store these data flow values in the result's exit information.
00206     OA_ptr<NodeInterface> node;
00207     node = cfg->getExit();
00208     OA_ptr<DataFlowSet> x = mSolver->getOutSet(node);
00209     OA_ptr<AvailableExpressionsDFSet> exitSet =
00210         x.convert<AvailableExpressionsDFSet>();
00211     for(AvailableExpressionsDFSet::iterator i = exitSet->begin();
00212         i != exitSet->end(); i++)
00213     {
00214         mAvailableExpressionsMap->insertExit(*i);
00215     }
00216 
00217 
00218     return mAvailableExpressionsMap;
00219 }
00220 
00221 void ManagerAvailableExpressionsStandard::dumpset(OA_ptr<AvailableExpressionsDFSet> inSet) {
00222     OA_ptr<set<OA_ptr<NewExprTree>  > > setRecast;
00223     setRecast = inSet.convert<set<OA_ptr<NewExprTree>  > >();
00224     set<OA_ptr<NewExprTree>  >::iterator iter;
00225     iter = setRecast->begin();
00226     for(; iter != setRecast->end(); iter++) {
00227         cout << (*iter)->toString(mIR);
00228     }
00229     cout << endl;
00230 }
00231 
00232 
00233 OA_ptr<DataFlowSet>
00234 ManagerAvailableExpressionsStandard::meet(
00235     OA_ptr<DataFlowSet> set1orig,
00236     OA_ptr<DataFlowSet> set2orig)
00237 {
00238     // convert the incoming sets to sets of the specific flow value.
00239     OA_ptr<AvailableExpressionsDFSet> set1 = set1orig.convert<AvailableExpressionsDFSet>();
00240     OA_ptr<AvailableExpressionsDFSet> set2 = set2orig.convert<AvailableExpressionsDFSet>();
00241 
00242     if (debug) {
00243         cout << "ManagerAvailableExpressionsStandard::meet" << endl;
00244         cout << "\tset1 = ";
00245         dumpset(set1);
00246         cout << "\tset2 = ";
00247         dumpset(set2);
00248     }
00249 
00250     // perform the meet operator on the left hand set.  It's okay to modify the
00251     // set and return it as a result [since the solver passes a temporary set
00252     // in as set1.  See the CFGDFProblem header for more info.
00253     set1->intersectEqu(*set2);
00254 
00255     if (debug) {
00256         cout << endl << "\tcalculated set = ";
00257         dumpset(set1);
00258     }
00259 
00260     return set1;
00261 }
00262 
00263 OA_ptr<DataFlowSet> ManagerAvailableExpressionsStandard::genSet(StmtHandle stmt)
00264 {
00265     OA_ptr<AvailableExpressionsDFSet> genSet;
00266     genSet =  new AvailableExpressionsDFSet();
00267 
00268     // Generate GEN code:
00269     OA_ptr<AvailableExpressionsDFSet> set1;
00270     set1 = new AvailableExpressionsDFSet(mStmt2MustExprMap[stmt]);
00271     genSet = set1;
00272 
00273     return genSet;
00274 }
00275 
00276 OA_ptr<DataFlowSet> ManagerAvailableExpressionsStandard::killSet(
00277     StmtHandle stmt, OA_ptr<DataFlowSet> xdfset)
00278 {
00279     OA_ptr<AvailableExpressionsDFSet> x;
00280     x = xdfset.convert<AvailableExpressionsDFSet>();
00281 
00282     OA_ptr<AvailableExpressionsDFSet> killSet;
00283     killSet = new AvailableExpressionsDFSet();
00284 
00285     // Generate KILL code:
00286     OA_ptr<DFAGenDFSet<OA_ptr<NewExprTree> > > set2;
00287     set2 = new DFAGenDFSet<OA_ptr<NewExprTree> >();
00288     AvailableExpressionsDFSet::iterator iter1;
00289     OA_ptr<NewExprTree> iter1Val;
00290 
00291     for(iter1 = x->begin(); iter1 != x->end(); iter1++) {
00292         iter1Val = *iter1
00293         OA_ptr<DFAGenDFSet<OA_ptr<Location> > > set3;
00294         set3 = new DFAGenDFSet<OA_ptr<Location> >(mStmt2MayUseMap[iter1Val]);
00295         OA_ptr<DFAGenDFSet<OA_ptr<Location> > > set4;
00296         set4 = new DFAGenDFSet<OA_ptr<Location> >(mStmt2MayDefMap[stmt]);
00297         OA_ptr<DFAGenDFSet<OA_ptr<Location> > > set5;
00298         set5 = set3->intersect(set4);
00299         bool cond1;
00300         cond1 = !set5->isEmpty();
00301         bool cond;
00302         cond = cond1;
00303         if(cond) {
00304             set2->insert(iter1Val);
00305         }
00306     }
00307     killSet = set2;
00308 
00309     return killSet;
00310 }
00311 
00312 // Currently the transfer function used by DFAGen is assumed to be:
00313 // Y = gen[n] U (X - kill[n]).
00314 OA_ptr<DataFlowSet>
00315 ManagerAvailableExpressionsStandard::transfer(
00316     OA_ptr<DataFlowSet> xdfset,
00317     StmtHandle stmt)
00318 {
00319     OA_ptr<set<".FLOWTYPE" > > xdfgenset;
00320     xdfgenset = xdfset.convert<set<OA_ptr<NewExprTree>  > >();
00321 
00322     OA_ptr<AvailableExpressionsDFSet> x;
00323     x = new AvailableExpressionsDFSet(*xdfgenset);
00324 
00325     // if debug mode is on print information about transfer function
00326     if (debug) {
00327         cout << "In transfer: " << endl;
00328         cout << "\t Stmt  = " << mIR->toString(stmt) << endl;
00329         cout << "\t X     = ";
00330         dumpset(x);
00331     }
00332 
00333     OA_ptr<DataFlowSet> genBaseObj = genSet(stmt);
00334     OA_ptr<AvailableExpressionsDFSet> gen = genBaseObj.convert<AvailableExpressionsDFSet>();
00335 
00336     OA_ptr<DataFlowSet> killBaseObj = killSet(stmt, x);
00337     OA_ptr<AvailableExpressionsDFSet> kill = killBaseObj.convert<AvailableExpressionsDFSet>();
00338 
00339 
00340     // Add gen[n] to Y
00341     AvailableExpressionsDFSet::iterator genIter = gen->begin();
00342     for(; genIter != gen->end(); ++genIter) {
00343         OA_ptr<NewExprTree>  genVal;
00344         genVal = *genIter;
00345         mAvailableExpressionsMap->insert(stmt, genVal);
00346     }
00347     // Add X - kill[n] to Y
00348     x->minusEqu(*kill);
00349     AvailableExpressionsDFSet::iterator xIter = x->begin();
00350     for(; xIter != x->end(); ++xIter) {
00351         OA_ptr<NewExprTree>  xVal;
00352         xVal = *xIter;
00353         mAvailableExpressionsMap->insert(stmt, xVal);
00354     }
00355 
00356     // if debug mode is on print information about transfer function
00357     if(debug) {
00358         cout << "\t gen  = ";
00359         dumpset(gen);
00360         cout << "\t kill = ";
00361         dumpset(kill);
00362         cout << "\t Y    = ";
00363         dumpset(mAvailableExpressionsMap->getAvailableExpressionsSet(stmt));
00364     }
00365 
00366     return mAvailableExpressionsMap->getAvailableExpressionsSet(stmt);
00367 }
00368 
00369   } // end of namespace AvailableExpressions
00370 } // end of namespace OA

Generated on Sat Oct 31 05:21:20 2009 for OpenAnalysis by  doxygen 1.6.1