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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56922 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands
2008-10-01 15:25:41 +00:00
parent 38ac062c2f
commit 5d0392c6b3
7 changed files with 57 additions and 136 deletions

View File

@@ -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
//===----------------------------------------------------------------------===//