[llvm] [PassBuilder] Add ThinLTO EP callbacks mirroring FullLinkTimeOptimizationEarly/Last (PR #221857)

Wenju He via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 8 19:11:52 PDT 2026


https://github.com/wenju-he updated https://github.com/llvm/llvm-project/pull/221857

>From c83cf28e01fb8c99bccbb2028d0600bb84b1aacf Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 8 Sep 2026 02:37:21 +0200
Subject: [PATCH 1/4] [PassBuilder] Add ThinLTO EP callbacks mirroring
 FullLinkTimeOptimizationEarly/Last

Our downstream has a request to add customization pass into
ThinLinkTimeOptimizationEarlyEPCallback, but buildThinLTODefaultPipeline
has no equivalent EPCallback like buildLTODefaultPipeline does.
This PR add it and ThinLinkTimeOptimizationLastEPCallback as well.
---
 llvm/include/llvm/Passes/PassBuilder.h   | 28 ++++++++++++++++++++++++
 llvm/lib/Passes/PassBuilderPipelines.cpp | 17 ++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/llvm/include/llvm/Passes/PassBuilder.h b/llvm/include/llvm/Passes/PassBuilder.h
index 0221cda0c308d..879e78fae4bf9 100644
--- a/llvm/include/llvm/Passes/PassBuilder.h
+++ b/llvm/include/llvm/Passes/PassBuilder.h
@@ -551,6 +551,24 @@ class PassBuilder {
     FullLinkTimeOptimizationLastEPCallbacks.push_back(C);
   }
 
+  /// Register a callback for ThinLTO default optimizer pipeline extension point
+  ///
+  /// This extension point allows adding optimizations at the start of the
+  /// thin LTO pipeline.
+  void registerThinLinkTimeOptimizationEarlyEPCallback(
+      const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
+    ThinLinkTimeOptimizationEarlyEPCallbacks.push_back(C);
+  }
+
+  /// Register a callback for ThinLTO default optimizer pipeline extension point
+  ///
+  /// This extension point allows adding optimizations at the end of the thin
+  /// LTO pipeline.
+  void registerThinLinkTimeOptimizationLastEPCallback(
+      const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
+    ThinLinkTimeOptimizationLastEPCallbacks.push_back(C);
+  }
+
   /// Register a callback for parsing an AliasAnalysis Name to populate
   /// the given AAManager \p AA
   void registerParseAACallback(
@@ -678,6 +696,12 @@ class PassBuilder {
   LLVM_ABI void
   invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
                                                 OptimizationLevel Level);
+  LLVM_ABI void
+  invokeThinLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
+                                                 OptimizationLevel Level);
+  LLVM_ABI void
+  invokeThinLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
+                                                OptimizationLevel Level);
   LLVM_ABI void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
                                                OptimizationLevel Level);
   LLVM_ABI void
@@ -813,6 +837,10 @@ class PassBuilder {
       FullLinkTimeOptimizationEarlyEPCallbacks;
   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
       FullLinkTimeOptimizationLastEPCallbacks;
+  SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
+      ThinLinkTimeOptimizationEarlyEPCallbacks;
+  SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
+      ThinLinkTimeOptimizationLastEPCallbacks;
   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
       PipelineStartEPCallbacks;
   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel,
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 901250fdd787e..f625b53af7c6e 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -408,6 +408,16 @@ void PassBuilder::invokeFullLinkTimeOptimizationLastEPCallbacks(
   for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
     C(MPM, Level);
 }
+void PassBuilder::invokeThinLinkTimeOptimizationEarlyEPCallbacks(
+    ModulePassManager &MPM, OptimizationLevel Level) {
+  for (auto &C : ThinLinkTimeOptimizationEarlyEPCallbacks)
+    C(MPM, Level);
+}
+void PassBuilder::invokeThinLinkTimeOptimizationLastEPCallbacks(
+    ModulePassManager &MPM, OptimizationLevel Level) {
+  for (auto &C : ThinLinkTimeOptimizationLastEPCallbacks)
+    C(MPM, Level);
+}
 void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
                                                  OptimizationLevel Level) {
   for (auto &C : PipelineStartEPCallbacks)
@@ -1938,6 +1948,8 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
 
   instructionCountersPass(MPM, /* IsPreOptimization */ true);
 
+  invokeThinLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);
+
   // If we are invoking this without a summary index noting that we are linking
   // with a library containing the necessary APIs, remove any MemProf related
   // attributes and metadata.
