summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2014-01-16 04:53:18 +0000
committerArnold Schwaighofer <aschwaighofer@apple.com>2014-01-16 04:53:18 +0000
commite3ac099726571b58333b0fee827831d420d24285 (patch)
tree72ed0a518c507550b62dc5a9b2a36fece24fe815 /llvm/lib/Analysis/BasicAliasAnalysis.cpp
parentc3d687667de648818fc5bb47f5229df8d8ac1926 (diff)
downloadbcm5719-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.cpp10
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;
OpenPOWER on IntegriCloud