Skip to content

Commit efda61b

Browse files
anchurajLukacma
authored andcommitted
[Flang][Driver] Emit module summary for Full LTO (llvm#164302)
This PR enables module summary for Full LTO. Module summaries are enabled by default for Full LTO in clang, this change makes the flang behaviour consistent. Reference PR: https://reviews.llvm.org/D34156
1 parent e4b73c3 commit efda61b

File tree

3 files changed

+52
-21
lines changed

3 files changed

+52
-21
lines changed

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,24 +1019,40 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
10191019

10201020
// Create the pass manager.
10211021
llvm::ModulePassManager mpm;
1022-
if (opts.PrepareForFatLTO) {
1023-
// The module summary should be emitted by default for regular LTO
1024-
// except for ld64 targets.
1025-
bool emitSummary = opts.PrepareForThinLTO || opts.PrepareForFullLTO ||
1026-
triple.getVendor() != llvm::Triple::Apple;
1022+
// The module summary should be emitted by default for regular LTO
1023+
// except for ld64 targets.
1024+
bool emitSummary =
1025+
opts.PrepareForFullLTO && (triple.getVendor() != llvm::Triple::Apple);
1026+
if (opts.PrepareForFatLTO)
10271027
mpm = pb.buildFatLTODefaultPipeline(level, opts.PrepareForThinLTO,
10281028
emitSummary);
1029-
} else if (opts.PrepareForFullLTO)
1029+
else if (opts.PrepareForFullLTO)
10301030
mpm = pb.buildLTOPreLinkDefaultPipeline(level);
10311031
else if (opts.PrepareForThinLTO)
10321032
mpm = pb.buildThinLTOPreLinkDefaultPipeline(level);
10331033
else
10341034
mpm = pb.buildPerModuleDefaultPipeline(level);
10351035

1036-
if (action == BackendActionTy::Backend_EmitBC)
1037-
mpm.addPass(llvm::BitcodeWriterPass(os));
1038-
else if (action == BackendActionTy::Backend_EmitLL)
1039-
mpm.addPass(llvm::PrintModulePass(os));
1036+
if (action == BackendActionTy::Backend_EmitBC ||
1037+
action == BackendActionTy::Backend_EmitLL || opts.PrepareForFatLTO) {
1038+
if (opts.PrepareForThinLTO) {
1039+
// TODO: ThinLTO module summary support is yet to be enabled.
1040+
if (action == BackendActionTy::Backend_EmitBC)
1041+
mpm.addPass(llvm::BitcodeWriterPass(os));
1042+
else if (action == BackendActionTy::Backend_EmitLL)
1043+
mpm.addPass(llvm::PrintModulePass(os));
1044+
} else {
1045+
if (emitSummary && !llvmModule->getModuleFlag("ThinLTO"))
1046+
llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0));
1047+
if (action == BackendActionTy::Backend_EmitBC)
1048+
mpm.addPass(llvm::BitcodeWriterPass(
1049+
os, /*ShouldPreserveUseListOrder=*/false, emitSummary));
1050+
else if (action == BackendActionTy::Backend_EmitLL)
1051+
mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"",
1052+
/*ShouldPreserveUseListOrder=*/false,
1053+
emitSummary));
1054+
}
1055+
}
10401056

10411057
// FIXME: This should eventually be replaced by a first-class driver option.
10421058
// This should be done for both flang and clang simultaneously.

flang/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ if (NOT FLANG_STANDALONE_BUILD)
7272
FileCheck
7373
count
7474
not
75+
llvm-bcanalyzer
7576
llvm-dis
7677
llvm-objcopy
7778
llvm-objdump

flang/test/Driver/lto-bc.f90

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,35 @@
11
! Test that the output is LLVM bitcode for LTO and not a native objectfile by
2-
! disassembling it to LLVM IR.
3-
! Right now there is nothing special about it and it is similar to non-lto IR,
4-
! more work is needed to add things like module summaries.
2+
! disassembling it to LLVM IR. Also tests that module summaries are emitted for LTO
53

64
! RUN: %flang %s -c -o - | not llvm-dis -o %t
75
! RUN: %flang_fc1 %s -emit-llvm-bc -o - | llvm-dis -o - | FileCheck %s
8-
9-
! RUN: %flang -flto %s -c -o - | llvm-dis -o - | FileCheck %s
10-
! RUN: %flang -flto=thin %s -c -o - | llvm-dis -o - | FileCheck %s
11-
126
! CHECK: define void @_QQmain()
137
! CHECK-NEXT: ret void
148
! CHECK-NEXT: }
9+
! CHECK-NOT: !{{.*}} = !{i32 1, !"ThinLTO", i32 0}
10+
! CHECK-NOT: ^{{.*}} = module:
11+
! CHECK-NOT: ^{{.*}} = gv: (name:
12+
! CHECK-NOT: ^{{.*}} = blockcount:
13+
14+
! RUN: %flang -flto=thin %s -c -o - | llvm-dis -o - | FileCheck %s --check-prefix=THIN
15+
! THIN: define void @_QQmain()
16+
! THIN-NEXT: ret void
17+
! THIN-NEXT: }
18+
! THIN-NOT: !{{.*}} = !{i32 1, !"ThinLTO", i32 0}
19+
! THIN-NOT: ^{{.*}} = module:
20+
! THIN-NOT: ^{{.*}} = gv: (name:
21+
! THIN-NOT: ^{{.*}} = blockcount:
1522

16-
! CHECK-NOT: ^0 = module:
17-
! CHECK-NOT: ^1 = gv: (name:
18-
! CHECK-NOT: ^2 = flags:
19-
! CHECK-NOT: ^3 = blockcount:
23+
! RUN: %flang -flto %s -c -o - | llvm-dis -o - | FileCheck %s --check-prefix=FULL
24+
! FULL: define void @_QQmain()
25+
! FULL-NEXT: ret void
26+
! FULL-NEXT: }
27+
! FULL: !{{.*}} = !{i32 1, !"ThinLTO", i32 0}
28+
! FULL: ^{{.*}} = module:
29+
! FULL: ^{{.*}} = gv: (name:
30+
! FULL: ^{{.*}} = blockcount:
2031

32+
! RUN: %flang_fc1 -flto -emit-llvm-bc %s -o - | llvm-bcanalyzer -dump| FileCheck --check-prefix=MOD-SUMM %s
33+
! MOD-SUMM: FULL_LTO_GLOBALVAL_SUMMARY_BLOCK
34+
program main
2135
end program

0 commit comments

Comments
 (0)