aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-20 16:11:27 +0000
committerChris Lattner <sabre@nondot.org>2003-08-20 16:11:27 +0000
commit4b517a4654921ac8e2225237f82d5fe8b3ba49b1 (patch)
tree23aa48b41adf192f5f56456beddf4afad9ece83e
parentbaefa33c2663a64e4d9b70194c04c3613b08cb9f (diff)
downloadexternal_llvm-4b517a4654921ac8e2225237f82d5fe8b3ba49b1.zip
external_llvm-4b517a4654921ac8e2225237f82d5fe8b3ba49b1.tar.gz
external_llvm-4b517a4654921ac8e2225237f82d5fe8b3ba49b1.tar.bz2
Implement testcase: Assembler/2003-08-20-ConstantExprGEP-Fold.llx
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7983 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/ConstantFold.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp
index e8dd243..85a89de 100644
--- a/lib/VMCore/ConstantFold.cpp
+++ b/lib/VMCore/ConstantFold.cpp
@@ -142,23 +142,27 @@ Constant *ConstantFoldGetElementPtr(const Constant *C,
// FIXME: Implement folding of GEP constant exprs the same as instcombine does
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
- // Implement folding of:
- // void ()** getelementptr (%struct..TorRec* getelementptr
- // ([N x %struct..TorRec]* %llvm.global_dtors, long 0, long 0),
- // long 0, ubyte 1)
- // Into:
- // %struct..TorRec* getelementptr ([N x %struct..TorRec]*
- // %llvm.global_dtors, long 0, long 0, ubyte 1)
+ // Combine Indices - If the source pointer to this getelementptr instruction
+ // is a getelementptr instruction, combine the indices of the two
+ // getelementptr instructions into a single instruction.
//
- if (CE->getOpcode() == Instruction::GetElementPtr)
- if (IdxList[0] == Constant::getNullValue(Type::LongTy)) {
+ if (CE->getOpcode() == Instruction::GetElementPtr) {
+ if (CE->getOperand(CE->getNumOperands()-1)->getType() == Type::LongTy) {
std::vector<Constant*> NewIndices;
NewIndices.reserve(IdxList.size() + CE->getNumOperands());
- for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i)
+ for (unsigned i = 1, e = CE->getNumOperands()-1; i != e; ++i)
NewIndices.push_back(cast<Constant>(CE->getOperand(i)));
+
+ // Add the last index of the source with the first index of the new GEP.
+ Constant *Combined =
+ ConstantExpr::get(Instruction::Add, IdxList[0],
+ CE->getOperand(CE->getNumOperands()-1));
+
+ NewIndices.push_back(Combined);
NewIndices.insert(NewIndices.end(), IdxList.begin()+1, IdxList.end());
return ConstantExpr::getGetElementPtr(CE->getOperand(0), NewIndices);
}
+ }
// Implement folding of:
// int* getelementptr ([2 x int]* cast ([3 x int]* %X to [2 x int]*),