From: Chris Lattner Date: Mon, 11 Oct 2004 03:57:30 +0000 (+0000) Subject: If we are trying to create a ConstantExpr cast that is really a GEP to the X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f8d1097e9d69c65642d008926065317db583961a;p=oota-llvm.git 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) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16911 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 2a96291fe49..703a324126a 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -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(V->getType())) + if (const ArrayType *ATy = dyn_cast(PTy->getElementType())) + if (const PointerType *DPTy = dyn_cast(DestTy)) + if (DPTy->getElementType() == ATy->getElementType()) { + std::vector IdxList(2,Constant::getNullValue(Type::IntTy)); + return ConstantExpr::getGetElementPtr(const_cast(V), + IdxList); + } + ConstRules &Rules = ConstRules::get(V, V); switch (DestTy->getTypeID()) {