diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2011-09-08 02:37:07 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2011-09-08 02:37:07 +0000 |
| commit | b78ac543c783aa7e2103f354bb8d913b937ab240 (patch) | |
| tree | b1bdaca5b0e2fa7a08c87e029d3c73bc1e1f31ed /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
| parent | 3d1b30767206b1947117156088d12ae2789c37fa (diff) | |
| download | bcm5719-llvm-b78ac543c783aa7e2103f354bb8d913b937ab240.tar.gz bcm5719-llvm-b78ac543c783aa7e2103f354bb8d913b937ab240.zip | |
A couple minor corrections to r139276.
llvm-svn: 139277
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
| -rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 45bc624d83e..4b7d2f5d9dc 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -977,20 +977,20 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size, // Try to distinguish something like &A[i][1] against &A[42][0]. // Grab the least significant bit set in any of the scales. - uint64_t Modulo = 0; - for (unsigned i = 0, e = GEP1VariableIndices.size(); - i != e; ++i) - Modulo |= (uint64_t)GEP1VariableIndices[0].Scale; - Modulo = Modulo ^ (Modulo & (Modulo - 1)); - - // We can compute the difference between the two addresses - // mod Modulo. Check whether that difference guarantees that the - // two locations do not alias. - uint64_t ModOffset = (uint64_t)GEP1BaseOffset & (Modulo - 1); - if (V1Size != UnknownSize && V2Size != UnknownSize && - ModOffset >= V2Size && V1Size <= Modulo - ModOffset) - return NoAlias; - + if (!GEP1VariableIndices.empty()) { + uint64_t Modulo = 0; + for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i) + Modulo |= (uint64_t)GEP1VariableIndices[i].Scale; + Modulo = Modulo ^ (Modulo & (Modulo - 1)); + + // We can compute the difference between the two addresses + // mod Modulo. Check whether that difference guarantees that the + // two locations do not alias. + uint64_t ModOffset = (uint64_t)GEP1BaseOffset & (Modulo - 1); + if (V1Size != UnknownSize && V2Size != UnknownSize && + ModOffset >= V2Size && V1Size <= Modulo - ModOffset) + return NoAlias; + } // Statically, we can see that the base objects are the same, but the // pointers have dynamic offsets which we can't resolve. And none of our |

