diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-20 16:11:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-20 16:11:27 +0000 |
commit | 4b517a4654921ac8e2225237f82d5fe8b3ba49b1 (patch) | |
tree | 23aa48b41adf192f5f56456beddf4afad9ece83e /lib | |
parent | baefa33c2663a64e4d9b70194c04c3613b08cb9f (diff) | |
download | external_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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 24 |
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]*), |