diff options
author | Duncan Sands <baldrick@free.fr> | 2008-12-29 21:06:19 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-12-29 21:06:19 +0000 |
commit | 5b7edcc3a7169caf022fab2b46842fd9f558fc92 (patch) | |
tree | 833ae0e85926b354e27b9d188f34570bee2320af /lib/VMCore/Value.cpp | |
parent | f07c55c09393460be0d81a6a8cbe9f8d4fcaf83a (diff) | |
download | external_llvm-5b7edcc3a7169caf022fab2b46842fd9f558fc92.zip external_llvm-5b7edcc3a7169caf022fab2b46842fd9f558fc92.tar.gz external_llvm-5b7edcc3a7169caf022fab2b46842fd9f558fc92.tar.bz2 |
Make stripPointerCasts and getUnderlyingObject
non-recursive.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61479 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Value.cpp')
-rw-r--r-- | lib/VMCore/Value.cpp | 65 |
1 files changed, 39 insertions, 26 deletions
diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 8e2dad3..ab7e044 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -324,38 +324,51 @@ void Value::replaceAllUsesWith(Value *New) { Value *Value::stripPointerCasts() { if (!isa<PointerType>(getType())) return this; - - if (ConstantExpr *CE = dyn_cast<ConstantExpr>(this)) { - if (CE->getOpcode() == Instruction::BitCast) { - return CE->getOperand(0)->stripPointerCasts(); - } else if (CE->getOpcode() == Instruction::GetElementPtr) { - for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) - if (!CE->getOperand(i)->isNullValue()) - return this; - return CE->getOperand(0)->stripPointerCasts(); + Value *V = this; + do { + if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { + if (CE->getOpcode() == Instruction::GetElementPtr) { + for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) + if (!CE->getOperand(i)->isNullValue()) + return V; + V = CE->getOperand(0); + } else if (CE->getOpcode() == Instruction::BitCast) { + V = CE->getOperand(0); + } else { + return V; + } + } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V)) { + if (!GEP->hasAllZeroIndices()) + return V; + V = GEP->getOperand(0); + } else if (BitCastInst *CI = dyn_cast<BitCastInst>(V)) { + V = CI->getOperand(0); + } else { + return V; } - } else if (BitCastInst *CI = dyn_cast<BitCastInst>(this)) { - return CI->getOperand(0)->stripPointerCasts(); - } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(this)) { - if (GEP->hasAllZeroIndices()) - return GEP->getOperand(0)->stripPointerCasts(); - } - return this; + assert(isa<PointerType>(V->getType()) && "Unexpected operand type!"); + } while (1); } Value *Value::getUnderlyingObject() { if (!isa<PointerType>(getType())) return this; - - if (Instruction *I = dyn_cast<Instruction>(this)) { - if (isa<BitCastInst>(I) || isa<GetElementPtrInst>(I)) - return I->getOperand(0)->getUnderlyingObject(); - } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(this)) { - if (CE->getOpcode() == Instruction::BitCast || - CE->getOpcode() == Instruction::GetElementPtr) - return CE->getOperand(0)->getUnderlyingObject(); - } - return this; + Value *V = this; + do { + if (Instruction *I = dyn_cast<Instruction>(V)) { + if (!isa<BitCastInst>(I) && !isa<GetElementPtrInst>(I)) + return V; + V = I->getOperand(0); + } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { + if (CE->getOpcode() != Instruction::BitCast && + CE->getOpcode() != Instruction::GetElementPtr) + return V; + V = CE->getOperand(0); + } else { + return V; + } + assert(isa<PointerType>(V->getType()) && "Unexpected operand type!"); + } while (1); } /// DoPHITranslation - If this value is a PHI node with CurBB as its parent, |