Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp +++ lib/Transforms/IPO/GlobalOpt.cpp @@ -475,7 +475,7 @@ if (!GlobalUsersSafeToSRA(GV)) return nullptr; - assert(GV->hasLocalLinkage() && !GV->isConstant()); + assert(GV->hasLocalLinkage()); Constant *Init = GV->getInitializer(); Type *Ty = Init->getType(); @@ -1846,7 +1846,8 @@ } return Changed; - } else if (GS.StoredType <= GlobalStatus::InitializerStored) { + } + if (GS.StoredType <= GlobalStatus::InitializerStored) { DEBUG(dbgs() << "MARKING CONSTANT: " << *GV << "\n"); GV->setConstant(true); @@ -1859,17 +1860,20 @@ << "all users and delete global!\n"); GV->eraseFromParent(); ++NumDeleted; + return true; } + // Fall through to the next check; see if we can optimize further. ++NumMarked; - return true; - } else if (!GV->getInitializer()->getType()->isSingleValueType()) { + } + if (!GV->getInitializer()->getType()->isSingleValueType()) { const DataLayout &DL = GV->getParent()->getDataLayout(); if (GlobalVariable *FirstNewGV = SRAGlobal(GV, DL)) { GVI = FirstNewGV->getIterator(); // Don't skip the newly produced globals! return true; } - } else if (GS.StoredType == GlobalStatus::StoredOnce && GS.StoredOnceValue) { + } + if (GS.StoredType == GlobalStatus::StoredOnce && GS.StoredOnceValue) { // If the initial value for the global was an undef value, and if only // one other value was stored into it, we can just change the // initializer to be the stored value, then delete all stores to the Index: test/Transforms/GlobalOpt/globalsra.ll =================================================================== --- test/Transforms/GlobalOpt/globalsra.ll +++ test/Transforms/GlobalOpt/globalsra.ll @@ -22,3 +22,24 @@ ret double %X } +@G2 = internal constant { i32, float, { double } } { + i32 1, + float 1.000000e+00, + { double } { double 1.727000e+01 } } ; <{ i32, float, { double } }*> [#uses=3] + +define void @onlystore2() { + store i32 123, i32* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 0) + ret void +} + +define float @storeinit2() { + store float 1.000000e+00, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1) + %X = load float, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1) ; [#uses=1] + ret float %X +} + +define double @constantize2() { + %X = load double, double* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 2, i32 0) ; [#uses=1] + ret double %X +} +