auto_ManagerLivenessStandard.cpp
Go to the documentation of this file.00001
00002
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
00074 mLivenessMap = new LivenessStandard(proc, mIR);
00075
00076
00077 mAlias = alias;
00078
00079 {
00080
00081
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
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
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
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
00156
00157 mSolver->solve(cfg, ITERATIVE);
00158
00159
00160
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
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
00206
00207
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
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
00241 OA_ptr<LivenessDFSet> set2;
00242 set2 = new LivenessDFSet(mStmt2MustDefMap[stmt]);
00243 killSet = set2;
00244
00245 return killSet;
00246 }
00247
00248
00249
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
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
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
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
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 }
00306 }