Skip to content

[flang] Emit module summary for ThinLTO#195999

Open
kkwli wants to merge 2 commits intollvm:mainfrom
kkwli:enable-thinlto
Open

[flang] Emit module summary for ThinLTO#195999
kkwli wants to merge 2 commits intollvm:mainfrom
kkwli:enable-thinlto

Conversation

@kkwli
Copy link
Copy Markdown
Collaborator

@kkwli kkwli commented May 6, 2026

This patch is to enable emitting module summary for ThinLTO.

@kkwli kkwli requested review from abidh, anchuraj and tarunprabhu May 6, 2026 04:41
@kkwli kkwli self-assigned this May 6, 2026
@llvmorg-github-actions llvmorg-github-actions Bot added clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' flang:driver flang Flang issues not falling into any other category labels May 6, 2026
@llvmorg-github-actions
Copy link
Copy Markdown

llvmorg-github-actions Bot commented May 6, 2026

@llvm/pr-subscribers-flang-driver

@llvm/pr-subscribers-clang-driver

Author: Kelvin Li (kkwli)

Changes

This patch is to enable emitting module summary for ThinLTO.


Full diff: https://github.com/llvm/llvm-project/pull/195999.diff

5 Files Affected:

  • (modified) clang/lib/Driver/ToolChains/Flang.cpp (-3)
  • (modified) flang/lib/Frontend/FrontendActions.cpp (+10-16)
  • (modified) flang/test/Driver/lto-bc.f90 (+6-3)
  • (modified) flang/test/Driver/lto-fatlto.f90 (+7-2)
  • (modified) flang/test/Driver/lto-flags.f90 (-1)
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"

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

✅ With the latest revision this PR passed the C/C++ code formatter.

@kkwli kkwli requested a review from DanielCChen May 6, 2026 04:47
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🐧 Linux x64 Test Results

The build failed before running any tests. Click on a failure below to see the details.

tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o
sccache /opt/llvm/bin/clang++ -DCLANG_EXPORTS -D_DEBUG -D_GLIBCXX_ASSERTIONS -D_GLIBCXX_USE_CXX11_ABI=1 -D_GNU_SOURCE -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/lib/Driver -I/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/lib/Driver -I/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/include -I/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/include -I/home/gha/actions-runner/_work/llvm-project/llvm-project/build/include -I/home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/include -gmlt -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++17 -UNDEBUG -fno-exceptions -funwind-tables -fno-rtti -MD -MT tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o -MF tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o.d -o tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Flang.cpp.o -c /home/gha/actions-runner/_work/llvm-project/llvm-project/clang/lib/Driver/ToolChains/Flang.cpp
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/lib/Driver/ToolChains/Flang.cpp:272:22: error: unused variable 'Diags' [-Werror,-Wunused-variable]
272 |   DiagnosticsEngine &Diags = D.getDiags();
|                      ^~~~~
1 error generated.

If these failures are unrelated to your changes (for example tests are broken or flaky at HEAD), please open an issue at https://github.com/llvm/llvm-project/issues and add the infrastructure label.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' flang:driver flang Flang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant