diff options
author | Chris Lattner <sabre@nondot.org> | 2004-01-11 23:56:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-01-11 23:56:33 +0000 |
commit | 952454dbffed89dacc85b9d6253bc8203a415f14 (patch) | |
tree | 75c971e52cb08793b933712f46b8599130412798 | |
parent | c9f75b5700ad6fe542b8b2231d0523ec1c331daa (diff) |
Implement: Assembler/2004-01-11-getelementptrfolding.llx
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10759 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 04ec28bfb8..c21529a010 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -171,7 +171,7 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, I != E; ++I) LastTy = *I; - if (LastTy && isa<ArrayType>(LastTy)) { + if ((LastTy && isa<ArrayType>(LastTy)) || IdxList[0]->isNullValue()) { std::vector<Constant*> NewIndices; NewIndices.reserve(IdxList.size() + CE->getNumOperands()); for (unsigned i = 1, e = CE->getNumOperands()-1; i != e; ++i) @@ -179,11 +179,13 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, // Add the last index of the source with the first index of the new GEP. // Make sure to handle the case when they are actually different types. - Constant *Combined = - ConstantExpr::get(Instruction::Add, - ConstantExpr::getCast(IdxList[0], Type::LongTy), - ConstantExpr::getCast(CE->getOperand(CE->getNumOperands()-1), Type::LongTy)); - + Constant *Combined = CE->getOperand(CE->getNumOperands()-1); + if (!IdxList[0]->isNullValue()) // Otherwise it must be an array + Combined = + ConstantExpr::get(Instruction::Add, + ConstantExpr::getCast(IdxList[0], Type::LongTy), + ConstantExpr::getCast(Combined, Type::LongTy)); + NewIndices.push_back(Combined); NewIndices.insert(NewIndices.end(), IdxList.begin()+1, IdxList.end()); return ConstantExpr::getGetElementPtr(CE->getOperand(0), NewIndices); |