@@ -1985,6 +1997,9 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
     // globals in the object file.
     MPM.addPass(EliminateAvailableExternallyPass());
     MPM.addPass(GlobalDCEPass());
+
+    invokeThinLinkTimeOptimizationLastEPCallbacks(MPM, Level);
+
     return MPM;
   }
   if (!UseCtxProfile.empty()) {
@@ -1999,6 +2014,8 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
   MPM.addPass(buildModuleOptimizationPipeline(
       Level, ThinOrFullLTOPhase::ThinLTOPostLink));
 
+  invokeThinLinkTimeOptimizationLastEPCallbacks(MPM, Level);
+
   // Emit annotation remarks.
   addAnnotationRemarksPass(MPM);
 

>From 6a894d02d637248844fc06d68bfe6fcac5cd5f7f Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 8 Sep 2026 05:01:12 +0200
Subject: [PATCH 2/4] [Passes] Add unit test for ThinLTO EP callbacks

Covers registerThinLinkTimeOptimizationEarly/LastEPCallback firing in
order on both the O0 early-return path and the main optimization path
of buildThinLTODefaultPipeline.

Co-Authored-By: Claude <noreply at anthropic.com>
---
 llvm/unittests/Passes/CMakeLists.txt          | 11 +++
 .../Passes/PassBuilderEPCallbackTest.cpp      | 76 +++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100644 llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp

diff --git a/llvm/unittests/Passes/CMakeLists.txt b/llvm/unittests/Passes/CMakeLists.txt
index e96a4e12b94b0..3560dddbc4c9f 100644
--- a/llvm/unittests/Passes/CMakeLists.txt
+++ b/llvm/unittests/Passes/CMakeLists.txt
@@ -4,5 +4,16 @@ if(CMAKE_SYSTEM_NAME STREQUAL "AIX")
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-brtl")
 endif()
 
+set(LLVM_LINK_COMPONENTS
+  AsmParser
+  Core
+  Passes
+  Support
+  )
+
+add_llvm_unittest(PassesTests
+  PassBuilderEPCallbackTest.cpp
+  )
+
 add_subdirectory(PassBuilderBindings)
 add_subdirectory(Plugins)
diff --git a/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp b/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
new file mode 100644
index 0000000000000..30b437ae69395
--- /dev/null
+++ b/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
@@ -0,0 +1,76 @@
+//===- unittests/Passes/PassBuilderEPCallbackTest.cpp --------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "llvm/Passes/PassBuilder.h"
+#include "llvm/Support/SourceMgr.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
+  SMDiagnostic Err;
+  return parseAssemblyString(IR, Err, C);
+}
+
+class PassBuilderEPCallbackTest : public testing::Test {
+protected:
+  LLVMContext C;
+  std::unique_ptr<Module> M;
+  PassBuilder PB;
+
+  LoopAnalysisManager LAM;
+  FunctionAnalysisManager FAM;
+  CGSCCAnalysisManager CGAM;
+  ModuleAnalysisManager MAM;
+
+  std::vector<StringRef> Order;
+
+  PassBuilderEPCallbackTest() {
+    M = parseIR(C, "define void @f() { ret void }");
+
+    PB.registerModuleAnalyses(MAM);
+    PB.registerCGSCCAnalyses(CGAM);
+    PB.registerFunctionAnalyses(FAM);
+    PB.registerLoopAnalyses(LAM);
+    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
+
+    PB.registerThinLinkTimeOptimizationEarlyEPCallback(
+        [this](ModulePassManager &, OptimizationLevel) {
+          Order.push_back("Early");
+        });
+    PB.registerThinLinkTimeOptimizationLastEPCallback(
+        [this](ModulePassManager &, OptimizationLevel) {
+          Order.push_back("Last");
+        });
+  }
+};
+
+TEST_F(PassBuilderEPCallbackTest, ThinLTO_O0) {
+  ModulePassManager MPM =
+      PB.buildThinLTODefaultPipeline(OptimizationLevel::O0,
+                                     /*ImportSummary=*/nullptr);
+  MPM.run(*M, MAM);
+
+  EXPECT_EQ(Order, (std::vector<StringRef>{"Early", "Last"}));
+}
+
+TEST_F(PassBuilderEPCallbackTest, ThinLTO_O2) {
+  ModulePassManager MPM =
+      PB.buildThinLTODefaultPipeline(OptimizationLevel::O2,
+                                     /*ImportSummary=*/nullptr);
+  MPM.run(*M, MAM);
+
+  EXPECT_EQ(Order, (std::vector<StringRef>{"Early", "Last"}));
+}
+
+} // namespace

