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); 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 = +@var1 = global i32 0, align 4 +; CHECK: @var2 = +@var2 = global i32 0, align 4 +; CHECK: @var3 = +@var3 = global i32* @var1, align 4 +; CHECK: @var4 = +@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 +}