diff options
author | Arnold Schwaighofer <aschwaighofer@apple.com> | 2014-01-16 04:53:18 +0000 |
---|---|---|
committer | Arnold Schwaighofer <aschwaighofer@apple.com> | 2014-01-16 04:53:18 +0000 |
commit | e3ac099726571b58333b0fee827831d420d24285 (patch) | |
tree | 72ed0a518c507550b62dc5a9b2a36fece24fe815 /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | c3d687667de648818fc5bb47f5229df8d8ac1926 (diff) | |
download | bcm5719-llvm-e3ac099726571b58333b0fee827831d420d24285.tar.gz bcm5719-llvm-e3ac099726571b58333b0fee827831d420d24285.zip |
BasicAA: We need to check both access sizes when comparing a gep and an
underlying object of unknown size.
Fixes PR18460.
llvm-svn: 199351
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 404c5405933..6adeedb2448 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1009,7 +1009,15 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size, return NoAlias; } } else { - if (V1Size != UnknownSize) { + // We have the situation where: + // + + + // | BaseOffset | + // ---------------->| + // |-->V1Size |-------> V2Size + // GEP1 V2 + // We need to know that V2Size is not unknown, otherwise we might have + // stripped a gep with negative index ('gep <ptr>, -1, ...). + if (V1Size != UnknownSize && V2Size != UnknownSize) { if (-(uint64_t)GEP1BaseOffset < V1Size) return PartialAlias; return NoAlias; |