forked from OSchip/llvm-project
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 llvm-svn: 211571
This commit is contained in:
parent
11a54c3465
commit
23fc9afa4d
|
@ -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)) {
|
||||
|
|
|
@ -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 }]
|
||||
|
|
Loading…
Reference in New Issue