2019-07-05 23:25:05 +08:00
|
|
|
; Checks that we optimize writeonly variables and corresponding stores using llvm-lto
|
|
|
|
; -stats requires asserts
|
|
|
|
; REQUIRES: asserts
|
|
|
|
|
|
|
|
; RUN: opt -module-summary %s -o %t1.bc
|
|
|
|
; RUN: opt -module-summary %p/Inputs/index-const-prop.ll -o %t2.bc
|
|
|
|
; RUN: llvm-lto -thinlto-action=thinlink -o %t3.index.bc %t1.bc %t2.bc
|
|
|
|
|
|
|
|
; Check that we optimize write-only variables
|
|
|
|
; RUN: llvm-lto -thinlto-action=import -exported-symbol=main %t1.bc -thinlto-index=%t3.index.bc -o %t1.imported.bc -stats 2>&1 | FileCheck %s --check-prefix=STATS
|
|
|
|
; RUN: llvm-dis %t1.imported.bc -o - | FileCheck %s --check-prefix=IMPORT
|
|
|
|
; RUN: llvm-lto -thinlto-action=optimize %t1.imported.bc -o - | llvm-dis - -o - | FileCheck %s --check-prefix=OPTIMIZE
|
|
|
|
|
[ThinLTO] Fix importing of writeonly variables in distributed ThinLTO
Summary:
D69561/dde5893 enabled importing of readonly variables with references,
however, it introduced a bug relating to importing/internalization of
writeonly variables with references.
A fix for this was added in D70006/7f92d66. But this didn't work in
distributed ThinLTO mode. The reason is that the fix (importing the
writeonly var with a zeroinitializer) was only applied when there were
references on the writeonly var summary. In distributed ThinLTO mode,
where we only have a small slice of the index, we will not have the
references on the importing side if we are not importing those
referenced values. Rather than changing this handshaking (which will
require a lot of other changes, since that's how we know what to import
in the distributed backend clang invocation), we can simply always give
the writeonly variable a zero initializer.
Reviewers: evgeny777, steven_wu
Subscribers: mehdi_amini, inglorion, hiraditya, dexonsmith, arphaman, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D70977
2019-12-04 04:22:51 +08:00
|
|
|
; IMPORT: @gFoo.llvm.0 = internal unnamed_addr global i32 0, align 4, !dbg !0
|
|
|
|
; IMPORT-NEXT: @gBar = internal local_unnamed_addr global i32 0, align 4, !dbg !5
|
2019-07-05 23:25:05 +08:00
|
|
|
; IMPORT: !DICompileUnit({{.*}})
|
|
|
|
|
|
|
|
; STATS: 2 module-summary-index - Number of live global variables marked write only
|
|
|
|
|
|
|
|
; Check that we've optimized out variables and corresponding stores
|
|
|
|
; OPTIMIZE-NOT: gFoo
|
|
|
|
; OPTIMIZE-NOT: gBar
|
|
|
|
; OPTIMIZE: i32 @main
|
|
|
|
; OPTIMIZE-NEXT: %1 = tail call i32 @rand()
|
|
|
|
; OPTIMIZE-NEXT: %2 = tail call i32 @rand()
|
|
|
|
; OPTIMIZE-NEXT: ret i32 0
|
|
|
|
|
2019-12-04 05:56:07 +08:00
|
|
|
; Confirm that with -propagate-attrs=false we no longer do write-only importing
|
|
|
|
; RUN: llvm-lto -propagate-attrs=false -thinlto-action=import -exported-symbol=main %t1.bc -thinlto-index=%t3.index.bc -o %t1.imported.bc -stats 2>&1 | FileCheck %s --check-prefix=STATS-NOPROP
|
|
|
|
; RUN: llvm-dis %t1.imported.bc -o - | FileCheck %s --check-prefix=IMPORT-NOPROP
|
|
|
|
; STATS-NOPROP-NOT: Number of live global variables marked write only
|
|
|
|
; IMPORT-NOPROP: @gFoo.llvm.0 = available_externally
|
|
|
|
; IMPORT-NOPROP-NEXT: @gBar = available_externally
|
|
|
|
|
2019-09-11 07:15:38 +08:00
|
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
2019-07-05 23:25:05 +08:00
|
|
|
target triple = "x86_64-pc-linux-gnu"
|
|
|
|
|
|
|
|
@gBar = external global i32
|
|
|
|
|
|
|
|
; Should not be counted in the stats of live write only variables since it is
|
|
|
|
; dead and will be dropped anyway.
|
|
|
|
@gDead = internal unnamed_addr global i32 1, align 4
|
|
|
|
|
|
|
|
define i32 @main() local_unnamed_addr {
|
|
|
|
tail call void @baz()
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
declare void @baz() local_unnamed_addr
|