aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Analysis
diff options
context:
space:
mode:
authorWojciech Matyjewicz <wmatyjewicz@fastmail.fm>2007-12-13 16:22:58 +0000
committerWojciech Matyjewicz <wmatyjewicz@fastmail.fm>2007-12-13 16:22:58 +0000
commit4ba8cfc5a4e98dbe55529bb2a0de17565e90c128 (patch)
tree16cf87a12829b1e785977e7f2aa667adda740011 /lib/Analysis
parent696e5c047bd06bf6b7b5471b3f4dec319b43628b (diff)
downloadexternal_llvm-4ba8cfc5a4e98dbe55529bb2a0de17565e90c128.zip
external_llvm-4ba8cfc5a4e98dbe55529bb2a0de17565e90c128.tar.gz
external_llvm-4ba8cfc5a4e98dbe55529bb2a0de17565e90c128.tar.bz2
Make these loops follow GetGEPOperands() behavior.
Let: %q = GEP %p, X, ... If %p is a GEP, we can chase baseptr further, only if X==0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44999 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r--lib/Analysis/BasicAliasAnalysis.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp
index 557d521..7ce9d16 100644
--- a/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/lib/Analysis/BasicAliasAnalysis.cpp
@@ -391,17 +391,19 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
if (isGEP(V1) && isGEP(V2)) {
// Drill down into the first non-gep value, to test for must-aliasing of
// the base pointers.
- const Value *BasePtr1 = V1, *BasePtr2 = V2;
- do {
- BasePtr1 = cast<User>(BasePtr1)->getOperand(0);
- } while (isGEP(BasePtr1) &&
- cast<User>(BasePtr1)->getOperand(1) ==
- Constant::getNullValue(cast<User>(BasePtr1)->getOperand(1)->getType()));
- do {
- BasePtr2 = cast<User>(BasePtr2)->getOperand(0);
- } while (isGEP(BasePtr2) &&
- cast<User>(BasePtr2)->getOperand(1) ==
- Constant::getNullValue(cast<User>(BasePtr2)->getOperand(1)->getType()));
+ const User *G = cast<User>(V1);
+ while (isGEP(G->getOperand(0)) &&
+ G->getOperand(1) ==
+ Constant::getNullValue(G->getOperand(1)->getType()))
+ G = cast<User>(G->getOperand(0));
+ const Value *BasePtr1 = G->getOperand(0);
+
+ G = cast<User>(V2);
+ while (isGEP(G->getOperand(0)) &&
+ G->getOperand(1) ==
+ Constant::getNullValue(G->getOperand(1)->getType()))
+ G = cast<User>(G->getOperand(0));
+ const Value *BasePtr2 = G->getOperand(0);
// Do the base pointers alias?
AliasResult BaseAlias = alias(BasePtr1, ~0U, BasePtr2, ~0U);