diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
| commit | 4a16efa3e43e35f0cc9efe3a67f620f0017c3d36 (patch) | |
| tree | 06099edc18d30894081a822b756f117cbe0b8207 /lib/Analysis/BasicAliasAnalysis.cpp | |
| parent | 482e7bddf617ae804dc47133cb07eb4aa81e45de (diff) | |
Notes
Diffstat (limited to 'lib/Analysis/BasicAliasAnalysis.cpp')
| -rw-r--r-- | lib/Analysis/BasicAliasAnalysis.cpp | 95 | 
1 files changed, 38 insertions, 57 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 4bb93ee88a49..ae6da1af0c4f 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -13,28 +13,28 @@  //  //===----------------------------------------------------------------------===// -#include "llvm/Analysis/AliasAnalysis.h"  #include "llvm/Analysis/Passes.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" -#include "llvm/GlobalAlias.h" -#include "llvm/GlobalVariable.h" -#include "llvm/Instructions.h" -#include "llvm/IntrinsicInst.h" -#include "llvm/LLVMContext.h" -#include "llvm/Operator.h" -#include "llvm/Pass.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/Analysis/AliasAnalysis.h"  #include "llvm/Analysis/CaptureTracking.h" -#include "llvm/Analysis/MemoryBuiltins.h"  #include "llvm/Analysis/InstructionSimplify.h" +#include "llvm/Analysis/MemoryBuiltins.h"  #include "llvm/Analysis/ValueTracking.h" -#include "llvm/DataLayout.h" -#include "llvm/Target/TargetLibraryInfo.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallVector.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/GlobalAlias.h" +#include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Operator.h" +#include "llvm/Pass.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/GetElementPtrTypeIterator.h" +#include "llvm/Target/TargetLibraryInfo.h"  #include <algorithm>  using namespace llvm; @@ -88,7 +88,7 @@ static uint64_t getObjectSize(const Value *V, const DataLayout &TD,                                const TargetLibraryInfo &TLI,                                bool RoundToAlign = false) {    uint64_t Size; -  if (getObjectSize(V, Size, &TD, &TLI, RoundToAlign)) +  if (getUnderlyingObjectSize(V, Size, &TD, &TLI, RoundToAlign))      return Size;    return AliasAnalysis::UnknownSize;  } @@ -631,7 +631,7 @@ BasicAliasAnalysis::getModRefBehavior(const Function *F) {    // For intrinsics, we can check the table.    if (unsigned iid = F->getIntrinsicID()) {  #define GET_INTRINSIC_MODREF_BEHAVIOR -#include "llvm/Intrinsics.gen" +#include "llvm/IR/Intrinsics.gen"  #undef GET_INTRINSIC_MODREF_BEHAVIOR    } @@ -851,9 +851,13 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,    // pointers, figure out if the indexes to the GEP tell us anything about the    // derived pointer.    if (const GEPOperator *GEP2 = dyn_cast<GEPOperator>(V2)) { +    // Do the base pointers alias? +    AliasResult BaseAlias = aliasCheck(UnderlyingV1, UnknownSize, 0, +                                       UnderlyingV2, UnknownSize, 0); +      // Check for geps of non-aliasing underlying pointers where the offsets are      // identical. -    if (V1Size == V2Size) { +    if ((BaseAlias == MayAlias) && V1Size == V2Size) {        // Do the base pointers alias assuming type and size.        AliasResult PreciseBaseAlias = aliasCheck(UnderlyingV1, V1Size,                                                  V1TBAAInfo, UnderlyingV2, @@ -881,10 +885,6 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,          GEP1VariableIndices.clear();        }      } - -    // Do the base pointers alias? -    AliasResult BaseAlias = aliasCheck(UnderlyingV1, UnknownSize, 0, -                                       UnderlyingV2, UnknownSize, 0);      // If we get a No or May, then return it immediately, no amount of analysis      // will improve this situation. @@ -1064,39 +1064,20 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,                     Location(V2, V2Size, V2TBAAInfo));        if (PN > V2)          std::swap(Locs.first, Locs.second); - -      AliasResult Alias = -        aliasCheck(PN->getIncomingValue(0), PNSize, PNTBAAInfo, -                   PN2->getIncomingValueForBlock(PN->getIncomingBlock(0)), -                   V2Size, V2TBAAInfo); -      if (Alias == MayAlias) -        return MayAlias; - -      // If the first source of the PHI nodes NoAlias and the other inputs are -      // the PHI node itself through some amount of recursion this does not add -      // any new information so just return NoAlias. -      // bb: -      //    ptr = ptr2 + 1 -      // loop: -      //    ptr_phi = phi [bb, ptr], [loop, ptr_plus_one] -      //    ptr2_phi = phi [bb, ptr2], [loop, ptr2_plus_one] -      //    ... -      //    ptr_plus_one = gep ptr_phi, 1 -      //    ptr2_plus_one = gep ptr2_phi, 1 -      // We assume for the recursion that the the phis (ptr_phi, ptr2_phi) do -      // not alias each other. -      bool ArePhisAssumedNoAlias = false; -      AliasResult OrigAliasResult = NoAlias; -      if (Alias == NoAlias) { -        // Pretend the phis do not alias. -        assert(AliasCache.count(Locs) && -               "There must exist an entry for the phi node"); -        OrigAliasResult = AliasCache[Locs]; -        AliasCache[Locs] = NoAlias; -        ArePhisAssumedNoAlias = true; -      } - -      for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i) { +      // Analyse the PHIs' inputs under the assumption that the PHIs are +      // NoAlias. +      // If the PHIs are May/MustAlias there must be (recursively) an input +      // operand from outside the PHIs' cycle that is MayAlias/MustAlias or +      // there must be an operation on the PHIs within the PHIs' value cycle +      // that causes a MayAlias. +      // Pretend the phis do not alias. +      AliasResult Alias = NoAlias; +      assert(AliasCache.count(Locs) && +             "There must exist an entry for the phi node"); +      AliasResult OrigAliasResult = AliasCache[Locs]; +      AliasCache[Locs] = NoAlias; + +      for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {          AliasResult ThisAlias =            aliasCheck(PN->getIncomingValue(i), PNSize, PNTBAAInfo,                       PN2->getIncomingValueForBlock(PN->getIncomingBlock(i)), @@ -1107,7 +1088,7 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,        }        // Reset if speculation failed. -      if (ArePhisAssumedNoAlias && Alias != NoAlias) +      if (Alias != NoAlias)          AliasCache[Locs] = OrigAliasResult;        return Alias;  | 
