diff options
author | Duncan Sands <baldrick@free.fr> | 2008-10-01 15:25:41 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-10-01 15:25:41 +0000 |
commit | d65a4daeead235fbe3a66b9afcf8044df7f53bff (patch) | |
tree | 6bc0bc389541126b281b3a13ab60e2ee07d3bb9f /llvm/lib/VMCore | |
parent | 94798d31ddf28976048688699de008397b5e0d2a (diff) | |
download | bcm5719-llvm-d65a4daeead235fbe3a66b9afcf8044df7f53bff.tar.gz bcm5719-llvm-d65a4daeead235fbe3a66b9afcf8044df7f53bff.zip |
Factorize code: remove variants of "strip off
pointer bitcasts and GEP's", and centralize the
logic in Value::getUnderlyingObject. The
difference with stripPointerCasts is that
stripPointerCasts only strips GEPs if all
indices are zero, while getUnderlyingObject
strips GEPs no matter what the indices are.
llvm-svn: 56922
Diffstat (limited to 'llvm/lib/VMCore')
-rw-r--r-- | llvm/lib/VMCore/Value.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/llvm/lib/VMCore/Value.cpp b/llvm/lib/VMCore/Value.cpp index d143b6bf97e..0976a745991 100644 --- a/llvm/lib/VMCore/Value.cpp +++ b/llvm/lib/VMCore/Value.cpp @@ -322,22 +322,20 @@ 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) { - if (isa<PointerType>(CE->getOperand(0)->getType())) - return CE->getOperand(0)->stripPointerCasts(); + 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(); } - return this; - } - - if (BitCastInst *CI = dyn_cast<BitCastInst>(this)) { - if (isa<PointerType>(CI->getOperand(0)->getType())) - return CI->getOperand(0)->stripPointerCasts(); + } 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(); @@ -345,6 +343,21 @@ Value *Value::stripPointerCasts() { return this; } +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; +} + //===----------------------------------------------------------------------===// // User Class //===----------------------------------------------------------------------===// |