X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FAnalysis%2FAliasAnalysis.cpp;h=c7b68fab686a3172aa1660d7cda70734f610a7b3;hb=a77600e8612c51e75f55710ce9af7eb8aba8b083;hp=193be84b0dbf1fd09ed71e668b3369c92fbf2ce3;hpb=5a24d70d99cc76be190ed6ebe37d09585046ddc3;p=oota-llvm.git diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 193be84b0db..c7b68fab686 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 implements the generic AliasAnalysis interface which is used as the @@ -25,8 +25,10 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Pass.h" #include "llvm/BasicBlock.h" -#include "llvm/iMemory.h" +#include "llvm/Instructions.h" +#include "llvm/Type.h" #include "llvm/Target/TargetData.h" using namespace llvm; @@ -56,14 +58,11 @@ bool AliasAnalysis::pointsToConstantMemory(const Value *P) { return AA->pointsToConstantMemory(P); } -bool AliasAnalysis::doesNotAccessMemory(Function *F) { - assert(AA && "AA didn't call InitializeAliasAnalysis in its run method!"); - return AA->doesNotAccessMemory(F); -} - -bool AliasAnalysis::onlyReadsMemory(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 doesNotAccessMemory(F) || AA->onlyReadsMemory(F); + return AA->getModRefBehavior(F, CS, Info); } bool AliasAnalysis::hasNoModRefInfoForCalls() const { @@ -115,18 +114,20 @@ AliasAnalysis::getModRefInfo(StoreInst *S, Value *P, unsigned Size) { 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; + if (Function *F = CS.getCalledFunction()) { + ModRefBehavior MRB = getModRefBehavior(F, CallSite()); + 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)); } @@ -186,6 +187,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. -// -extern void llvm::BasicAAStub(); -static IncludeFile INCLUDE_BASICAA_CPP((void*)&BasicAAStub); +DEFINING_FILE_FOR(AliasAnalysis)