Referencing a dllimport variable requires actually instructions, not
just a relocation. This partially fixes PR19955.
Details
Diff Detail
Event Timeline
lib/Transforms/IPO/GlobalOpt.cpp | ||
---|---|---|
1987–1988 | IMO getNumOperands() == 0 is the common case (ints), so I'd put that check first. | |
test/Transforms/GlobalOpt/constantfold-initializers.ll | ||
55–62 | Why are these all called dllexport-stuff? It seems like dllimport would be the better naming. Can you add a test to verify that globalopt fires on dllexport data? Based on the comment you fixed, it seems like it didn't used to. | |
56 | IMO a positive CHECK line for "@dllexport = global i32* null" would make a better test. |
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?
Files:
lib/Transforms/IPO/GlobalOpt.cpp test/Transforms/GlobalOpt/constantfold-initializers.llIndex: 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
+
+@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 }]
(Ignore my comments on the previous revision of the patch. Sorry for the confusion there!)
IMO getNumOperands() == 0 is the common case (ints), so I'd put that check first.