EquivSets.cpp

Go to the documentation of this file.
00001 
00015 #include "EquivSets.hpp"
00016 #include <Utils/Util.hpp>
00017 
00018 namespace OA {
00019   namespace Alias {
00020 
00021 static bool debug = false;
00022 
00023 
00024 EquivSets::EquivSets() {
00025     OA_DEBUG_CTRL_MACRO("DEBUG_EquivSets:ALL", debug);
00026 }
00027 
00028 
00030 AliasResultType EquivSets::alias(MemRefHandle ref1, 
00031                                  MemRefHandle ref2)
00032 {
00033     // intersect the equivsets for the memrefs
00034     std::set<int> temp; 
00035     std::set_intersection(mMemRefToSets[ref1].begin(), 
00036                           mMemRefToSets[ref1].end(),
00037                           mMemRefToSets[ref2].begin(), 
00038                           mMemRefToSets[ref2].end(),
00039                           std::inserter(temp,temp.end()));
00040 
00041     // if the intersection is empty then they don't alias
00042     if (temp.empty()) {
00043         return NOALIAS;
00044     } else {
00045         return MAYALIAS;
00046     } 
00047 }
00048 
00050 OA_ptr<LocIterator> EquivSets::getMayLocs(MemRefHandle ref)
00051 {
00052     OA_ptr<LocSet> locSet;
00053     locSet = new LocSet;
00054     OA_ptr<LocSetIterator> retval;
00055 
00056     // iterate over all the sets for this MemRefHandle and return
00057     // an iterator over all the locations in those sets
00058     std::set<int>::iterator iter;
00059     for (iter=mMemRefToSets[ref].begin();
00060          iter!=mMemRefToSets[ref].end(); iter++)
00061     {
00062       locSet = unionLocSets(*locSet, 
00063                             mProcNSetToLocs[mMemRefToProc[ref]][*iter]);
00064     }
00065 
00066     retval = new LocSetIterator(locSet);
00067     return retval;
00068 }
00069 
00073 OA_ptr<LocIterator> EquivSets::getMustLocs(MemRefHandle ref)
00074 {
00075     OA_ptr<LocSetIterator> retval;
00076     OA_ptr<LocSet> emptySet; emptySet = new LocSet;
00077     retval = new LocSetIterator(emptySet);
00078     return retval;
00079 }
00080 
00082 OA_ptr<LocIterator> EquivSets::getMayLocs(MemRefExpr &ref, ProcHandle proc)
00083 {
00084     OA_ptr<LocSet> locSet;
00085     locSet = new LocSet;
00086     OA_ptr<LocSetIterator> retval;
00087 
00088     OA_ptr<MemRefExpr> refPtr = ref.clone();
00089     if ( mMREToIdMap.find(refPtr) != mMREToIdMap.end() ) {
00090       int id = mMREToIdMap[refPtr];
00091       locSet = unionLocSets(*locSet, 
00092                             mProcNSetToLocs[proc][id]);
00093     }
00094 
00095     retval = new LocSetIterator(locSet);
00096     return retval;
00097 }
00098 
00100 OA_ptr<LocIterator> EquivSets::getMustLocs(MemRefExpr &ref, ProcHandle proc)
00101 {
00102     OA_ptr<LocSetIterator> retval;
00103     OA_ptr<LocSet> emptySet; emptySet = new LocSet;
00104     retval = new LocSetIterator(emptySet);
00105     return retval;
00106 }
00107 
00110 OA_ptr<MemRefIterator> EquivSets::getMemRefIter()
00111 {
00112     OA_ptr<EquivSetsMemRefIter> retval;
00113     OA_ptr<std::set<MemRefHandle> > memRefSet;
00114     memRefSet = new std::set<MemRefHandle>;
00115 
00116     std::map<MemRefHandle,std::set<int> >::iterator mapIter;
00117     for (mapIter=mMemRefToSets.begin(); mapIter!=mMemRefToSets.end(); 
00118          mapIter++) 
00119     {
00120         memRefSet->insert(mapIter->first);
00121     }
00122     retval = new EquivSetsMemRefIter(memRefSet);
00123     return retval;
00124 }
00125 
00126 //*****************************************************************
00127 // Construction methods 
00128 //*****************************************************************
00129    
00131 void 
00132 EquivSets::addLocation(OA_ptr<Location> pLoc, ProcHandle proc, int equivSet)
00133 {
00134     mProcNSetToLocs[proc][equivSet].insert(pLoc);
00135 }
00136 
00138 OA_ptr<LocIterator> EquivSets::getLocIterator(ProcHandle proc, int equivSet) 
00139 { 
00140     OA_ptr<LocSet> locSet;
00141     locSet = new LocSet;
00142     OA_ptr<LocSetIterator> retval;
00143 
00144     // It is important to call find rather than doing a 
00145     // mProcNSetToLocs[proc][equivSet] if the equivSet does not
00146     // exist.  The 'array index' operation will create the equivSet
00147     // if it does not exist; we do not want to create an empty equivSet.
00148     if (mProcNSetToLocs[proc].find(equivSet) == mProcNSetToLocs[proc].end()) {
00149       retval = new LocSetIterator(locSet);
00150       return retval;
00151     }
00152 
00153     locSet = unionLocSets(*locSet, 
00154                           mProcNSetToLocs[proc][equivSet]);
00155 
00156     retval = new LocSetIterator(locSet);
00157     return retval;
00158 }
00159 
00161 OA_ptr<std::map<int,OA_ptr<LocSet> > > EquivSets::getIdToLocSetMap(ProcHandle proc)
00162 {
00163    OA_ptr<std::map<int, OA_ptr<LocSet> > > retVal;
00164    retVal = new std::map<int, OA_ptr<LocSet> >;
00165 
00166    std::map<int,std::set<OA_ptr<Location> > >::iterator it;
00167    for (it = mProcNSetToLocs[proc].begin(); 
00168         it != mProcNSetToLocs[proc].end(); ++(it) ) {
00169      int i = it->first;
00170      (*retVal)[i] = new LocSet;
00171      std::set<OA_ptr<Location> >::iterator setIt;
00172      for (setIt = it->second.begin(); setIt != it->second.end(); (setIt)++ ) {
00173        OA_ptr<Location> loc = (*setIt);
00174        (*retVal)[i]->insert(loc);
00175      }
00176    }
00177 
00178    return retVal;
00179 }
00180 
00184 void EquivSets::mapMemRefToEquivSet(MemRefHandle ref, int equivSetId)
00185 {
00186     mMemRefToSets[ref].insert(equivSetId);
00187 }
00188 
00190 void EquivSets::mapMemRefToEquivSet(OA_ptr<MemRefExpr> ref, int equivSetId)
00191 {
00192     mMREToIdMap[ref] = equivSetId;
00193 }
00194 
00195 
00197 void EquivSets::mapMemRefToProc(MemRefHandle ref, ProcHandle proc)
00198 {
00199     mMemRefToProc[ref] = proc;
00200 }
00201 
00204 void EquivSets::mapAllToUnknown()
00205 {
00206     // iterate over all mem ref handles we know about
00207     // and map them all to the zeroth equiv set
00208     OA_ptr<MemRefIterator> memrefIter = getMemRefIter();   
00209     for ( ; memrefIter->isValid(); (*memrefIter)++ ) {
00210         MemRefHandle memref = memrefIter->current();
00211         mMemRefToSets[memref].clear();
00212         mapMemRefToEquivSet(memref, 0);
00213 
00214         // clear out the mappings of procedures and equiv sets to locs
00215         mProcNSetToLocs.clear();
00216 
00217         // for the procedure that the memref occurs within
00218         // add the unknown location for the zeroth equiv set
00219         OA_ptr<UnknownLoc> unknown;  unknown = new UnknownLoc();
00220         addLocation(unknown, mMemRefToProc[memref], 0);
00221     }
00222 
00223 }
00224   
00225 void EquivSets::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00226 {
00227     os << "======== mMemRefToSets ========" << std::endl;
00228     std::map<MemRefHandle,std::set<int> >::iterator refToSetsIter;
00229     std::set<int>::iterator setIter;
00230     for (refToSetsIter=mMemRefToSets.begin(); 
00231          refToSetsIter!=mMemRefToSets.end();
00232          refToSetsIter++ )
00233     {
00234         MemRefHandle ref = refToSetsIter->first;
00235         os << "\tMemRefHandle(" << ref.hval() << ") => ";
00236         std::set<int>& set = refToSetsIter->second;
00237         for (setIter = set.begin(); setIter!=set.end(); setIter++) {
00238             os << *setIter << " ";
00239         }
00240         os << std::endl;
00241     }
00242 
00243 /*
00244     os << "======== mSetToLocs ========" << std::endl;
00245     std::map<int,std::set<OA_ptr<Location> > >::iterator setToLocsIter;
00246     LocSet::iterator locSetIter;
00247     for (setToLocsIter = mSetToLocs.begin(); setToLocsIter!=mSetToLocs.end();
00248          setToLocsIter++ )
00249     {
00250         int setID = setToLocsIter->first;
00251         os << "\tsetID = " << setID << " => {";
00252         std::set<OA_ptr<Location> >& set = setToLocsIter->second;
00253         for (locSetIter = set.begin(); locSetIter!=set.end(); locSetIter++) {
00254             OA_ptr<Location> loc = *locSetIter;
00255             loc->dump(os);
00256         }
00257         os << "\t}" << std::endl;
00258     }
00259 
00260 
00261     os << "======== Output of getMayLocs ========" << std::endl;
00262     OA_ptr<MemRefIterator> refIter = getMemRefIter();
00263     for ( ; refIter->isValid(); (*refIter)++ ) {
00264         MemRefHandle ref = refIter->current();
00265         os << "== May Locs for MemRefHandle = " << ir->toString(ref)
00266            << std::endl;
00267         OA_ptr<LocIterator> locIter = getMayLocs(ref);
00268         for ( ; locIter->isValid(); (*locIter)++ ) {
00269             OA_ptr<Location> loc = locIter->current();
00270             loc->dump(os,ir);
00271         }
00272     }
00273 */
00274 }
00275   
00276   } // end of Alias namespace
00277 } // end of OA namespace

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