mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
673715d427
The order of global variables is generated in the order of recursively materializing variables if the global variable has the attribute of hasLocalLinkage or hasLinkOnceLinkage during the module merging. In practice, it is often the exact reverse of source order. This new order may cause performance regression. The change is to preserve the original lexical order for global variables. Reviewed By: jdoerfert, dexonsmith Differential Revision: https://reviews.llvm.org/D94202
62 lines
2.6 KiB
LLVM
62 lines
2.6 KiB
LLVM
; Check that we promote constant object in the source module and import it
|
|
; even when it is referenced in some other GV initializer and/or is used
|
|
; by store instructions.
|
|
; RUN: opt -thinlto-bc %s -o %t1.bc
|
|
; RUN: opt -thinlto-bc %p/Inputs/import-constant.ll -o %t2.bc
|
|
; RUN: llvm-lto2 run -save-temps %t1.bc %t2.bc -o %t-out \
|
|
; RUN: -import-constants-with-refs \
|
|
; RUN: -r=%t1.bc,main,plx \
|
|
; RUN: -r=%t1.bc,_Z6getObjv,l \
|
|
; RUN: -r=%t2.bc,_Z6getObjv,pl \
|
|
; RUN: -r=%t2.bc,val,pl \
|
|
; RUN: -r=%t2.bc,outer,pl
|
|
; RUN: llvm-dis %t-out.2.1.promote.bc -o - | FileCheck %s --check-prefix=PROMOTE
|
|
; RUN: llvm-dis %t-out.1.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT
|
|
; RUN: llvm-dis %t-out.1.4.opt.bc -o - | FileCheck %s --check-prefix=OPT
|
|
|
|
; Check when importing references is prohibited
|
|
; RUN: llvm-lto2 run -save-temps %t1.bc %t2.bc -o %t-out-norefs \
|
|
; RUN: -import-constants-with-refs=false \
|
|
; RUN: -r=%t1.bc,main,plx \
|
|
; RUN: -r=%t1.bc,_Z6getObjv,l \
|
|
; RUN: -r=%t2.bc,_Z6getObjv,pl \
|
|
; RUN: -r=%t2.bc,val,pl \
|
|
; RUN: -r=%t2.bc,outer,pl
|
|
; RUN: llvm-dis %t-out-norefs.1.3.import.bc -o - | FileCheck %s --check-prefix=NOREFS
|
|
|
|
; Check that variable has been promoted in the source module
|
|
; PROMOTE: @_ZL3Obj.llvm.{{.*}} = hidden constant %struct.S { i32 4, i32 8, i32* @val }
|
|
|
|
; @outer is a write-only variable, so it's been converted to zeroinitializer.
|
|
; IMPORT: @val = available_externally global i32 42
|
|
; IMPORT-NEXT: @_ZL3Obj.llvm.{{.*}} = available_externally hidden constant %struct.S { i32 4, i32 8, i32* @val }
|
|
; IMPORT-NEXT: @outer = internal local_unnamed_addr global %struct.Q zeroinitializer
|
|
|
|
; OPT: @outer = internal unnamed_addr global %struct.Q zeroinitializer
|
|
|
|
; OPT: define dso_local i32 @main()
|
|
; OPT-NEXT: entry:
|
|
; OPT-NEXT: store %struct.S* null, %struct.S** getelementptr inbounds (%struct.Q, %struct.Q* @outer, i64 0, i32 0)
|
|
; OPT-NEXT: ret i32 12
|
|
|
|
; NOREFS: @_ZL3Obj.llvm.{{.*}} = external hidden constant %struct.S
|
|
; NOREFS-NEXT: @outer = internal local_unnamed_addr global %struct.Q zeroinitializer
|
|
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
%struct.S = type { i32, i32, i32* }
|
|
|
|
define dso_local i32 @main() local_unnamed_addr {
|
|
entry:
|
|
%call = tail call %struct.S* @_Z6getObjv()
|
|
%d = getelementptr inbounds %struct.S, %struct.S* %call, i64 0, i32 0
|
|
%0 = load i32, i32* %d, align 8
|
|
%v = getelementptr inbounds %struct.S, %struct.S* %call, i64 0, i32 1
|
|
%1 = load i32, i32* %v, align 4
|
|
%add = add nsw i32 %1, %0
|
|
ret i32 %add
|
|
}
|
|
|
|
declare dso_local %struct.S* @_Z6getObjv() local_unnamed_addr
|