From: Duncan Sands Date: Mon, 29 Dec 2008 21:06:19 +0000 (+0000) Subject: Make stripPointerCasts and getUnderlyingObject X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f08bf1193c390bfe4b25d8533f146742d0277d06;p=oota-llvm.git Make stripPointerCasts and getUnderlyingObject non-recursive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61479 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 8e2dad32417..ab7e0443c07 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(getType())) return this; - - if (ConstantExpr *CE = dyn_cast(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(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(V)) { + if (!GEP->hasAllZeroIndices()) + return V; + V = GEP->getOperand(0); + } else if (BitCastInst *CI = dyn_cast(V)) { + V = CI->getOperand(0); + } else { + return V; } - } else if (BitCastInst *CI = dyn_cast(this)) { - return CI->getOperand(0)->stripPointerCasts(); - } else if (GetElementPtrInst *GEP = dyn_cast(this)) { - if (GEP->hasAllZeroIndices()) - return GEP->getOperand(0)->stripPointerCasts(); - } - return this; + assert(isa(V->getType()) && "Unexpected operand type!"); + } while (1); } Value *Value::getUnderlyingObject() { if (!isa(getType())) return this; - - if (Instruction *I = dyn_cast(this)) { - if (isa(I) || isa(I)) - return I->getOperand(0)->getUnderlyingObject(); - } else if (ConstantExpr *CE = dyn_cast(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(V)) { + if (!isa(I) && !isa(I)) + return V; + V = I->getOperand(0); + } else if (ConstantExpr *CE = dyn_cast(V)) { + if (CE->getOpcode() != Instruction::BitCast && + CE->getOpcode() != Instruction::GetElementPtr) + return V; + V = CE->getOperand(0); + } else { + return V; + } + assert(isa(V->getType()) && "Unexpected operand type!"); + } while (1); } /// DoPHITranslation - If this value is a PHI node with CurBB as its parent,