Implement: Assembler/2004-01-11-getelementptrfolding.llx
authorChris Lattner <sabre@nondot.org>
Sun, 11 Jan 2004 23:56:33 +0000 (23:56 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Jan 2004 23:56:33 +0000 (23:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10759 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp

index 04ec28bfb83a9bad84fb13c68dde8ddd49cd03d0..c21529a010e5a13010c5a41c5e89238859bb0bee 100644 (file)
@@ -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);