>From cbcbefb51604e60f46d7bd4aeee2026c9b411265 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 8 Sep 2026 05:34:10 +0200
Subject: [PATCH 3/4] SmallVector

---
 llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp b/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
index 30b437ae69395..b228949bc6657 100644
--- a/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
+++ b/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
@@ -6,6 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/AsmParser/Parser.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
@@ -33,7 +34,7 @@ class PassBuilderEPCallbackTest : public testing::Test {
   CGSCCAnalysisManager CGAM;
   ModuleAnalysisManager MAM;
 
-  std::vector<StringRef> Order;
+  SmallVector<StringRef, 2> Order;
 
   PassBuilderEPCallbackTest() {
     M = parseIR(C, "define void @f() { ret void }");
@@ -61,7 +62,7 @@ TEST_F(PassBuilderEPCallbackTest, ThinLTO_O0) {
                                      /*ImportSummary=*/nullptr);
   MPM.run(*M, MAM);
 
-  EXPECT_EQ(Order, (std::vector<StringRef>{"Early", "Last"}));
+  EXPECT_EQ(Order, (SmallVector<StringRef, 2>{"Early", "Last"}));
 }
 
 TEST_F(PassBuilderEPCallbackTest, ThinLTO_O2) {
@@ -70,7 +71,7 @@ TEST_F(PassBuilderEPCallbackTest, ThinLTO_O2) {
                                      /*ImportSummary=*/nullptr);
   MPM.run(*M, MAM);
 
-  EXPECT_EQ(Order, (std::vector<StringRef>{"Early", "Last"}));
+  EXPECT_EQ(Order, (SmallVector<StringRef, 2>{"Early", "Last"}));
 }
 
 } // namespace

>From 7585276317f0e410aed909562e51b2b2413c2c03 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Wed, 9 Sep 2026 04:02:04 +0200
Subject: [PATCH 4/4] change to LIT test

---
 llvm/test/Other/new-pm-O0-ep-callbacks.ll     |  2 +
 .../Other/new-pm-thinlto-postlink-defaults.ll |  6 ++
 llvm/tools/opt/NewPMDriver.cpp                | 29 +++++++
 llvm/unittests/Passes/CMakeLists.txt          | 11 ---
 .../Passes/PassBuilderEPCallbackTest.cpp      | 77 -------------------
 5 files changed, 37 insertions(+), 88 deletions(-)
 delete mode 100644 llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp

diff --git a/llvm/test/Other/new-pm-O0-ep-callbacks.ll b/llvm/test/Other/new-pm-O0-ep-callbacks.ll
index 77ccddba56a62..b6d3e98e4cf92 100644
--- a/llvm/test/Other/new-pm-O0-ep-callbacks.ll
+++ b/llvm/test/Other/new-pm-O0-ep-callbacks.ll
@@ -10,6 +10,8 @@
 ; RUN: opt -disable-output -debug-pass-manager -passes-ep-optimizer-last=no-op-module -passes='default<O0>' 2>&1 < %s | FileCheck %s
 ; RUN: opt -disable-output -debug-pass-manager -passes-ep-full-link-time-optimization-early=no-op-module -passes='lto<O0>' 2>&1 < %s | FileCheck %s
 ; RUN: opt -disable-output -debug-pass-manager -passes-ep-full-link-time-optimization-last=no-op-module -passes='lto<O0>' 2>&1 < %s | FileCheck %s
+; RUN: opt -disable-output -debug-pass-manager -passes-ep-thin-link-time-optimization-early=no-op-module -passes='thinlto<O0>' 2>&1 < %s | FileCheck %s
+; RUN: opt -disable-output -debug-pass-manager -passes-ep-thin-link-time-optimization-last=no-op-module -passes='thinlto<O0>' 2>&1 < %s | FileCheck %s
 
 ; CHECK: Running pass: NoOp
 
