[PATCH] D31443: [LTO] Do not reorder global variables unnecessarily during merging
Tobias Edler von Koch via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 28 16:14:31 PDT 2017
tobiasvk updated this revision to Diff 93317.
tobiasvk added a comment.
Make Gerolf's suggested changes to comments.
https://reviews.llvm.org/D31443
Files:
lib/Object/ModuleSymbolTable.cpp
test/LTO/Resolution/X86/globalorder.ll
Index: test/LTO/Resolution/X86/globalorder.ll
===================================================================
--- /dev/null
+++ test/LTO/Resolution/X86/globalorder.ll
@@ -0,0 +1,28 @@
+; Check that LTO keeps global variables in source code order
+;
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-lto2 %t.bc -O0 -save-temps -o %t.o -r %t.bc,var1,px -r %t.bc,var2,px -r %t.bc,var3,px -r %t.bc,var4,px -r %t.bc,foo,px
+; RUN: llvm-dis -o - %t.o.0.0.preopt.bc | FileCheck %s
+;
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK: @var1 =
+ at var1 = global i32 0, align 4
+; CHECK: @var2 =
+ at var2 = global i32 0, align 4
+; CHECK: @var3 =
+ at var3 = global i32* @var1, align 4
+; CHECK: @var4 =
+ at var4 = global i32* @var2, align 4
+
+define i32 @foo() {
+entry:
+ %0 = load i32*, i32** @var3, align 4
+ %1 = load i32, i32* %0, align 4
+ %2 = load i32*, i32** @var4, align 4
+ %3 = load i32, i32* %2, align 4
+ %add = add nsw i32 %3, %1
+ ret i32 %add
+}
Index: lib/Object/ModuleSymbolTable.cpp
===================================================================
--- lib/Object/ModuleSymbolTable.cpp
+++ lib/Object/ModuleSymbolTable.cpp
@@ -43,10 +43,14 @@
else
FirstMod = M;
- for (Function &F : *M)
- SymTab.push_back(&F);
+ // The iteration order here is significant as it relates to the order in which
+ // globals are materialized during module merging in regular LTO. Variables
+ // need to be added first so their original ordering is not changed
+ // unnecessarily.
for (GlobalVariable &GV : M->globals())
SymTab.push_back(&GV);
+ for (Function &F : *M)
+ SymTab.push_back(&F);
for (GlobalAlias &GA : M->aliases())
SymTab.push_back(&GA);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31443.93317.patch
Type: text/x-patch
Size: 1748 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170328/2474becd/attachment.bin>
More information about the llvm-commits
mailing list