ManagerFIAlias.hpp

Go to the documentation of this file.
00001 
00015 #ifndef ManagerFIAlias_H
00016 #define ManagerFIAlias_H
00017 
00018 //--------------------------------------------------------------------
00019 #include <cassert>
00020 #include <map>
00021 #include <set>
00022 
00023 // OpenAnalysis headers
00024 #include <OpenAnalysis/IRInterface/AliasIRInterface.hpp>
00025 #include <OpenAnalysis/Utils/UnionFindUniverse.hpp>
00026 #include <OpenAnalysis/MemRefExpr/MemRefExprVisitor.hpp>
00027 #include <OpenAnalysis/Alias/Interface.hpp>
00028 #include <OpenAnalysis/Location/Locations.hpp>
00029 
00030 namespace OA {
00031   namespace Alias {
00032 
00038 class FixedLocationVisitor : public virtual MemRefExprVisitor {
00039   public:
00040     FixedLocationVisitor(OA_ptr<AliasIRInterface> ir, ProcHandle proc,
00041                          OA_ptr<Interface> aliasInterface)
00042       : mIR(ir), mProc(proc), mDirectRef(false),
00043         mAliasInterface(aliasInterface) 
00044     {
00045        mDirectRefLocations = new LocSet;
00046     }
00047     ~FixedLocationVisitor() {}
00048 
00049     OA_ptr<LocSetIterator> getDirectRefLocIterator();
00050 
00051     void visitNamedRef(NamedRef& ref); 
00052     void visitUnnamedRef(UnnamedRef& ref); 
00053     void visitUnknownRef(UnknownRef& ref);
00054     void visitAddressOf(AddressOf& ref);
00055     void visitDeref(Deref& ref);
00056     void visitFieldAccess(FieldAccess& ref); 
00057     // default handling of more specific SubSet specificiations
00058     void visitSubSetRef(SubSetRef& ref); 
00059 
00060   private:
00061 
00062     OA_ptr<LocSet> mDirectRefLocations;
00063 
00064     OA_ptr<Alias::Interface> mAliasInterface;
00065 
00066     void notDirect();
00067 
00068     bool mDirectRef;
00069     OA_ptr<Location> mLoc;
00070     OA_ptr<AliasIRInterface> mIR;
00071     ProcHandle mProc;
00072 };
00073 
00081 class InvisibleLocationVisitor : public virtual MemRefExprVisitor {
00082   public:
00083     InvisibleLocationVisitor(OA_ptr<AliasIRInterface> ir, ProcHandle proc,
00084                              std::set<SymHandle>& procFormalSet) 
00085         : mIR(ir),mProc(proc),mInvisibleRef(false), 
00086           mProcFormalSet(procFormalSet) {}
00087     ~InvisibleLocationVisitor() {}
00088 
00089     bool isInvisibleRef();
00090 
00091     OA_ptr<Location> getInvisibleRefLoc();
00092 
00095     void visitNamedRef(NamedRef& ref);
00096 
00097     void visitUnnamedRef(UnnamedRef& ref);
00098     void visitUnknownRef(UnknownRef& ref);
00099     void visitDeref(Deref& ref);
00100     void visitAddressOf(AddressOf& ref);
00101 
00102     // default handling of more specific SubSet specificiations
00103     // nothing more specific than this is needed because if
00104     // a deref to a global or formal was involved then this ref will 
00105     // become the mre in the invisible location.  Doesn't matter what 
00106     // subclass the ref is
00107     void visitSubSetRef(SubSetRef& ref);
00108     void visitFieldAccess(FieldAccess& ref);
00109     void visitIdxAccess(IdxAccess& ref);
00110     void visitIdxExprAccess(IdxExprAccess& ref);
00111 
00112   private:
00113     void notInvisible();
00114 
00115     bool mInvisibleRef;
00116     bool mBaseIsNotLocal;
00117     bool mBaseIsFormal;
00118     OA_ptr<Location> mLoc;
00119     OA_ptr<AliasIRInterface> mIR;
00120     ProcHandle mProc;
00121     std::set<SymHandle>& mProcFormalSet;
00122 
00123 };
00124 
00129 class VisibleBaseVisitor : public virtual MemRefExprVisitor {
00130   public:
00131     VisibleBaseVisitor(OA_ptr<AliasIRInterface> ir, ProcHandle proc)
00132       : mIR(ir), mProc(proc),
00133         mBaseVisible(true)
00134     { }
00135     ~VisibleBaseVisitor() {}
00136 
00137     bool isBaseVisible() { return mBaseVisible; }
00138 
00139     void visitNamedRef(NamedRef& ref); 
00140     void visitUnnamedRef(UnnamedRef& ref); 
00141     void visitUnknownRef(UnknownRef& ref);
00142     void visitDeref(Deref& ref);
00143     void visitAddressOf(AddressOf& ref);
00144     // default handling of more specific SubSet specificiations
00145     void visitSubSetRef(SubSetRef& ref); 
00146 
00147   private:
00148     bool mBaseVisible;
00149     OA_ptr<AliasIRInterface> mIR;
00150     ProcHandle mProc;
00151 };
00152 
00153 class AnalyzedProcIterator : public IRProcIterator { 
00154 public: 
00155   AnalyzedProcIterator(std::set<ProcHandle> analyzedProcs) :
00156     mAnalyzedProcs(analyzedProcs), mIt(analyzedProcs.begin())
00157   { } 
00158   ~AnalyzedProcIterator() { }; 
00159  
00160   virtual ProcHandle current() const; // Returns the current item. 
00161   virtual bool isValid() const;        // False when all items are exhausted. 
00162          
00163   virtual void operator++();     // prefix 
00164   void operator++(int) { ++*this; }  // postfix 
00165 
00166   virtual void reset(); 
00167 private:
00168   std::set<ProcHandle>           mAnalyzedProcs;
00169   std::set<ProcHandle>::iterator mIt;
00170 
00171 }; 
00172 
00173 class RecordMREsVisitor;
00174 
00175 // FIAlias may analyze all procedures defined in the program or  
00176 // only those (iteratively) determined to be reachable.  
00177 // The latter is our modification to Ryder's algorithm.
00178 enum FIAliasImplement { ALL_PROCS = 0, REACHABLE_PROCS };
00179 
00189 class ManagerFIAlias 
00190 { 
00191 public:
00192   ManagerFIAlias(OA_ptr<AliasIRInterface> _ir);
00193   ~ManagerFIAlias () {}
00194 
00195   OA_ptr<UnionFindUniverse>
00196   performFIAlias( OA_ptr<IRProcIterator> procIter,
00197                   FIAliasImplement implement = ALL_PROCS );
00198 
00199   OA_ptr<IRProcIterator> getAnalyzedProcIter();
00200 
00201   void mergeSubSetRefs(OA_ptr<UnionFindUniverse> ufset);
00202 
00203 protected:
00204   OA_ptr<AliasIRInterface> mIR;
00205 
00206   //===== helper datastructures and routines
00207   // mapping of MemRefExpr to unique ids
00208   std::map<OA_ptr<MemRefExpr>,int> mMREToID;
00209   // use a counter to assign unique ids to each MemRefExpr
00210   int mCount;
00211 
00212   // mapping of MemRefExpr to set of MemRefHandles that can
00213   // be expressed by said MemRefExpr
00214   std::map<OA_ptr<MemRefExpr>,std::set<MemRefHandle> > mMREToMemRefHandles;
00215 
00216   // mapping of MemRefExpr to procedures it shows up in
00217   std::map<OA_ptr<MemRefExpr>,std::set<ProcHandle> > mMREToProcs;
00218 
00219   // mapping of MemRefHandles to procedures, each MemRefHandle is only in
00220   // one procedure
00221   std::map<MemRefHandle,ProcHandle> mMemRefHandleToProc;
00222 
00224   std::map<ProcHandle,std::set<SymHandle> > mProcToFormalSet;
00225 
00227   void recordMRE( OA_ptr<MemRefExpr> mre, ProcHandle proc, MemRefHandle memref);
00228   void recordMRE( OA_ptr<MemRefExpr> mre, ProcHandle proc );
00229 
00230   OA_ptr<MemRefExpr> createDeref( OA_ptr<MemRefExpr> mre );
00231 
00232   std::set<OA_ptr<MemRefExpr> > 
00233     allMemRefExprsInSameSet( OA_ptr<MemRefExpr> pMRE, 
00234                              OA_ptr<UnionFindUniverse> ufset);
00235 
00237   void initMemRefExprs( ProcHandle proc );
00238 
00240   void initMemRefExprs( OA_ptr<IRProcIterator> procIter );
00241 
00243   void addProcToWorkList(ProcHandle proc);
00244 
00246   void doPhase1Iteration(StmtHandle stmt, ProcHandle currProc, OA_ptr<UnionFindUniverse> ufset);
00247 
00249   bool doPhase2Iteration(OA_ptr<UnionFindUniverse> ufset, std::map<int,std::map<OA_ptr<MemRefExpr>,int> > & map);
00250 
00252   void doPhase3Iteration(CallHandle call, ProcHandle currProc,OA_ptr<UnionFindUniverse> ufset, std::map<int,std::map<OA_ptr<MemRefExpr>,int> > & map);
00253 
00255   std::set<ProcHandle> mAnalyzedProcs;
00256 
00258   OA_ptr<UnionFindUniverse>
00259   performFIAliasAllProcs( OA_ptr<IRProcIterator> procIter );
00260 
00262   OA_ptr<UnionFindUniverse>
00263   performFIAliasReachableProcs( OA_ptr<IRProcIterator> procIter );
00264 
00265   friend class RecordMREsVisitor;
00266 
00267 private: // helper functions
00268 void outputMREsInSet(int setID, 
00269         OA_ptr<UnionFindUniverse> ufset, 
00270         std::map<int,std::map<OA_ptr<MemRefExpr>,int> > & map  );
00271 void merge(int part1, int part2, OA_ptr<UnionFindUniverse> ufset, 
00272            std::map<int,std::map<OA_ptr<MemRefExpr>,int> > & map  );
00273 
00275   std::set<ProcHandle> mWorklist;
00276 
00278   FIAliasImplement mImplement;
00279 
00280 };
00281 
00282 
00283   } // end of Alias namespace
00284 } // end of OA namespace
00285 
00286 #endif