Go to the documentation of this file.00001
00016 #include "ManagerFIAliasAliasMap.hpp"
00017 #include <Utils/Util.hpp>
00018
00019
00020 namespace OA {
00021 namespace Alias {
00022
00023 static bool debug = false;
00024
00027 ManagerFIAliasAliasMap::ManagerFIAliasAliasMap(OA_ptr<AliasIRInterface> _ir)
00028 : ManagerFIAlias(_ir)
00029 {
00030 OA_DEBUG_CTRL_MACRO("DEBUG_ManagerFIAliasAliasMap:ALL", debug);
00031 }
00032
00033 OA_ptr<Alias::InterAliasMap>
00034 ManagerFIAliasAliasMap::performAnalysis( OA_ptr<IRProcIterator> procIter,
00035 FIAliasImplement implement )
00036 {
00037
00038 mInterAliasMap = new InterAliasMap();
00039
00040
00041
00042 OA_ptr<UnionFindUniverse> ufset = performFIAlias(procIter, implement);
00043
00044
00045
00046 OA_ptr<IRProcIterator> analyzedProcIter = getAnalyzedProcIter();
00047
00048
00049 buildAliasMaps(ufset,analyzedProcIter);
00050
00051 return mInterAliasMap;
00052 }
00053
00054
00055 void
00056 ManagerFIAliasAliasMap::buildAliasMaps( OA_ptr<UnionFindUniverse> ufset,
00057 OA_ptr<IRProcIterator> procIter )
00058 {
00059 if (debug) { std::cout << "=========== Building AliasMap ========"
00060 << std::endl; }
00061
00063 std::map<ProcHandle, std::map<int,int> > setIdToAliasMapId;
00064 std::set<int> allufsetIDs;
00065
00066
00067 std::map<OA_ptr<MemRefExpr>,int>::iterator mreMapIter;
00068 for (mreMapIter=mMREToID.begin(); mreMapIter!=mMREToID.end();
00069 mreMapIter++ )
00070 {
00071 OA_ptr<MemRefExpr> mre = mreMapIter->first;
00072
00073
00074 if(mre->isaRefOp()) {
00075 OA_ptr<RefOp> refop = mre.convert<RefOp>();
00076 if(refop->isaAddressOf()) { continue; }
00077 }
00078
00079 int setID = ufset->Find(mMREToID[mre]);
00080
00081 allufsetIDs.insert(setID);
00082
00083 }
00084
00085
00086
00087 for (procIter->reset(); procIter->isValid(); (*procIter)++ ) {
00088 ProcHandle proc = procIter->current();
00089 if (debug) {
00090 std::cout << "proc = " << mIR->toString(proc) << std::endl;
00091 }
00092 std::map<int,bool> foundNonVisibleRef;
00093 std::map<int,bool> foundVisibleFixedLoc;
00094 std::map<int,int> LocsetIdToAliasMapId;
00095
00096
00097 OA_ptr<AliasMap> aliasMap;
00098 aliasMap = new AliasMap(proc);
00099
00100
00101 for (mreMapIter=mMREToID.begin(); mreMapIter!=mMREToID.end();
00102 mreMapIter++ )
00103 {
00104 OA_ptr<MemRefExpr> mre = mreMapIter->first;
00105 if (debug) {
00106 std::cout << "\tmre = ";
00107 mre->dump(std::cout);
00108 mre->output(*mIR);
00109 }
00110
00111 if(mre->isaAddressOf()) {
00112 if (debug) {
00113 std::cout << "\taddressOf so skipping this MRE" << std::endl;
00114 }
00115 continue;
00116 }
00117
00118 int ufsetID = ufset->Find(mMREToID[mre]);
00119 if (debug) {
00120 std::cout << "\tufsetID = " << ufsetID << std::endl;
00121 }
00122
00123
00124
00125
00126 VisibleBaseVisitor mreVisitor(mIR, proc);
00127 mre->acceptVisitor(mreVisitor);
00128 if (mreVisitor.isBaseVisible()) {
00129
00130 if (debug) {
00131 std::cout << "\tmre has a visible base" << std::endl;
00132 }
00133
00134 if (LocsetIdToAliasMapId.find(ufsetID)
00135 ==LocsetIdToAliasMapId.end() )
00136 {
00137 LocsetIdToAliasMapId[ufsetID] = aliasMap->makeEmptySet();
00138 }
00139 int aliasMapSetId = LocsetIdToAliasMapId[ufsetID];
00140
00141 FixedLocationVisitor visitor(mIR, proc, aliasMap);
00142 mre->acceptVisitor(visitor);
00143 OA_ptr<LocSetIterator> locSetIterPtr =
00144 visitor.getDirectRefLocIterator();
00145
00146
00147 if (locSetIterPtr->isValid()) {
00148 foundVisibleFixedLoc[ufsetID] = true;
00149
00150
00151 for (; locSetIterPtr->isValid(); ++(*locSetIterPtr) ) {
00152 OA_ptr<Location> directRefLoc = (locSetIterPtr->current());
00153 if (debug) {
00154 std::cout << "Location: directRefLoc = ";
00155 directRefLoc->output(*mIR);
00156 }
00157
00158 aliasMap->addLocation( directRefLoc, aliasMapSetId );
00159
00160 if(directRefLoc->isaSubSet()) {
00161 OA_ptr<LocSubSet> locSubSet;
00162 locSubSet = directRefLoc.convert<LocSubSet>();
00163 OA_ptr<Location> baseLoc;
00164 baseLoc = locSubSet->getBaseLoc();
00165 aliasMap->removeBaseLoc(baseLoc, aliasMapSetId );
00166 }
00167 }
00168
00169
00170 } else {
00171 InvisibleLocationVisitor invVisitor(mIR, proc,
00172 mProcToFormalSet[proc]);
00173 mre->acceptVisitor(invVisitor);
00174 if (invVisitor.isInvisibleRef()) {
00175 OA_ptr<Location> visitorloc
00176 = invVisitor.getInvisibleRefLoc();
00177 if (debug) {
00178 std::cout << "Location: invloc = ";
00179 visitorloc->output(*mIR);
00180 }
00181 aliasMap->addLocation( visitorloc, aliasMapSetId );
00182 }
00183 }
00184
00185
00186
00187
00188 if (LocsetIdToAliasMapId.find(ufsetID)
00189 !=LocsetIdToAliasMapId.end() )
00190 {
00191 int aliasMapSetId = LocsetIdToAliasMapId[ufsetID];
00192 aliasMap->mapMemRefToMapSet(mre,
00193 LocsetIdToAliasMapId[ufsetID]);
00194 }
00195
00196
00197
00198 } else {
00199
00200 foundNonVisibleRef[ufsetID] = true;
00201 }
00202
00203 }
00204
00205
00206
00207
00208
00209 for (std::set<int>::iterator setIter=allufsetIDs.begin();
00210 setIter!=allufsetIDs.end(); setIter++)
00211 {
00212 if (foundVisibleFixedLoc[*setIter] == true
00213 && foundNonVisibleRef[*setIter] == false )
00214 {
00215 int aliasMapSetId = LocsetIdToAliasMapId[*setIter];
00216 aliasMap->removeInvisibleLocs(aliasMapSetId);
00217 }
00218 }
00219 setIdToAliasMapId[proc] = LocsetIdToAliasMapId;
00220
00221 mInterAliasMap->mapProcToAliasMap(proc,aliasMap);
00222
00223 }
00224
00225
00226
00227 std::set<OA_ptr<MemRefExpr> > multiFixLocMRESet;
00228 std::map<MemRefHandle,ProcHandle>::iterator refprocIter;
00229 for (refprocIter=mMemRefHandleToProc.begin();
00230 refprocIter!=mMemRefHandleToProc.end(); refprocIter++ )
00231 {
00232 MemRefHandle memref = refprocIter->first;
00233 ProcHandle proc = refprocIter->second;
00234
00235 if (debug) {
00236 std::cout << "\nMapping MemRefHandle: " << mIR->toString(memref)
00237 << std::endl;
00238 }
00239
00240
00241 OA_ptr<AliasMap> aliasMap = mInterAliasMap->getAliasMapResults(proc);
00242
00243
00244 OA_ptr<MemRefExprIterator> mreIterPtr
00245 = mIR->getMemRefExprIterator(memref);
00246
00247
00248 for (; mreIterPtr->isValid(); (*mreIterPtr)++) {
00249 OA_ptr<OA::MemRefExpr> mre = mreIterPtr->current();
00250
00251 if (debug) {
00252 std::cout << "\n\tFound MemRefExpr: ";
00253 mre->output(*mIR);
00254 std::cout << std::endl;
00255 }
00256
00257
00258
00259 if(mre->isaRefOp()) {
00260 OA_ptr<RefOp> refop = mre.convert<RefOp>();
00261 if(refop->isaAddressOf()) { continue; }
00262 }
00263
00264
00265 int ufsetID = ufset->Find(mMREToID[mre]);
00266
00267
00268
00269
00270
00271
00272
00273 if (setIdToAliasMapId[proc].find(ufsetID)
00274 ==setIdToAliasMapId[proc].end() )
00275 {
00276 setIdToAliasMapId[proc][ufsetID] = 0;
00277 }
00278
00279
00280 aliasMap->mapMemRefToMapSet(memref,
00281 setIdToAliasMapId[proc][ufsetID] );
00282
00283
00284
00285
00286 if ( multiFixLocMRESet.find(mre) != multiFixLocMRESet.end()) {
00287
00288
00289
00290 if (debug) {
00291 std::cout << "\n\t\tFound multiFixLocMRE, continuing ...\n";
00292 }
00293 continue;
00294 }
00295
00296 bool isLocalUnnamed = false;
00297 if (mre->isaUnnamed()) {
00298 if (debug) {
00299 std::cout << "\t\tUnnamedRef";
00300 }
00301 OA_ptr<UnnamedRef> uRef = mre.convert<UnnamedRef>();
00302 if (uRef->isLocal() && (uRef->getProcHandle()==proc)) {
00303 isLocalUnnamed = true;
00304 if (debug) {
00305 if (isLocalUnnamed) {
00306 std::cout << " Local\n";
00307 } else {
00308 std::cout << " non-Local\n";
00309 }
00310 }
00311 }
00312 }
00313 if (mre->isaNamed() || isLocalUnnamed) {
00314
00315 int aliasSetMapId = aliasMap->getMapSetId(mre);
00316
00317 if (debug) {
00318 if (!isLocalUnnamed) {
00319 std::cout << "\t\tNamedRef\n";
00320 }
00321 std::cout << "\t\t\tMapSetId = " << aliasSetMapId
00322 << " isMust = " << aliasMap->isMust(aliasSetMapId)
00323 << std::endl;
00324 }
00325
00326
00327 if (!aliasMap->isMust(aliasSetMapId)) {
00328 if (debug) {
00329 std::cout << "Found NamedRef or local UnnamedRef as MayAlias: ";
00330 mre->output(*mIR);
00331 std::cout << std::endl;
00332 }
00333
00334
00335 FixedLocationVisitor visitor(mIR, proc, aliasMap);
00336 mre->acceptVisitor(visitor);
00337 OA_ptr<LocSetIterator> locSetIterPtr =
00338 visitor.getDirectRefLocIterator();
00339
00340
00341 if (locSetIterPtr->isValid()) {
00342
00343
00344 OA_ptr<Location> directRefLoc = locSetIterPtr->current();
00345
00346 ++(*locSetIterPtr);
00347
00348
00349 if (locSetIterPtr->isValid()) {
00350
00351 multiFixLocMRESet.insert(mre);
00352 if (debug) {
00353 std::cout << "&*&*&*&* Warning: "
00354 << "found more than one fixed loc for mre";
00355 }
00356 continue;
00357 }
00358
00359
00360
00361 aliasSetMapId = aliasMap->makeEmptySet();
00362
00363 aliasMap->addLocation( directRefLoc, aliasSetMapId);
00364 if (debug) {
00365 std::cout << "only MustAlias Location: directRefLoc = ";
00366 directRefLoc->output(*mIR);
00367 std::cout << "\tremapping to set id: " << aliasSetMapId
00368 << std::endl;
00369 }
00370
00371 aliasMap->mapMemRefToMapSet(mre, aliasSetMapId);
00372 aliasMap->mapMemRefToMapSet(memref, aliasSetMapId);
00373
00374 }
00375
00376 }
00377 else {
00378
00379
00380 aliasMap->mapMemRefToMapSet(memref, aliasSetMapId);
00381 }
00382
00383 }
00384 }
00385 }
00386 }
00387
00388 }
00389 }