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 | 170707f76cfa4a13f8df567331dd92e2cbbd30b2 (patch) | |
| tree | 16cf87a12829b1e785977e7f2aa667adda740011 /lib/Analysis | |
| parent | 9bff2ae640bd55bb693967d74b26b471d1df774e (diff) | |
| download | external_llvm-170707f76cfa4a13f8df567331dd92e2cbbd30b2.zip external_llvm-170707f76cfa4a13f8df567331dd92e2cbbd30b2.tar.gz external_llvm-170707f76cfa4a13f8df567331dd92e2cbbd30b2.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); |
