If we are trying to create a ConstantExpr cast that is really a GEP to the

first element of an array, return a GEP instead of a cast.  This allows us
to transparently fold this:

int* getelementptr (int* cast ([100 x int]* %Gbody to int*), int 40)

into this:

int* getelementptr ([100 x int]* %Gbody, int 0, int 40)

llvm-svn: 16911
This commit is contained in:
Chris Lattner 2004-10-11 03:57:30 +00:00
parent 8c8cbb8b71
commit b2b7f90caf
1 changed files with 11 additions and 0 deletions

View File

@ -562,6 +562,17 @@ Constant *llvm::ConstantFoldCastInstruction(const Constant *V,
return ConstantExpr::getCast(CE->getOperand(0), DestTy);
}
// Check to see if we are casting an array of X to a pointer to X. If so, use
// a GEP to get to the first element of the array instead of a cast!
if (const PointerType *PTy = dyn_cast<PointerType>(V->getType()))
if (const ArrayType *ATy = dyn_cast<ArrayType>(PTy->getElementType()))
if (const PointerType *DPTy = dyn_cast<PointerType>(DestTy))
if (DPTy->getElementType() == ATy->getElementType()) {
std::vector<Constant*> IdxList(2,Constant::getNullValue(Type::IntTy));
return ConstantExpr::getGetElementPtr(const_cast<Constant*>(V),
IdxList);
}
ConstRules &Rules = ConstRules::get(V, V);
switch (DestTy->getTypeID()) {