ManagerInsNoPtrInterAliasMap.cpp

Go to the documentation of this file.
00001 
00021 #include "ManagerInsNoPtrInterAliasMap.hpp"
00022 #include <Utils/Util.hpp>
00023 
00024 
00025 namespace OA {
00026   namespace Alias {
00027 
00028 static bool debug = false;
00029 
00032 ManagerInsNoPtrInterAliasMap::ManagerInsNoPtrInterAliasMap(
00033   OA_ptr<AliasIRInterface> _ir) 
00034     : DataFlow::CallGraphDFProblemNew(DataFlow::CallGraphDFProblemNew::TopDown),
00035       mIR(_ir)
00036 {
00037     OA_DEBUG_CTRL_MACRO("DEBUG_ManagerInsNoPtrInterAliasMap:ALL", debug);
00038 }
00039 
00040 OA_ptr<Alias::InterAliasMap> 
00041 ManagerInsNoPtrInterAliasMap::performAnalysis(
00042         OA_ptr<CallGraph::Interface> callGraph,
00043         OA_ptr<DataFlow::ParamBindings> paramBind)
00044 {
00045   // store results that will be needed in callbacks
00046   mParamBind = paramBind;
00047 
00048   // create an empty InterAliasMap
00049   OA_ptr<ManagerAliasMapBasic> manAM; manAM = new ManagerAliasMapBasic(mIR);
00050   mInterAliasMap = new InterAliasMap(manAM);
00051 
00052   // call iterative data-flow solver for CallGraph
00053   DataFlow::CallGraphDFProblemNew::solve(callGraph);
00054     
00055   return mInterAliasMap;
00056 }
00057 
00058 //========================================================
00059 // implementation of CallGraphDFProblemNew callbacks
00060 //========================================================
00061 //--------------------------------------------------------
00062 // initialization callbacks
00063 //--------------------------------------------------------
00064 
00071 OA_ptr<DataFlow::DataFlowSet> ManagerInsNoPtrInterAliasMap::initializeTop()
00072 {
00073     OA_ptr<SymAliasSets> retval;
00074     retval = new SymAliasSets;
00075     return retval;
00076 }
00077 
00080 OA_ptr<DataFlow::DataFlowSet>  
00081 ManagerInsNoPtrInterAliasMap::initializeBottom()
00082 {
00083     assert(0);
00084     // have different bottom based on what procedure we are
00085     /*
00086     OA_ptr<ManagerSymAliasSetsBottom> man;
00087     man = new ManagerSymAliasSetsBottom(mIR);
00088 
00089     OA_ptr<SymAliasSets> retval = man->performAnalysis(mProc);
00090     */
00091     OA_ptr<SymAliasSets> retval;
00092     return retval;
00093 }
00094 
00096 OA_ptr<DataFlow::DataFlowSet> 
00097 ManagerInsNoPtrInterAliasMap::initializeNode(ProcHandle proc)
00098 {
00099     OA_ptr<ManagerSymAliasSetsTop> man;
00100     man = new ManagerSymAliasSetsTop(mIR);
00101 
00102     OA_ptr<SymAliasSets> retval = man->performAnalysis(proc);
00103     return retval;
00104 }
00105 
00108 OA_ptr<DataFlow::DataFlowSet> 
00109 ManagerInsNoPtrInterAliasMap::initializeEdge(ExprHandle call, 
00110                                                  ProcHandle caller,
00111                                                  ProcHandle callee)
00112 {
00113     // FIXME: do we even use this DataFlowSet?
00114     OA_ptr<ManagerSymAliasSetsTop> man;
00115     man = new ManagerSymAliasSetsTop(mIR);
00116 
00117     OA_ptr<SymAliasSets> retval = man->performAnalysis(caller);
00118     return retval;
00119 }
00120 
00124 OA_ptr<DataFlow::DataFlowSet> 
00125 ManagerInsNoPtrInterAliasMap::initializeEdge(ExprHandle call, 
00126                                                  ProcHandle caller,
00127                                                  SymHandle callee)
00128 {
00129     // FIXME: do we even use this DataFlowSet?
00130     OA_ptr<ManagerSymAliasSetsTop> man;
00131     man = new ManagerSymAliasSetsTop(mIR);
00132 
00133     OA_ptr<SymAliasSets> retval = man->performAnalysis(caller);
00134     return retval;
00135 }
00136 
00137 //--------------------------------------------------------
00138 // solver callbacks 
00139 //--------------------------------------------------------
00140   
00143 OA_ptr<DataFlow::DataFlowSet> 
00144 ManagerInsNoPtrInterAliasMap::meet(OA_ptr<DataFlow::DataFlowSet> set1, 
00145                                        OA_ptr<DataFlow::DataFlowSet> set2)
00146 {
00147     if (debug) {
00148         std::cout << "ManagerInsNoPtrInterAliasMap::meet" << std::endl;
00149     }
00150     OA_ptr<SymAliasSets> remapSet1 = set1.convert<SymAliasSets>();
00151     OA_ptr<SymAliasSets> remapSet2 = set2.convert<SymAliasSets>();
00152     if (debug) {
00153         std::cout << "\tremapSet1 = ";
00154         //remapSet1->dump(std::cout, mIR);
00155         remapSet1->dump(std::cout);
00156         std::cout << "\tremapSet2 = ";
00157         //remapSet2->dump(std::cout, mIR);
00158         remapSet2->dump(std::cout);
00159     }
00160     OA_ptr<SymAliasSets> retval = remapSet1->meet(*remapSet2);
00161     if (debug) {
00162         std::cout << "\tretval = ";
00163         retval->dump(std::cout);
00164     }
00165     return retval;
00166 }
00167 
00169 OA_ptr<DataFlow::DataFlowSet>
00170 ManagerInsNoPtrInterAliasMap::atCallGraphNode(
00171         OA_ptr<DataFlow::DataFlowSet> inSet, 
00172         OA::ProcHandle proc)
00173 {
00174     if (debug) {
00175         std::cout << "In ManagerInsNoPtrInterAliasMap::atCallGraphNode" 
00176                   << std::endl;
00177     }
00178 
00179     // cast to more specific data-flow set data type
00180     OA_ptr<SymAliasSets> symSets = inSet.convert<SymAliasSets>();
00181 
00183     // create AliasMap
00184     OA_ptr<AliasMap> seedAliasMap;
00185     seedAliasMap = new AliasMap(proc);
00186 
00187     // iterate over formal parameters for this procedure
00188     OA_ptr<SymHandleIterator> symIter = mParamBind->getFormalIterator(proc);
00189     for ( ; symIter->isValid(); (*symIter)++ ) {
00190         SymHandle formal = symIter->current();
00191         if (debug) { 
00192             std::cout << "\tformal = " << mIR->toString(formal) << std::endl; 
00193         }
00194         
00195         // if it is a reference param
00196         if (mParamBind->isRefParam(formal)) {
00197             // get the location for this formal
00198             OA_ptr<Location> formalLoc = mIR->getLocation(proc,formal);
00199             if (debug) { 
00200                 std::cout << "\tformalLoc = ";
00201                 formalLoc->dump(std::cout,mIR);
00202                 std::cout << std::endl;
00203                 std::cout << "\tSymAliasSets = ";
00204                 //symSets->dump(std::cout, mIR);
00205                 symSets->dump(std::cout);
00206             }
00207 
00208             // get all the symbols that this formal aliases
00209             OA_ptr<SymHandleIterator> aliasIter 
00210                 = symSets->getSymIterator(formal);
00211             for ( ; aliasIter->isValid(); (*aliasIter)++ ) {
00212                 SymHandle otherSym = aliasIter->current();
00213                 if (debug) { 
00214                   std::cout << "\t\tother = " << mIR->toString(otherSym);
00215                   std::cout << ", hval = " << otherSym.hval() 
00216                             << std::endl; 
00217                 }
00218                 // get the location for each symbol
00219                 OA_ptr<Location> otherLoc = mIR->getLocation(proc,otherSym);
00220                 // alias the locations in the seedAliasMap
00221                 seedAliasMap->aliasLocs(formalLoc,otherLoc);
00222             }
00223         }
00224     }
00225                 
00228     OA_ptr<ManagerAliasMapBasic> aliasMan;
00229     aliasMan = new ManagerAliasMapBasic(mIR);
00230     assert(0); // this whole thing doesn't work any more because if isRefParam
00231     //OA_ptr<AliasMap> alias = aliasMan->performAnalysis(proc,seedAliasMap);
00232     OA_ptr<AliasMap> alias;
00233     mInterAliasMap->mapProcToAliasMap(proc,alias);
00234 
00235     // return inSets, didn't change it
00236     return inSet;
00237 }
00238 
00240 OA_ptr<DataFlow::DataFlowSet>
00241 ManagerInsNoPtrInterAliasMap::atCallGraphEdge(
00242         OA_ptr<DataFlow::DataFlowSet> inSet, 
00243         OA::ExprHandle call, ProcHandle caller, ProcHandle callee)
00244 {
00245     if (debug) {
00246         std::cout << "atCallGraphEdge::inSet = ";
00247         inSet->dump(std::cout);
00248     }
00249     // pass on inSet
00250     return inSet;
00251 }
00252 
00255 OA_ptr<DataFlow::DataFlowSet>  
00256 ManagerInsNoPtrInterAliasMap::nodeToEdge(ProcHandle proc, 
00257         OA_ptr<DataFlow::DataFlowSet> procDFSet, ExprHandle call)
00258 {
00259   if (debug) {
00260       std::cout << "In ManagerInsNoPtrInterAliasMap::nodeToEdge" << std::endl;
00261   }
00262 
00263   // create output DataFlowSet
00264   OA_ptr<SymAliasSets> retval;
00265   retval = new SymAliasSets;
00266 
00267   // alias results for the caller
00268   OA_ptr<Alias::Interface> alias = mInterAliasMap->getAliasResults(proc);
00269 
00270   // loop over callsiteparams
00271   OA_ptr<MemRefHandleIterator> actIter1 = mParamBind->getActualIterator(call);
00272   OA_ptr<MemRefHandleIterator> actIter2 = mParamBind->getActualIterator(call);
00273   for ( ; actIter1->isValid(); (*actIter1)++ ) {
00274     MemRefHandle act1 = actIter1->current();
00275     SymHandle formal1 = mParamBind->getCalleeFormal(call, act1);
00276     if (debug) {
00277         std::cout << "\tact1 = " << mIR->toString(act1) << std::endl;
00278         std::cout << "\tformal1 = " << mIR->toString(formal1) << std::endl;
00279     }
00280 
00281     for ( ; actIter2->isValid(); (*actIter2)++ ) {
00282       MemRefHandle act2 = actIter2->current();
00283       SymHandle formal2 = mParamBind->getCalleeFormal(call, act2);
00284       if (debug) {
00285           std::cout << "\tact2 = " << mIR->toString(act2) << std::endl;
00286           std::cout << "\tformal2 = " << mIR->toString(formal2) << std::endl;
00287       }
00288 
00289       // if both formals are reference params
00290       // do pairwise compare
00291       // if the actuals may overlap then put formals in same alias set
00292       // in SymAliasSet
00293       if ( mParamBind->isRefParam(formal1) && mParamBind->isRefParam(formal2)
00294            && alias->alias(act1,act2) != NOALIAS ) 
00295       {
00296         if (debug) { std::cout << "\tact1 and act2 alias" << std::endl; }
00297         retval->mergeSyms(formal1, formal2);
00298       }
00299     }
00300 
00301     // if actual aliases can refer to any non-local locations then
00302     // add the symbols for those locations into the same set in SymAliasSet
00303     if (mParamBind->isRefParam(formal1)) {
00304       OA_ptr<LocIterator> locIter = alias->getMayLocs(act1);
00305       for ( ; locIter->isValid(); (*locIter)++ ) {
00306         OA_ptr<Location> loc = locIter->current();
00307         if (!loc->isLocal()  && loc->isaNamed() ) {
00308           OA_ptr<NamedLoc> nloc = loc.convert<NamedLoc>();
00309           retval->mergeSyms(formal1, nloc->getSymHandle());
00310         }
00311       }
00312     }
00313 
00314   }
00315 
00316   return retval;
00317     
00318 }
00319 
00322 OA_ptr<DataFlow::DataFlowSet>  
00323 ManagerInsNoPtrInterAliasMap::edgeToNode(ExprHandle call, 
00324         OA_ptr<DataFlow::DataFlowSet> callDFSet, ProcHandle proc)
00325 {
00326     if (debug) {
00327         std::cout << "edgeToNode::callDFSet = ";
00328         callDFSet->dump(std::cout);
00329     }
00330     return callDFSet;
00331 }
00332 
00333 
00334 
00335   } // end of namespace Alias
00336 } // end of namespace OA