AliasMapXAIF.cpp

Go to the documentation of this file.
00001 
00015 #include "AliasMapXAIF.hpp"
00016 
00017 namespace OA {
00018   namespace XAIF {
00019 
00020     static bool debug = false;
00021 
00022     AliasMapXAIF::AliasMapXAIF(ProcHandle p) : mProcHandle(p) {}
00023 
00025     OA_ptr<MemRefHandleIterator> AliasMapXAIF::getMemRefIter() {
00026       // create an empty MemRefSet that will be given to iterator
00027       OA_ptr<MemRefSet> memrefSet; memrefSet = new MemRefSet;
00028 
00029       // put all memory references that we know about into the set
00030       std::map<MemRefHandle,int>::iterator mapIter;
00031       for (mapIter=mMemRefToIdMap.begin(); mapIter!=mMemRefToIdMap.end(); mapIter++) {
00032         memrefSet->insert(mapIter->first);
00033       }
00034 
00035       OA_ptr<MemRefHandleIterator> retIter; 
00036       retIter = new Alias::AliasMapMemRefIter(memrefSet);
00037       return retIter;
00038     } // end AliasMapXAIF::getMemRefIter()
00039 
00040     int AliasMapXAIF::getMapSetId(MemRefHandle ref) {
00041       std::map<MemRefHandle,int>::iterator pos;
00042       pos = mMemRefToIdMap.find(ref);
00043       if (pos != mMemRefToIdMap.end()) {
00044         return pos->second;
00045       }
00046       else {
00047         return 0;
00048       }
00049     } // end AliasMapXAIF::getMapSetId(MemRefHandle ref)
00050 
00051     int AliasMapXAIF::findMapSet(MemRefHandle ref) {
00052       std::map<MemRefHandle,int>::iterator pos;
00053       pos = mMemRefToIdMap.find(ref);
00054       if (pos != mMemRefToIdMap.end()) {
00055         return pos->second;
00056       }
00057       else {
00058         return AliasMapXAIF::SET_ID_NONE;
00059       }
00060     } // end AliasMapXAIF::findMapSet(MemRefHandle ref)
00061 
00062     int AliasMapXAIF::findMapSet(OA_ptr<std::set<LocTuple> > pLocTupleSet) {
00063       int retval = SET_ID_NONE;
00064       // loop through location sets and compare them to given location set
00065       std::map<int,OA_ptr<std::set<LocTuple> > >::iterator mapIter;
00066       for (mapIter=mIdToLocTupleSetMap.begin(); mapIter!=mIdToLocTupleSetMap.end(); mapIter++) {
00067         OA_ptr<std::set<LocTuple> > mapLocTupleSet = mapIter->second;
00068         if (pLocTupleSet == mapLocTupleSet) {
00069           return mapIter->first;
00070         }
00071       }
00072       return retval;
00073     } // end AliasMapXAIF::findMapSet(OA_ptr<std::set<LocTuple> > pLocTupleSet)
00074 
00075     OA_ptr<IdIterator> AliasMapXAIF::getIdIterator() {
00076       OA_ptr<IdIterator> retval;
00077       retval = new IdIterator(mIdToLocTupleSetMap);
00078       return retval;
00079     } // end AliasMapXAIF::getIdIterator()
00080 
00082     OA_ptr<LocTupleIterator> AliasMapXAIF::getLocIterator(int setId) {
00083       OA_ptr<LocTupleIterator> retval;
00084       retval = new LocTupleIterator(*mIdToLocTupleSetMap[setId]); 
00085       return retval;
00086     } // end AliasMapXAIF::getLocIterator()
00087 
00089     void AliasMapXAIF::mapLocTupleSet(OA_ptr<std::set<LocTuple> > ltSet, int setId) {
00090       mIdToLocTupleSetMap[setId] = ltSet;
00091     } // end AliasMapXAIF::mapLocTupleSet()
00092 
00095     void AliasMapXAIF::mapMemRefToMapSet(MemRefHandle ref, int setId) {
00096       // if this memref is already pointed to one mapset then need
00097       // to take it out of mIdToMemRefSetMap for the current set id
00098       int currSetId = findMapSet(ref);
00099       if (currSetId != AliasMapXAIF::SET_ID_NONE) {
00100         mIdToMemRefSetMap[currSetId].erase(ref);
00101       } 
00102       mMemRefToIdMap[ref] = setId;
00103       mIdToMemRefSetMap[setId].insert(ref);
00104     } // end AliasMapXAIF::mapMemRefToMapSet()
00105 
00107     void AliasMapXAIF::output(IRHandlesIRInterface& ir) {
00108       sOutBuild->objStart("AliasMapXAIF");
00109       sOutBuild->outputIRHandle(mProcHandle, ir);
00110 
00111       // print locations for each set, ID : { LocTuple }
00112       sOutBuild->mapStart("mIdToLocTupleSetMap", "int", "OA_ptr<std::set<LocTuple> >");
00113 
00114       for (OA_ptr<IdIterator> idIterPtr = getIdIterator(); idIterPtr->isValid(); ++(*idIterPtr) ) {
00115         //os << "AliasMapSet[" << i << "] = { ";
00116         int i = idIterPtr->current();
00117         sOutBuild->mapEntryStart();
00118         sOutBuild->mapKey(OA::int2string(i));
00119         sOutBuild->mapValueStart();
00120         sOutBuild->listStart();
00121         for (OA_ptr<LocTupleIterator> locIterPtr = getLocIterator(i); locIterPtr->isValid(); ++(*locIterPtr) ) {
00122           LocTuple loc = locIterPtr->current();
00123           sOutBuild->listItemStart();
00124           loc.output(ir);
00125           sOutBuild->listItemEnd();
00126         }
00127         sOutBuild->listEnd();
00128         sOutBuild->mapValueEnd();
00129         sOutBuild->mapEntryEnd();
00130       }
00131       sOutBuild->mapEnd("mIdToLocTupleSetMap");
00132 
00133       // print all memrefs and their mapping
00134       sOutBuild->mapStart("mMemRefToIdMap", "MemRefHandle", "int");
00135       for (OA_ptr<MemRefHandleIterator> memIterPtr = getMemRefIter(); memIterPtr->isValid(); (*memIterPtr)++) {
00136         MemRefHandle memref = memIterPtr->current();
00137         sOutBuild->mapEntryStart();
00138         sOutBuild->mapKeyStart();
00139         sOutBuild->outputIRHandle(memref, ir);
00140         sOutBuild->mapKeyEnd();
00141         sOutBuild->mapValue(OA::int2string(findMapSet(memref)));
00142         sOutBuild->mapEntryEnd();
00143       }
00144       sOutBuild->mapEnd("mMemRefToIdMap");
00145       sOutBuild->objEnd("AliasMap");
00146     } // end AliasMapXAIF::output()
00147 
00149     void AliasMapXAIF::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) {
00150       // print locations for each set, ID : { LocTuple }
00151       os << "============= AliasMapXAIF ============" << std::endl;
00152       OA_ptr<IdIterator> idIterPtr = getIdIterator();
00153       for ( ; idIterPtr->isValid(); ++(*idIterPtr) ) {
00154         int i = idIterPtr->current();
00155         os << "AliasMapSet[" << i << "] = { ";
00156         for (OA_ptr<LocTupleIterator> locIterPtr = getLocIterator(i); locIterPtr->isValid(); ++(*locIterPtr) ) {
00157           LocTuple loc = locIterPtr->current();
00158           os << ", ";
00159           os << "< " << loc.getLocRange().getStart() << "..";
00160           os << loc.getLocRange().getEnd() << ", " << loc.isFull();
00161           os << " > ";
00162         }
00163         os << " }" << std::endl;
00164       }
00165 
00166       // print all memrefs and their mapping
00167       os << "MemRef mapping to AliasMap sets:" << std::endl;
00168       for (OA_ptr<MemRefHandleIterator> memIterPtr = getMemRefIter(); memIterPtr->isValid(); (*memIterPtr)++) {
00169         MemRefHandle memref = memIterPtr->current();
00170         os << "(" << memref << ") " << ir->toString(memref);
00171         os << " --> " << findMapSet(memref) << std::endl;
00172       }
00173     } // end AliasMapXAIF::dump()
00174 
00175   } // end of Alias namespace
00176 } // end of OA namespace