diff options
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp b/llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp index 2262fc9d7913..f4fa159d1ec7 100644 --- a/llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp +++ b/llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp @@ -23,6 +23,15 @@ #include "llvm/InitializePasses.h" using namespace llvm; +static bool canComputePointerDiff(ScalarEvolution &SE, + const SCEV *A, const SCEV *B) { + if (SE.getEffectiveSCEVType(A->getType()) != + SE.getEffectiveSCEVType(B->getType())) + return false; + + return SE.instructionCouldExistWitthOperands(A, B); +} + AliasResult SCEVAAResult::alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI) { // If either of the memory references is empty, it doesn't matter what the @@ -41,8 +50,7 @@ AliasResult SCEVAAResult::alias(const MemoryLocation &LocA, // If something is known about the difference between the two addresses, // see if it's enough to prove a NoAlias. - if (SE.getEffectiveSCEVType(AS->getType()) == - SE.getEffectiveSCEVType(BS->getType())) { + if (canComputePointerDiff(SE, AS, BS)) { unsigned BitWidth = SE.getTypeSizeInBits(AS->getType()); APInt ASizeInt(BitWidth, LocA.Size.hasValue() ? LocA.Size.getValue() |
