[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