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
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
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
00057
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
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
00145
00146
00147
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
00207
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
00215 mProcNSetToLocs.clear();
00216
00217
00218
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
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 }
00275
00276 }
00277 }