diff options
author | Wojciech Matyjewicz <wmatyjewicz@fastmail.fm> | 2007-12-13 16:22:58 +0000 |
---|---|---|
committer | Wojciech Matyjewicz <wmatyjewicz@fastmail.fm> | 2007-12-13 16:22:58 +0000 |
commit | 4ba8cfc5a4e98dbe55529bb2a0de17565e90c128 (patch) | |
tree | 16cf87a12829b1e785977e7f2aa667adda740011 /lib/Analysis | |
parent | 696e5c047bd06bf6b7b5471b3f4dec319b43628b (diff) | |
download | external_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.cpp | 24 |
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); |