auto_ManagerAvailableExpressionsStandard.cpp
Go to the documentation of this file.00001
00002
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
00074 mAvailableExpressionsMap = new AvailableExpressionsStandard(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 OA_ptr<IRStmtIterator> stmtIter;
00122 OA_ptr<ExprHandleIterator> iterHdlExpr;
00123 OA_ptr<NewExprTree> eTree;
00124
00125 iterHdlExp = getExprHandleIterator(OA::StmtHandle stmt);
00126
00127
00128 stmtIter = mIR->getStmtIterator(proc);
00129 for(; stmtIter->isValid(); ++(*stmtIter)) {
00130 StmtHandle stmt = stmtIter->current();
00131
00132
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
00150 stmtIter = mIR->getStmtIterator(proc);
00151 for(; stmtIter->isValid(); ++(*stmtIter)) {
00152 StmtHandle stmt = stmtIter->current();
00153
00154
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
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
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
00201
00202 mSolver->solve(cfg, ITERATIVE);
00203
00204
00205
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
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
00251
00252
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
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
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
00313
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
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
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
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
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 }
00370 }