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
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
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
00103
00104
00105
00106
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
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;
00161 virtual bool isValid() const;
00162
00163 virtual void operator++();
00164 void operator++(int) { ++*this; }
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
00176
00177
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
00207
00208 std::map<OA_ptr<MemRefExpr>,int> mMREToID;
00209
00210 int mCount;
00211
00212
00213
00214 std::map<OA_ptr<MemRefExpr>,std::set<MemRefHandle> > mMREToMemRefHandles;
00215
00216
00217 std::map<OA_ptr<MemRefExpr>,std::set<ProcHandle> > mMREToProcs;
00218
00219
00220
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:
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 }
00284 }
00285
00286 #endif