From 0ec3590664dda705ac9039de403460cca5b947c1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 13 May 2003 21:50:52 +0000 Subject: [PATCH] Implement another getelementptr folding opportunity that arises when linking stuff with appending linkage git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6180 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/ConstantFold.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 8da98f19979..ee5611ea7de 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -150,6 +150,22 @@ Constant *ConstantFoldGetElementPtr(const Constant *C, // If C is null and all idx's are null, return null of the right type. // FIXME: Implement folding of GEP constant exprs the same as instcombine does + + // Implement folding of: + // int* getelementptr ([2 x int]* cast ([3 x int]* %X to [2 x int]*), + // long 0, long 0) + // To: int* getelementptr ([3 x int]* %X, long 0, long 0) + // + if (const ConstantExpr *CE = dyn_cast(C)) + if (CE->getOpcode() == Instruction::Cast && IdxList.size() > 1) + if (const PointerType *SPT = + dyn_cast(CE->getOperand(0)->getType())) + if (const ArrayType *SAT = dyn_cast(SPT->getElementType())) + if (const ArrayType *CAT = + dyn_cast(cast(C->getType())->getElementType())) + if (CAT->getElementType() == SAT->getElementType()) + return ConstantExpr::getGetElementPtr( + (Constant*)cast(CE->getOperand(0)), IdxList); return 0; }