auto_ManagerLivenessStandard.cpp

Go to the documentation of this file.
00001 
00002 // ManagerLivenessStandard.cpp
00003 
00004 #include "auto_ManagerLivenessStandard.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 Liveness {
00014 
00015 static bool debug = false;
00016 
00017 
00018 ManagerLivenessStandard::ManagerLivenessStandard(
00019     OA_ptr<LivenessIRInterface> _ir)
00020     :
00021     mIR(_ir)
00022 {
00023     OA_DEBUG_CTRL_MACRO("DEBUG_ManagerLivenessStandard:ALL", debug);
00024     mSolver = new CFGDFSolver(CFGDFSolver::Backward, *this);
00025 }
00026 
00027 
00028 OA_ptr<DataFlowSet> ManagerLivenessStandard::initializeTop()
00029 {
00030     OA_ptr<LivenessDFSet> retval;
00031     retval = new LivenessDFSet();
00032     return retval;
00033 }
00034 
00035 
00036 OA_ptr<DataFlowSet> ManagerLivenessStandard::initializeBottom()
00037 {
00038     OA_ptr<LivenessDFSet> retval;
00039     retval = new LivenessDFSet();
00040     return retval;
00041 }
00042 
00043 
00044 OA_ptr<DataFlowSet>
00045 ManagerLivenessStandard::initializeNodeIN(OA_ptr<NodeInterface> n)
00046 {
00047     OA_ptr<LivenessDFSet> retval;
00048     retval = new LivenessDFSet();
00049     return retval;
00050 }
00051 
00052 
00053 OA_ptr<DataFlowSet>
00054 ManagerLivenessStandard::initializeNodeOUT(OA_ptr<NodeInterface> n)
00055 {
00056     OA_ptr<LivenessDFSet> retval;
00057     retval = new LivenessDFSet();
00058     return retval;
00059 }
00060 
00061 
00062 OA_ptr<LivenessStandard> ManagerLivenessStandard::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 Liveness::ManagerLivenessStandard::performAnalysis"
00070              << endl;
00071     }
00072 
00073     // create the object we'll store results in
00074     mLivenessMap = new LivenessStandard(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         // maycode for uses[s]
00122         OA_ptr<IRStmtIterator> stmtIter;
00123         stmtIter = mIR->getStmtIterator(proc);
00124         for(; stmtIter->isValid(); ++(*stmtIter)) {
00125             StmtHandle stmt = stmtIter->current();
00126 
00127             OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
00128             for (; useIterPtr->isValid(); (*useIterPtr)++) {
00129                 MemRefHandle ref = useIterPtr->current();
00130                 OA_ptr<LocIterator> locIterPtr = alias->getMayLocs(ref);
00131                 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00132                     mStmt2MayUseMap[stmt].insert(locIterPtr->current());
00133                 }
00134             }
00135         }
00136     } {
00137 
00138         // mustcode for uses[s]
00139         OA_ptr<IRStmtIterator> stmtIter;
00140         stmtIter = mIR->getStmtIterator(proc);
00141         for(; stmtIter->isValid(); ++(*stmtIter)) {
00142             StmtHandle stmt = stmtIter->current();
00143 
00144             OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
00145             for (; useIterPtr->isValid(); (*useIterPtr)++) {
00146                 MemRefHandle ref = useIterPtr->current();
00147                 OA_ptr<LocIterator> locIterPtr = alias->getMustLocs(ref);
00148                 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00149                     mStmt2MustUseMap[stmt].insert(locIterPtr->current());
00150                 }
00151             }
00152         }
00153     }
00154 
00155     // use the dataflow solver to get the In and Out sets for the
00156     // basic blocks (BBs).
00157     mSolver->solve(cfg, ITERATIVE);
00158 
00159     // get exit node for CFG and determine what data flow values exit it.
00160     // store these data flow values in the result's exit information.
00161     OA_ptr<NodeInterface> node;
00162     node = cfg->getExit();
00163     OA_ptr<DataFlowSet> x = mSolver->getOutSet(node);
00164     OA_ptr<LivenessDFSet> exitSet =
00165         x.convert<LivenessDFSet>();
00166     for(LivenessDFSet::iterator i = exitSet->begin();
00167         i != exitSet->end(); i++)
00168     {
00169         mLivenessMap->insertExit(*i);
00170     }
00171 
00172 
00173     return mLivenessMap;
00174 }
00175 
00176 void ManagerLivenessStandard::dumpset(OA_ptr<LivenessDFSet> inSet) {
00177     OA_ptr<set<OA_ptr<Location>  > > setRecast;
00178     setRecast = inSet.convert<set<OA_ptr<Location>  > >();
00179     set<OA_ptr<Location>  >::iterator iter;
00180     iter = setRecast->begin();
00181     for(; iter != setRecast->end(); iter++) {
00182         cout << (*iter)->toString(mIR);
00183     }
00184     cout << endl;
00185 }
00186 
00187 
00188 OA_ptr<DataFlowSet>
00189 ManagerLivenessStandard::meet(
00190     OA_ptr<DataFlowSet> set1orig,
00191     OA_ptr<DataFlowSet> set2orig)
00192 {
00193     // convert the incoming sets to sets of the specific flow value.
00194     OA_ptr<LivenessDFSet> set1 = set1orig.convert<LivenessDFSet>();
00195     OA_ptr<LivenessDFSet> set2 = set2orig.convert<LivenessDFSet>();
00196 
00197     if (debug) {
00198         cout << "ManagerLivenessStandard::meet" << endl;
00199         cout << "\tset1 = ";
00200         dumpset(set1);
00201         cout << "\tset2 = ";
00202         dumpset(set2);
00203     }
00204 
00205     // perform the meet operator on the left hand set.  It's okay to modify the
00206     // set and return it as a result [since the solver passes a temporary set
00207     // in as set1.  See the CFGDFProblem header for more info.
00208     set1->unionEqu(*set2);
00209 
00210     if (debug) {
00211         cout << endl << "\tcalculated set = ";
00212         dumpset(set1);
00213     }
00214 
00215     return set1;
00216 }
00217 
00218 OA_ptr<DataFlowSet> ManagerLivenessStandard::genSet(StmtHandle stmt)
00219 {
00220     OA_ptr<LivenessDFSet> genSet;
00221     genSet =  new LivenessDFSet();
00222 
00223     // Generate GEN code:
00224     OA_ptr<LivenessDFSet> set1;
00225     set1 = new LivenessDFSet(mStmt2MayUseMap[stmt]);
00226     genSet = set1;
00227 
00228     return genSet;
00229 }
00230 
00231 OA_ptr<DataFlowSet> ManagerLivenessStandard::killSet(
00232     StmtHandle stmt, OA_ptr<DataFlowSet> xdfset)
00233 {
00234     OA_ptr<LivenessDFSet> x;
00235     x = xdfset.convert<LivenessDFSet>();
00236 
00237     OA_ptr<LivenessDFSet> killSet;
00238     killSet = new LivenessDFSet();
00239 
00240     // Generate KILL code:
00241     OA_ptr<LivenessDFSet> set2;
00242     set2 = new LivenessDFSet(mStmt2MustDefMap[stmt]);
00243     killSet = set2;
00244 
00245     return killSet;
00246 }
00247 
00248 // Currently the transfer function used by DFAGen is assumed to be:
00249 // Y = gen[n] U (X - kill[n]).
00250 OA_ptr<DataFlowSet>
00251 ManagerLivenessStandard::transfer(
00252     OA_ptr<DataFlowSet> xdfset,
00253     StmtHandle stmt)
00254 {
00255     OA_ptr<set<OA_ptr<Location> > > xdfgenset;
00256     xdfgenset = xdfset.convert<set<OA_ptr<Location> > >();
00257 
00258     OA_ptr<LivenessDFSet> x;
00259     x = new LivenessDFSet(*xdfgenset);
00260 
00261     // if debug mode is on print information about transfer function
00262     if (debug) {
00263         cout << "In transfer: " << endl;
00264         cout << "\t Stmt  = " << mIR->toString(stmt) << endl;
00265         cout << "\t X     = ";
00266         dumpset(x);
00267     }
00268 
00269     OA_ptr<DataFlowSet> genBaseObj = genSet(stmt);
00270     OA_ptr<LivenessDFSet> gen = genBaseObj.convert<LivenessDFSet>();
00271 
00272     OA_ptr<DataFlowSet> killBaseObj = killSet(stmt, x);
00273     OA_ptr<LivenessDFSet> kill = killBaseObj.convert<LivenessDFSet>();
00274 
00275 
00276     // Add gen[n] to Y
00277     LivenessDFSet::iterator genIter = gen->begin();
00278     for(; genIter != gen->end(); ++genIter) {
00279         OA_ptr<Location>  genVal;
00280         genVal = *genIter;
00281         mLivenessMap->insert(stmt, genVal);
00282     }
00283     // Add X - kill[n] to Y
00284     x->minusEqu(*kill);
00285     LivenessDFSet::iterator xIter = x->begin();
00286     for(; xIter != x->end(); ++xIter) {
00287         OA_ptr<Location>  xVal;
00288         xVal = *xIter;
00289         mLivenessMap->insert(stmt, xVal);
00290     }
00291 
00292     // if debug mode is on print information about transfer function
00293     if(debug) {
00294         cout << "\t gen  = ";
00295         dumpset(gen);
00296         cout << "\t kill = ";
00297         dumpset(kill);
00298         cout << "\t Y    = ";
00299         dumpset(mLivenessMap->getLivenessSet(stmt));
00300     }
00301 
00302     return mLivenessMap->getLivenessSet(stmt);
00303 }
00304 
00305   } // end of namespace Liveness
00306 } // end of namespace OA

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