GlobalOpt: Don't optimize dllimport for initializers

Referencing a dllimport variable requires actually instructions, not
just a relocation.  This fixes PR19955.

Differential Revision: http://reviews.llvm.org/D4249

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211571 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2014-06-24 06:53:45 +00:00
parent 877ef747d8
commit f396732d9b
2 changed files with 33 additions and 8 deletions

View File

@ -1980,10 +1980,12 @@ isSimpleEnoughValueToCommit(Constant *C,
static bool isSimpleEnoughValueToCommitHelper(Constant *C,
SmallPtrSet<Constant*, 8> &SimpleConstants,
const DataLayout *DL) {
// Simple integer, undef, constant aggregate zero, global addresses, etc are
// all supported.
if (C->getNumOperands() == 0 || isa<BlockAddress>(C) ||
isa<GlobalValue>(C))
// Simple global addresses are supported, do not allow dllimport globals.
if (auto *GV = dyn_cast<GlobalValue>(C))
return !GV->hasDLLImportStorageClass();
// Simple integer, undef, constant aggregate zero, etc are all supported.
if (C->getNumOperands() == 0 || isa<BlockAddress>(C))
return true;
// Aggregate values are safe if all their elements are.
@ -2054,8 +2056,7 @@ static bool isSimpleEnoughPointerToCommit(Constant *C) {
return false;
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
// Do not allow weak/*_odr/linkonce/dllimport/dllexport linkage or
// external globals.
// Do not allow weak/*_odr/linkonce linkage or external globals.
return GV->hasUniqueInitializer();
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {

View File

@ -50,7 +50,31 @@ entry:
ret void
}
; PR19955
@dllimportptr = global i32* null, align 4
; CHECK: @dllimportptr = global i32* null, align 4
@dllimportvar = external dllimport global i32
define internal void @test3() {
entry:
store i32* @dllimportvar, i32** @dllimportptr, align 4
ret void
}
@dllexportptr = global i32* null, align 4
; CHECK: @dllexportptr = global i32* @dllexportvar, align 4
@dllexportvar = dllexport global i32 0, align 4
; CHECK: @dllexportvar = dllexport global i32 20, align 4
define internal void @test4() {
entry:
store i32 20, i32* @dllexportvar, align 4
store i32* @dllexportvar, i32** @dllexportptr, align 4
ret void
}
@llvm.global_ctors = appending constant
[2 x { i32, void ()* }]
[4 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 },
{ i32, void ()* } { i32 65535, void ()* @test4 }]