X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FAnalysis%2FAliasAnalysis.cpp;h=c8c43a69ef743bb841505fa9e825da66c490498d;hb=73b43b9b549a75fb0015c825df68abd95705a67c;hp=a90d80aed5ae9a08dfbb41a747b72d4ffd7c2da7;hpb=2c20ef506f65f649fd9fb8823f8c7b0086b1ba5c;p=oota-llvm.git diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index a90d80aed5a..c8c43a69ef7 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -1,10 +1,10 @@ //===- AliasAnalysis.cpp - Generic Alias Analysis Interface Implementation -==// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // // This file implements the generic AliasAnalysis interface which is used as the @@ -25,16 +25,17 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Pass.h" #include "llvm/BasicBlock.h" +#include "llvm/Function.h" #include "llvm/Instructions.h" +#include "llvm/Type.h" #include "llvm/Target/TargetData.h" -#include using namespace llvm; // Register the AliasAnalysis interface, providing a nice name to refer to. -namespace { - RegisterAnalysisGroup Z("Alias Analysis"); -} +static RegisterAnalysisGroup Z("Alias Analysis"); +char AliasAnalysis::ID = 0; //===----------------------------------------------------------------------===// // Default chaining methods @@ -57,14 +58,11 @@ bool AliasAnalysis::pointsToConstantMemory(const Value *P) { return AA->pointsToConstantMemory(P); } -bool AliasAnalysis::doesNotAccessMemory(Function *F) { +AliasAnalysis::ModRefBehavior +AliasAnalysis::getModRefBehavior(Function *F, CallSite CS, + std::vector *Info) { assert(AA && "AA didn't call InitializeAliasAnalysis in its run method!"); - return AA->doesNotAccessMemory(F); -} - -bool AliasAnalysis::onlyReadsMemory(Function *F) { - assert(AA && "AA didn't call InitializeAliasAnalysis in its run method!"); - return doesNotAccessMemory(F) || AA->onlyReadsMemory(F); + return AA->getModRefBehavior(F, CS, Info); } bool AliasAnalysis::hasNoModRefInfoForCalls() const { @@ -96,7 +94,7 @@ AliasAnalysis::getModRefInfo(CallSite CS1, CallSite CS2) { AliasAnalysis::ModRefResult AliasAnalysis::getModRefInfo(LoadInst *L, Value *P, unsigned Size) { - return alias(L->getOperand(0), TD->getTypeSize(L->getType()), + return alias(L->getOperand(0), TD->getTypeStoreSize(L->getType()), P, Size) ? Ref : NoModRef; } @@ -104,8 +102,8 @@ AliasAnalysis::ModRefResult AliasAnalysis::getModRefInfo(StoreInst *S, Value *P, unsigned Size) { // If the stored address cannot alias the pointer in question, then the // pointer cannot be modified by the store. - if (!alias(S->getOperand(1), TD->getTypeSize(S->getOperand(0)->getType()), - P, Size)) + if (!alias(S->getOperand(1), + TD->getTypeStoreSize(S->getOperand(0)->getType()), P, Size)) return NoModRef; // If the pointer is a pointer to constant memory, then it could not have been @@ -113,21 +111,47 @@ AliasAnalysis::getModRefInfo(StoreInst *S, Value *P, unsigned Size) { return pointsToConstantMemory(P) ? NoModRef : Mod; } +AliasAnalysis::ModRefBehavior +AliasAnalysis::getModRefBehavior(CallSite CS, + std::vector *Info) { + if (CS.doesNotAccessMemory()) + // Can't do better than this. + return DoesNotAccessMemory; + ModRefBehavior MRB = UnknownModRefBehavior; + if (Function *F = CS.getCalledFunction()) + MRB = getModRefBehavior(F, CS, Info); + if (MRB != DoesNotAccessMemory && CS.onlyReadsMemory()) + return OnlyReadsMemory; + return MRB; +} + +AliasAnalysis::ModRefBehavior +AliasAnalysis::getModRefBehavior(Function *F, + std::vector *Info) { + if (F->doesNotAccessMemory()) + // Can't do better than this. + return DoesNotAccessMemory; + ModRefBehavior MRB = getModRefBehavior(F, CallSite(), Info); + if (MRB != DoesNotAccessMemory && F->onlyReadsMemory()) + return OnlyReadsMemory; + return MRB; +} + AliasAnalysis::ModRefResult AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { ModRefResult Mask = ModRef; - if (Function *F = CS.getCalledFunction()) - if (onlyReadsMemory(F)) { - if (doesNotAccessMemory(F)) return NoModRef; - Mask = Ref; - } + ModRefBehavior MRB = getModRefBehavior(CS); + if (MRB == OnlyReadsMemory) + Mask = Ref; + else if (MRB == DoesNotAccessMemory) + return NoModRef; if (!AA) return Mask; // If P points to a constant memory location, the call definitely could not // modify the memory location. if ((Mask & Mod) && AA->pointsToConstantMemory(P)) - Mask = Ref; + Mask = ModRefResult(Mask & ~Mod); return ModRefResult(Mask & AA->getModRefInfo(CS, P, Size)); } @@ -139,7 +163,7 @@ AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { // AliasAnalysis::~AliasAnalysis() {} -/// setTargetData - Subclasses must call this method to initialize the +/// InitializeAliasAnalysis - Subclasses must call this method to initialize the /// AliasAnalysis interface before any other methods are called. /// void AliasAnalysis::InitializeAliasAnalysis(Pass *P) { @@ -187,8 +211,4 @@ bool AliasAnalysis::canInstructionRangeModify(const Instruction &I1, // be pulled in if the AliasAnalysis classes are pulled in. Otherwise we run // the risk of AliasAnalysis being used, but the default implementation not // being linked into the tool that uses it. -// -namespace llvm { - extern void BasicAAStub(); -} -static IncludeFile INCLUDE_BASICAA_CPP((void*)&BasicAAStub); +DEFINING_FILE_FOR(AliasAnalysis)