Tighten up a check for folding away loads from (newly constant) globals.  This
fixes a crash on Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll and 
rdar://5585488.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43949 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index 779b4a1..76f04ef 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -342,12 +342,17 @@
         Changed = true;
       }
     } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
-      Constant *SubInit = 0;
-      ConstantExpr *CE = 
-        dyn_cast_or_null<ConstantExpr>(ConstantFoldInstruction(GEP));
-      if (Init && CE && CE->getOpcode() == Instruction::GetElementPtr)
-        SubInit = ConstantFoldLoadThroughGEPConstantExpr(Init, CE);
-      Changed |= CleanupConstantGlobalUsers(GEP, SubInit);
+      // Do not transform "gepinst (gep constexpr (GV))" here, because forming
+      // "gepconstexpr (gep constexpr (GV))" will cause the two gep's to fold
+      // and will invalidate our notion of what Init is.
+      if (!isa<ConstantExpr>(GEP->getOperand(0))) {
+        ConstantExpr *CE = 
+          dyn_cast_or_null<ConstantExpr>(ConstantFoldInstruction(GEP));
+        if (Init && CE && CE->getOpcode() == Instruction::GetElementPtr)
+          if (Constant *SubInit = 
+              ConstantFoldLoadThroughGEPConstantExpr(Init, CE))
+            Changed |= CleanupConstantGlobalUsers(GEP, SubInit);
+      }
 
       if (GEP->use_empty()) {
         GEP->eraseFromParent();