diff options
Diffstat (limited to 'lib/Analysis/MemoryDependenceAnalysis.cpp')
| -rw-r--r-- | lib/Analysis/MemoryDependenceAnalysis.cpp | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index a6c590126c2f..bb7bf967994c 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -647,6 +647,7 @@ MemDepResult MemoryDependenceResults::getSimplePointerDependencyFrom(        // Ok, this store might clobber the query pointer.  Check to see if it is        // a must alias: in this case, we want to return this as a def. +      // FIXME: Use ModRefInfo::Must bit from getModRefInfo call above.        MemoryLocation StoreLoc = MemoryLocation::get(SI);        // If we found a pointer, check if it could be the same as our pointer. @@ -690,7 +691,7 @@ MemDepResult MemoryDependenceResults::getSimplePointerDependencyFrom(      // If necessary, perform additional analysis.      if (isModAndRefSet(MR))        MR = AA.callCapturesBefore(Inst, MemLoc, &DT, &OBB); -    switch (MR) { +    switch (clearMust(MR)) {      case ModRefInfo::NoModRef:        // If the call has no effect on the queried pointer, just ignore it.        continue; @@ -919,6 +920,14 @@ void MemoryDependenceResults::getNonLocalPointerDependency(      Instruction *QueryInst, SmallVectorImpl<NonLocalDepResult> &Result) {    const MemoryLocation Loc = MemoryLocation::get(QueryInst);    bool isLoad = isa<LoadInst>(QueryInst); +  return getNonLocalPointerDependencyFrom(QueryInst, Loc, isLoad, Result); +} + +void MemoryDependenceResults::getNonLocalPointerDependencyFrom( +    Instruction *QueryInst, +    const MemoryLocation &Loc, +    bool isLoad, +    SmallVectorImpl<NonLocalDepResult> &Result) {    BasicBlock *FromBB = QueryInst->getParent();    assert(FromBB); @@ -1118,21 +1127,15 @@ bool MemoryDependenceResults::getNonLocalPointerDepFromBB(    // If we already have a cache entry for this CacheKey, we may need to do some    // work to reconcile the cache entry and the current query.    if (!Pair.second) { -    if (CacheInfo->Size < Loc.Size) { -      // The query's Size is greater than the cached one. Throw out the -      // cached data and proceed with the query at the greater size. +    if (CacheInfo->Size != Loc.Size) { +      // The query's Size differs from the cached one. Throw out the +      // cached data and proceed with the query at the new size.        CacheInfo->Pair = BBSkipFirstBlockPair();        CacheInfo->Size = Loc.Size;        for (auto &Entry : CacheInfo->NonLocalDeps)          if (Instruction *Inst = Entry.getResult().getInst())            RemoveFromReverseMap(ReverseNonLocalPtrDeps, Inst, CacheKey);        CacheInfo->NonLocalDeps.clear(); -    } else if (CacheInfo->Size > Loc.Size) { -      // This query's Size is less than the cached one. Conservatively restart -      // the query using the greater size. -      return getNonLocalPointerDepFromBB( -          QueryInst, Pointer, Loc.getWithNewSize(CacheInfo->Size), isLoad, -          StartBB, Result, Visited, SkipFirstBlock);      }      // If the query's AATags are inconsistent with the cached one,  | 