diff --git a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
index b1fde57902b05..204f3eb8beb54 100644
--- a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
@@ -26,10 +26,15 @@
 ; RUN: opt -disable-verify -verify-analysis-invalidation=0 -eagerly-invalidate-analyses=0 -debug-pass-manager -debug-info-for-profiling \
 ; RUN:     -passes='thinlto<O2>' -S  %s 2>&1 \
 ; RUN:     | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-O23,CHECK-POSTLINK-O,%llvmcheckext
+; RUN: opt -disable-verify -verify-analysis-invalidation=0 -eagerly-invalidate-analyses=0 -debug-pass-manager \
+; RUN:     -passes='thinlto<O1>' -S %s -passes-ep-thin-link-time-optimization-early=no-op-module \
+; RUN:     -passes-ep-thin-link-time-optimization-last=no-op-module 2>&1 \
+; RUN:     | FileCheck %s --check-prefixes=CHECK-O,CHECK-O1,CHECK-POSTLINK-O,%llvmcheckext,CHECK-EP-THINLTO-EARLY,CHECK-EP-THINLTO-LAST
 
 ; Suppress FileCheck --allow-unused-prefixes=false diagnostics.
 ; CHECK-NOEXT: {{^}}
 
+; CHECK-EP-THINLTO-EARLY: Running pass: NoOpModulePass
 ; CHECK-EP-PIPELINE-START: Running pass: NoOpModulePass
 ; CHECK-DIS: Running analysis: InnerAnalysisManagerProxy
 ; CHECK-DIS-NEXT: Running pass: AddDiscriminatorsPass
@@ -209,6 +214,7 @@
 ; CHECK-EP-OPT-EARLY-NEXT: Running pass: NoOpModulePass
 ; CHECK-EP-OPT-LAST-NEXT: Running pass: NoOpModulePass
 ; CHECK-POSTLINK-O-NEXT: Running pass: LowerCommentStringPass
+; CHECK-EP-THINLTO-LAST-NEXT: Running pass: NoOpModulePass
 ; CHECK-O-NEXT:          Running pass: AnnotationRemarksPass on foo
 ; CHECK-O-NEXT: Running pass: PrintModulePass
 
diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp
index 4fbaf02526a87..730ee097b2d1d 100644
--- a/llvm/tools/opt/NewPMDriver.cpp
+++ b/llvm/tools/opt/NewPMDriver.cpp
@@ -166,6 +166,18 @@ static cl::opt<std::string> FullLinkTimeOptimizationLastEPPipeline(
              "the FullLinkTimeOptimizationLast extension point into default "
              "pipelines"),
     cl::Hidden);
+static cl::opt<std::string> ThinLinkTimeOptimizationEarlyEPPipeline(
+    "passes-ep-thin-link-time-optimization-early",
+    cl::desc("A textual description of the module pass pipeline inserted at "
+             "the ThinLinkTimeOptimizationEarly extension point into default "
+             "pipelines"),
+    cl::Hidden);
+static cl::opt<std::string> ThinLinkTimeOptimizationLastEPPipeline(
+    "passes-ep-thin-link-time-optimization-last",
+    cl::desc("A textual description of the module pass pipeline inserted at "
+             "the ThinLinkTimeOptimizationLast extension point into default "
+             "pipelines"),
+    cl::Hidden);
 /// @}}
 
 static cl::opt<bool> DisablePipelineVerification(
@@ -345,6 +357,23 @@ static void registerEPCallbacks(PassBuilder &PB) {
               "Unable to parse FullLinkTimeOptimizationLastEP pipeline: ");
           Err(PB.parsePassPipeline(PM, FullLinkTimeOptimizationLastEPPipeline));
         });
