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

Reply via email to