Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp +++ lib/Transforms/IPO/GlobalOpt.cpp @@ -2054,9 +2054,8 @@ return false; if (GlobalVariable *GV = dyn_cast(C)) - // Do not allow weak/*_odr/linkonce/dllimport/dllexport linkage or - // external globals. - return GV->hasUniqueInitializer(); + // Do not allow weak/*_odr/linkonce linkage, dllimport, or external globals. + return GV->hasUniqueInitializer() || GV->hasDLLImportStorageClass(); if (ConstantExpr *CE = dyn_cast(C)) { // Handle a constantexpr gep. Index: test/Transforms/GlobalOpt/constantfold-initializers.ll =================================================================== --- test/Transforms/GlobalOpt/constantfold-initializers.ll +++ test/Transforms/GlobalOpt/constantfold-initializers.ll @@ -50,7 +50,19 @@ ret void } +; PR19955 + +@dllexportptr = global i32* null, align 4 +; CHECK-NOT: @dllexportptr = global i32* @dllexportvar, align 4 +@dllexportvar = external dllimport global i32 +define internal void @test3() { +entry: + store i32* @dllexportvar, i32** @dllexportptr, align 4 + ret void +} + @llvm.global_ctors = appending constant - [2 x { i32, void ()* }] + [3 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @test1 }, - { i32, void ()* } { i32 65535, void ()* @test2 }] + { i32, void ()* } { i32 65535, void ()* @test2 }, + { i32, void ()* } { i32 65535, void ()* @test3 }]