+  if (tryParsePipelineText<ModulePassManager>(
+          PB, ThinLinkTimeOptimizationEarlyEPPipeline))
+    PB.registerThinLinkTimeOptimizationEarlyEPCallback(
+        [&PB](ModulePassManager &PM, OptimizationLevel) {
+          ExitOnError Err(
+              "Unable to parse ThinLinkTimeOptimizationEarlyEP pipeline: ");
+          Err(PB.parsePassPipeline(PM,
+                                   ThinLinkTimeOptimizationEarlyEPPipeline));
+        });
+  if (tryParsePipelineText<ModulePassManager>(
+          PB, ThinLinkTimeOptimizationLastEPPipeline))
+    PB.registerThinLinkTimeOptimizationLastEPCallback(
+        [&PB](ModulePassManager &PM, OptimizationLevel) {
+          ExitOnError Err(
+              "Unable to parse ThinLinkTimeOptimizationLastEP pipeline: ");
+          Err(PB.parsePassPipeline(PM, ThinLinkTimeOptimizationLastEPPipeline));
+        });
 }
 
 #define HANDLE_EXTENSION(Ext)                                                  \
diff --git a/llvm/unittests/Passes/CMakeLists.txt b/llvm/unittests/Passes/CMakeLists.txt
index 3560dddbc4c9f..e96a4e12b94b0 100644
--- a/llvm/unittests/Passes/CMakeLists.txt
+++ b/llvm/unittests/Passes/CMakeLists.txt
@@ -4,16 +4,5 @@ if(CMAKE_SYSTEM_NAME STREQUAL "AIX")
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-brtl")
 endif()
 
-set(LLVM_LINK_COMPONENTS
-  AsmParser
-  Core
-  Passes
-  Support
-  )
-
-add_llvm_unittest(PassesTests
-  PassBuilderEPCallbackTest.cpp
-  )
-
 add_subdirectory(PassBuilderBindings)
 add_subdirectory(Plugins)
diff --git a/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp b/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
deleted file mode 100644
index b228949bc6657..0000000000000
--- a/llvm/unittests/Passes/PassBuilderEPCallbackTest.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//===- unittests/Passes/PassBuilderEPCallbackTest.cpp --------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/AsmParser/Parser.h"
-#include "llvm/IR/LLVMContext.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Passes/PassBuilder.h"
-#include "llvm/Support/SourceMgr.h"
-#include "gtest/gtest.h"
-
-using namespace llvm;
-
-namespace {
-
-static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
-  SMDiagnostic Err;
-  return parseAssemblyString(IR, Err, C);
-}
-
-class PassBuilderEPCallbackTest : public testing::Test {
-protected:
-  LLVMContext C;
-  std::unique_ptr<Module> M;
-  PassBuilder PB;
-
-  LoopAnalysisManager LAM;
-  FunctionAnalysisManager FAM;
-  CGSCCAnalysisManager CGAM;
-  ModuleAnalysisManager MAM;
-
-  SmallVector<StringRef, 2> Order;
-
-  PassBuilderEPCallbackTest() {
-    M = parseIR(C, "define void @f() { ret void }");
-
-    PB.registerModuleAnalyses(MAM);
-    PB.registerCGSCCAnalyses(CGAM);
-    PB.registerFunctionAnalyses(FAM);
-    PB.registerLoopAnalyses(LAM);
-    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
-
-    PB.registerThinLinkTimeOptimizationEarlyEPCallback(
-        [this](ModulePassManager &, OptimizationLevel) {
-          Order.push_back("Early");
-        });
-    PB.registerThinLinkTimeOptimizationLastEPCallback(
-        [this](ModulePassManager &, OptimizationLevel) {
-          Order.push_back("Last");
-        });
-  }
-};
-
-TEST_F(PassBuilderEPCallbackTest, ThinLTO_O0) {
-  ModulePassManager MPM =
-      PB.buildThinLTODefaultPipeline(OptimizationLevel::O0,
-                                     /*ImportSummary=*/nullptr);
-  MPM.run(*M, MAM);
-
-  EXPECT_EQ(Order, (SmallVector<StringRef, 2>{"Early", "Last"}));
-}
-
-TEST_F(PassBuilderEPCallbackTest, ThinLTO_O2) {
-  ModulePassManager MPM =
-      PB.buildThinLTODefaultPipeline(OptimizationLevel::O2,
-                                     /*ImportSummary=*/nullptr);
-  MPM.run(*M, MAM);
-
-  EXPECT_EQ(Order, (SmallVector<StringRef, 2>{"Early", "Last"}));
-}
-
-} // namespace



More information about the llvm-commits mailing list