X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FAnalysis%2FAliasAnalysis.cpp;h=c5523ec4634d8e4a83aa33d4afcbb1cf91acf18a;hb=ef4cfc749a61d0d0252196c957697436ba7ec068;hp=369f2f4f90e1e3f30f8d9c22ce11a60ced048068;hpb=d9289a54cdce925fb189c5558f694a241b6e6d04;p=oota-llvm.git diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 369f2f4f90e..c5523ec4634 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -120,9 +120,18 @@ AliasAnalysis::getModRefBehavior(CallSite CS, AliasAnalysis::ModRefBehavior AliasAnalysis::getModRefBehavior(Function *F, std::vector *Info) { - if (F && F->doesNotAccessMemory()) - // Can't do better than this. - return DoesNotAccessMemory; + if (F) { + if (F->doesNotAccessMemory()) + // Can't do better than this. + return DoesNotAccessMemory; + if (F->onlyReadsMemory()) + return OnlyReadsMemory; + if (unsigned id = F->getIntrinsicID()) { +#define GET_INTRINSIC_MODREF_BEHAVIOR +#include "llvm/Intrinsics.gen" +#undef GET_INTRINSIC_MODREF_BEHAVIOR + } + } return UnknownModRefBehavior; } @@ -130,10 +139,10 @@ AliasAnalysis::ModRefResult AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { ModRefResult Mask = ModRef; ModRefBehavior MRB = getModRefBehavior(CS); - if (MRB == OnlyReadsMemory) - Mask = Ref; - else if (MRB == DoesNotAccessMemory) + if (MRB == DoesNotAccessMemory) return NoModRef; + else if (MRB == OnlyReadsMemory) + Mask = Ref; else if (MRB == AliasAnalysis::AccessesArguments) { bool doesAlias = false; for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); @@ -142,7 +151,7 @@ AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { doesAlias = true; break; } - + if (!doesAlias) return NoModRef; }