aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Value.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VMCore/Value.cpp')
-rw-r--r--lib/VMCore/Value.cpp29
1 files changed, 9 insertions, 20 deletions
diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp
index 3322c68..66fcaf3 100644
--- a/lib/VMCore/Value.cpp
+++ b/lib/VMCore/Value.cpp
@@ -343,23 +343,12 @@ Value *Value::stripPointerCasts() {
return this;
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 (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
if (!GEP->hasAllZeroIndices())
return V;
- V = GEP->getOperand(0);
- } else if (BitCastInst *CI = dyn_cast<BitCastInst>(V)) {
- V = CI->getOperand(0);
+ V = GEP->getPointerOperand();
+ } else if (Operator::getOpcode(V) == Instruction::BitCast) {
+ V = cast<Operator>(V)->getOperand(0);
} else {
return V;
}
@@ -373,12 +362,12 @@ Value *Value::getUnderlyingObject() {
Value *V = this;
unsigned MaxLookup = 6;
do {
- if (Operator *O = dyn_cast<Operator>(V)) {
- if (O->getOpcode() != Instruction::BitCast &&
- (O->getOpcode() != Instruction::GetElementPtr ||
- !cast<GEPOperator>(V)->hasNoPointerOverflow()))
+ if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
+ if (GEP->hasNoPointerOverflow())
return V;
- V = O->getOperand(0);
+ V = GEP->getPointerOperand();
+ } else if (Operator::getOpcode(V) == Instruction::BitCast) {
+ V = cast<Operator>(V)->getOperand(0);
} else {
return V;
}