[PATCH] GlobalOpt: Don't optimize dllimport for initializers

Nick Lewycky nicholas at mxc.ca
Mon Jun 23 23:37:12 PDT 2014


David Majnemer wrote:
> Hi rnk, nicholas,
>
> Referencing a dllimport variable requires actually instructions, not
> just a relocation.  This partially fixes PR19955.

I am confused. Your description suggests that we needs to stop 
optimizing the dllimport case. Your patch adds to the set of cases where 
we perform the optimization. You also removed dllexport from the comment 
listing cases we can't optimize. What is going on?

>
> http://reviews.llvm.org/D4249
>
> Files:
>    lib/Transforms/IPO/GlobalOpt.cpp
>    test/Transforms/GlobalOpt/constantfold-initializers.ll
>
> 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<GlobalVariable>(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<ConstantExpr>(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
> +
> + at dllexportptr = global i32* null, align 4
> +; CHECK-NOT: @dllexportptr = global i32* @dllexportvar, align 4
> + at 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 }]

http://reviews.llvm.org/D4249






More information about the llvm-commits mailing list