https://github.com/kkwli updated https://github.com/llvm/llvm-project/pull/195999
>From 4b4131458b5463817062fbd6a7f778f8ceae81c7 Mon Sep 17 00:00:00 2001 From: Kelvin Li <[email protected]> Date: Mon, 6 Apr 2026 17:39:47 -0400 Subject: [PATCH 1/3] [flang] Emit module summary for ThinLTO --- clang/lib/Driver/ToolChains/Flang.cpp | 3 --- flang/lib/Frontend/FrontendActions.cpp | 26 ++++++++++---------------- flang/test/Driver/lto-bc.f90 | 9 ++++++--- flang/test/Driver/lto-fatlto.f90 | 9 +++++++-- flang/test/Driver/lto-flags.f90 | 1 - 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index ce503b74295e4..965136963b206 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -276,9 +276,6 @@ void Flang::addLTOOptions(const ArgList &Args, ArgStringList &CmdArgs) const { if (LTOMode == LTOK_Full) CmdArgs.push_back("-flto=full"); else if (LTOMode == LTOK_Thin) { - Diags.Report( - Diags.getCustomDiagID(DiagnosticsEngine::Warning, - "the option '-flto=thin' is a work in progress")); CmdArgs.push_back("-flto=thin"); } Args.addAllArgs(CmdArgs, {options::OPT_ffat_lto_objects, diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 4e058786a9a72..4f56d65062e98 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -1046,8 +1046,8 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { llvm::ModulePassManager mpm; // The module summary should be emitted by default for regular LTO // except for ld64 targets. - bool emitSummary = - opts.PrepareForFullLTO && (triple.getVendor() != llvm::Triple::Apple); + bool emitSummary = (opts.PrepareForFullLTO || opts.PrepareForThinLTO) && + (triple.getVendor() != llvm::Triple::Apple); if (opts.PrepareForFatLTO) mpm = pb.buildFatLTODefaultPipeline(level, opts.PrepareForThinLTO, emitSummary); @@ -1060,23 +1060,17 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { if (action == BackendActionTy::Backend_EmitBC || action == BackendActionTy::Backend_EmitLL || opts.PrepareForFatLTO) { - if (opts.PrepareForThinLTO) { - // TODO: ThinLTO module summary support is yet to be enabled. - if (action == BackendActionTy::Backend_EmitBC) - mpm.addPass(llvm::BitcodeWriterPass(os)); - else if (action == BackendActionTy::Backend_EmitLL) - mpm.addPass(llvm::PrintModulePass(os)); - } else { + if (!opts.PrepareForThinLTO) if (emitSummary && !llvmModule->getModuleFlag("ThinLTO")) llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0)); - if (action == BackendActionTy::Backend_EmitBC) - mpm.addPass(llvm::BitcodeWriterPass( - os, /*ShouldPreserveUseListOrder=*/false, emitSummary)); - else if (action == BackendActionTy::Backend_EmitLL) - mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"", - /*ShouldPreserveUseListOrder=*/false, + + if (action == BackendActionTy::Backend_EmitBC) + mpm.addPass(llvm::BitcodeWriterPass(os, /*ShouldPreserveUseListOrder=*/false, emitSummary)); - } + else if (action == BackendActionTy::Backend_EmitLL) + mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"", + /*ShouldPreserveUseListOrder=*/false, + emitSummary)); } // FIXME: This should eventually be replaced by a first-class driver option. diff --git a/flang/test/Driver/lto-bc.f90 b/flang/test/Driver/lto-bc.f90 index cca7f8cce739b..6fa1df6175ed3 100644 --- a/flang/test/Driver/lto-bc.f90 +++ b/flang/test/Driver/lto-bc.f90 @@ -18,9 +18,9 @@ ! THIN-NEXT: ret void ! THIN-NEXT: } ! THIN-NOT: !{{.*}} = !{i32 1, !"ThinLTO", i32 0} -! THIN-NOT: ^{{.*}} = module: -! THIN-NOT: ^{{.*}} = gv: (name: -! THIN-NOT: ^{{.*}} = blockcount: +! THIN: ^{{.*}} = module: +! THIN: ^{{.*}} = gv: (name: +! THIN: ^{{.*}} = blockcount: ! RUN: %flang -flto %s -c -o - | llvm-dis -o - | FileCheck %s --check-prefix=FULL ! FULL: define void @_QQmain() @@ -33,5 +33,8 @@ ! RUN: %flang_fc1 -flto -emit-llvm-bc %s -o - | llvm-bcanalyzer -dump| FileCheck --check-prefix=MOD-SUMM %s ! MOD-SUMM: FULL_LTO_GLOBALVAL_SUMMARY_BLOCK + +! RUN: %flang_fc1 -flto=thin -emit-llvm-bc %s -o - | llvm-bcanalyzer -dump| FileCheck --check-prefix=THIN-MOD-SUMM %s +! THIN-MOD-SUMM: <GLOBALVAL_SUMMARY_BLOCK program main end program diff --git a/flang/test/Driver/lto-fatlto.f90 b/flang/test/Driver/lto-fatlto.f90 index 2ea251eafacbf..47dc6700fa595 100644 --- a/flang/test/Driver/lto-fatlto.f90 +++ b/flang/test/Driver/lto-fatlto.f90 @@ -1,7 +1,12 @@ ! REQUIRES: x86-registered-target ! checks fatlto objects: that valid bitcode is included in the object file generated. -! RUN: %flang -fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -emit-obj %s -o %t.o +! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -emit-obj %s -o %t.o +! RUN: llvm-readelf -S %t.o | FileCheck %s --check-prefixes=ELF +! RUN: llvm-objcopy --dump-section=.llvm.lto=%t.bc %t.o +! RUN: llvm-dis %t.bc -o - | FileCheck %s --check-prefixes=DIS + +! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -flto=thin -ffat-lto-objects -emit-obj %s -o %t.o ! RUN: llvm-readelf -S %t.o | FileCheck %s --check-prefixes=ELF ! RUN: llvm-objcopy --dump-section=.llvm.lto=%t.bc %t.o ! RUN: llvm-dis %t.bc -o - | FileCheck %s --check-prefixes=DIS @@ -11,7 +16,7 @@ ! DIS-NEXT: ret void ! DIS-NEXT: } -! RUN: %flang -fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -S %s -o - | FileCheck %s --check-prefixes=ASM +! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -S %s -o - | FileCheck %s --check-prefixes=ASM ! ASM: .section .llvm.lto,"e",@llvm_lto ! ASM-NEXT: .Lllvm.embedded.object: diff --git a/flang/test/Driver/lto-flags.f90 b/flang/test/Driver/lto-flags.f90 index be9416810716a..7699cfa4e2967 100644 --- a/flang/test/Driver/lto-flags.f90 +++ b/flang/test/Driver/lto-flags.f90 @@ -30,7 +30,6 @@ ! FULL-LTO: "-fc1" ! FULL-LTO-SAME: "-flto=full" -! THIN-LTO-ALL: flang{{.*}}: warning: the option '-flto=thin' is a work in progress ! THIN-LTO-ALL: "-fc1" ! THIN-LTO-ALL-SAME: "-flto=thin" ! THIN-LTO-LINKER-PLUGIN: "-plugin-opt=thinlto" >From e8c3365a92f51e5488d4cd8a9b38a6429292ec50 Mon Sep 17 00:00:00 2001 From: Kelvin Li <[email protected]> Date: Wed, 6 May 2026 00:50:36 -0400 Subject: [PATCH 2/3] fix format --- flang/lib/Frontend/FrontendActions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 4f56d65062e98..5158a918b05aa 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -1065,8 +1065,8 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0)); if (action == BackendActionTy::Backend_EmitBC) - mpm.addPass(llvm::BitcodeWriterPass(os, /*ShouldPreserveUseListOrder=*/false, - emitSummary)); + mpm.addPass(llvm::BitcodeWriterPass( + os, /*ShouldPreserveUseListOrder=*/false, emitSummary)); else if (action == BackendActionTy::Backend_EmitLL) mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"", /*ShouldPreserveUseListOrder=*/false, >From 5de96f46bdda9bb22dfc546150efbdb1f94683ee Mon Sep 17 00:00:00 2001 From: Kelvin Li <[email protected]> Date: Thu, 7 May 2026 13:16:19 -0400 Subject: [PATCH 3/3] Address review comments --- clang/lib/Driver/ToolChains/Flang.cpp | 3 +-- flang/lib/Frontend/FrontendActions.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 965136963b206..2d35a7e3d3fc7 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -275,9 +275,8 @@ void Flang::addLTOOptions(const ArgList &Args, ArgStringList &CmdArgs) const { assert(LTOMode != LTOK_Unknown && "Unknown LTO mode."); if (LTOMode == LTOK_Full) CmdArgs.push_back("-flto=full"); - else if (LTOMode == LTOK_Thin) { + else if (LTOMode == LTOK_Thin) CmdArgs.push_back("-flto=thin"); - } Args.addAllArgs(CmdArgs, {options::OPT_ffat_lto_objects, options::OPT_fno_fat_lto_objects}); } diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 5158a918b05aa..6a5c968fa2209 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -1060,10 +1060,13 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { if (action == BackendActionTy::Backend_EmitBC || action == BackendActionTy::Backend_EmitLL || opts.PrepareForFatLTO) { - if (!opts.PrepareForThinLTO) - if (emitSummary && !llvmModule->getModuleFlag("ThinLTO")) - llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0)); + // If it is not ThinLTO, emits the module flag and sets it to be off. + if (!opts.PrepareForThinLTO) { + if (emitSummary && !llvmModule->getModuleFlag("ThinLTO")) { + llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0)); + } + } if (action == BackendActionTy::Backend_EmitBC) mpm.addPass(llvm::BitcodeWriterPass( os, /*ShouldPreserveUseListOrder=*/false, emitSummary)); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
