Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp +++ lib/Transforms/IPO/GlobalOpt.cpp @@ -1883,8 +1883,9 @@ GV->getType()->getAddressSpace() == 0 && !GV->isExternallyInitialized() && allNonInstructionUsersCanBeMadeInstructions(GV) && - GS.AccessingFunction->doesNotRecurse() && - isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV) ) { + ((GS.AccessingFunction->doesNotRecurse() && + isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV)) || + (GS.AccessingFunction->getName() == "main"))) { DEBUG(dbgs() << "LOCALIZING GLOBAL: " << *GV << "\n"); Instruction &FirstI = const_cast(*GS.AccessingFunction ->getEntryBlock().begin()); Index: test/Transforms/GlobalOpt/load-store-global.ll =================================================================== --- test/Transforms/GlobalOpt/load-store-global.ll +++ test/Transforms/GlobalOpt/load-store-global.ll @@ -36,3 +36,16 @@ ; CHECK-NOT: load } +; A global used only in "main" can always be localized. +@b = internal global i64 13, align 8 +; CHECK-NOT: @b + +define i64 @main(i32 %argc, i8** %argv) norecurse { +; CHECK: %b = alloca +; CHECK store i64 13 + %a = load i64, i64* @b +; CHECK %a = load i64 + store i64 27, i64* @b +; CHECK store i64 27 + ret i64 %a +}