00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef LLVM_ANALYSIS_ALIAS_ANALYSIS_H
00031 #define LLVM_ANALYSIS_ALIAS_ANALYSIS_H
00032
00033 #include "llvm/Support/CallSite.h"
00034 #include "llvm/System/IncludeFile.h"
00035 #include <vector>
00036
00037 namespace llvm {
00038
00039 class LoadInst;
00040 class StoreInst;
00041 class VAArgInst;
00042 class TargetData;
00043 class Pass;
00044 class AnalysisUsage;
00045
00046 class AliasAnalysis {
00047 protected:
00048 const TargetData *TD;
00049 AliasAnalysis *AA;
00050
00056 void InitializeAliasAnalysis(Pass *P);
00057
00060 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
00061
00062 public:
00063 static char ID;
00064 AliasAnalysis() : TD(0), AA(0) {}
00065 virtual ~AliasAnalysis();
00066
00070 const TargetData *getTargetData() const { return TD; }
00071
00075 unsigned getTypeStoreSize(const Type *Ty);
00076
00077
00080
00087 enum AliasResult { NoAlias = 0, MayAlias = 1, MustAlias = 2 };
00088
00094 virtual AliasResult alias(const Value *V1, unsigned V1Size,
00095 const Value *V2, unsigned V2Size);
00096
00099 bool isNoAlias(const Value *V1, unsigned V1Size,
00100 const Value *V2, unsigned V2Size) {
00101 return alias(V1, V1Size, V2, V2Size) == NoAlias;
00102 }
00103
00108 virtual bool pointsToConstantMemory(const Value *P);
00109
00110
00113
00117 enum ModRefResult { NoModRef = 0, Ref = 1, Mod = 2, ModRef = 3 };
00118
00119
00124 enum ModRefBehavior {
00125
00126
00127
00128
00129 DoesNotAccessMemory,
00130
00131
00132
00133
00134
00135
00136 AccessesArguments,
00137
00138
00139
00140
00141
00142
00143
00144 AccessesArgumentsAndGlobals,
00145
00146
00147
00148
00149
00150 OnlyReadsMemory,
00151
00152
00153
00154 UnknownModRefBehavior
00155 };
00156
00159 struct PointerAccessInfo {
00163 Value *V;
00164
00167 ModRefResult ModRefInfo;
00168
00174 enum AccessType {
00177 ScalarAccess,
00178
00181 ArrayAccess,
00182
00184
00187 CallsThrough
00188 };
00189 };
00190
00192 virtual ModRefBehavior getModRefBehavior(CallSite CS,
00193 std::vector<PointerAccessInfo> *Info = 0);
00194
00197 virtual ModRefBehavior getModRefBehavior(Function *F,
00198 std::vector<PointerAccessInfo> *Info = 0);
00199
00202 static ModRefBehavior getModRefBehavior(unsigned iid);
00203
00215 bool doesNotAccessMemory(CallSite CS) {
00216 return getModRefBehavior(CS) == DoesNotAccessMemory;
00217 }
00218
00222 bool doesNotAccessMemory(Function *F) {
00223 return getModRefBehavior(F) == DoesNotAccessMemory;
00224 }
00225
00235 bool onlyReadsMemory(CallSite CS) {
00236 ModRefBehavior MRB = getModRefBehavior(CS);
00237 return MRB == DoesNotAccessMemory || MRB == OnlyReadsMemory;
00238 }
00239
00244 bool onlyReadsMemory(Function *F) {
00245 ModRefBehavior MRB = getModRefBehavior(F);
00246 return MRB == DoesNotAccessMemory || MRB == OnlyReadsMemory;
00247 }
00248
00249
00253
00258 virtual ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
00259
00266 virtual ModRefResult getModRefInfo(CallSite CS1, CallSite CS2);
00267
00268 public:
00270 ModRefResult getModRefInfo(LoadInst *L, Value *P, unsigned Size);
00271 ModRefResult getModRefInfo(StoreInst *S, Value *P, unsigned Size);
00272 ModRefResult getModRefInfo(CallInst *C, Value *P, unsigned Size) {
00273 return getModRefInfo(CallSite(C), P, Size);
00274 }
00275 ModRefResult getModRefInfo(InvokeInst *I, Value *P, unsigned Size) {
00276 return getModRefInfo(CallSite(I), P, Size);
00277 }
00278 ModRefResult getModRefInfo(VAArgInst* I, Value* P, unsigned Size) {
00279 return AliasAnalysis::ModRef;
00280 }
00281 ModRefResult getModRefInfo(Instruction *I, Value *P, unsigned Size) {
00282 switch (I->getOpcode()) {
00283 case Instruction::VAArg: return getModRefInfo((VAArgInst*)I, P, Size);
00284 case Instruction::Load: return getModRefInfo((LoadInst*)I, P, Size);
00285 case Instruction::Store: return getModRefInfo((StoreInst*)I, P, Size);
00286 case Instruction::Call: return getModRefInfo((CallInst*)I, P, Size);
00287 case Instruction::Invoke: return getModRefInfo((InvokeInst*)I, P, Size);
00288 default: return NoModRef;
00289 }
00290 }
00291
00292
00295
00299 bool canBasicBlockModify(const BasicBlock &BB, const Value *P, unsigned Size);
00300
00306 bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2,
00307 const Value *Ptr, unsigned Size);
00308
00309
00315
00320 virtual void deleteValue(Value *V);
00321
00328 virtual void copyValue(Value *From, Value *To);
00329
00333 void replaceWithNewValue(Value *Old, Value *New) {
00334 copyValue(Old, New);
00335 deleteValue(Old);
00336 }
00337 };
00338
00341 bool isNoAliasCall(const Value *V);
00342
00350 bool isIdentifiedObject(const Value *V);
00351
00352 }
00353
00354
00355
00356
00357
00358 FORCE_DEFINING_FILE_TO_BE_LINKED(AliasAnalysis)
00359 FORCE_DEFINING_FILE_TO_BE_LINKED(BasicAliasAnalysis)
00360
00361 #endif