[llvm] d7a3bdf - [PassBuilder][FatLTO] Expose FatLTO pipeline via pipeline string (#146048)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 30 03:04:46 PDT 2025


Author: Nikita Popov
Date: 2025-06-30T12:04:42+02:00
New Revision: d7a3bdffb9a34da27188368bde45fdd1426f5185

URL: https://github.com/llvm/llvm-project/commit/d7a3bdffb9a34da27188368bde45fdd1426f5185
DIFF: https://github.com/llvm/llvm-project/commit/d7a3bdffb9a34da27188368bde45fdd1426f5185.diff

LOG: [PassBuilder][FatLTO] Expose FatLTO pipeline via pipeline string (#146048)

Expose the FatLTO pipeline via `-passes="fatlto-pre-link<Ox>"`, similar
to all the other optimization pipelines. This is to allow reproducing it
outside clang. (Possibly also useful for C API users.)

Added: 
    llvm/test/Other/fatlto.ll

Modified: 
    llvm/lib/Passes/PassBuilder.cpp
    llvm/lib/Passes/PassRegistry.def
    llvm/test/Other/pipeline-alias-errors.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index bb266ac776891..0697a0a6b4c74 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -1524,6 +1524,41 @@ Expected<bool> parseVirtRegRewriterPassOptions(StringRef Params) {
   return ClearVirtRegs;
 }
 
+struct FatLTOOptions {
+  OptimizationLevel OptLevel;
+  bool ThinLTO = false;
+  bool EmitSummary = false;
+};
+
+Expected<FatLTOOptions> parseFatLTOOptions(StringRef Params) {
+  FatLTOOptions Result;
+  bool HaveOptLevel = false;
+  while (!Params.empty()) {
+    StringRef ParamName;
+    std::tie(ParamName, Params) = Params.split(';');
+
+    if (ParamName == "thinlto") {
+      Result.ThinLTO = true;
+    } else if (ParamName == "emit-summary") {
+      Result.EmitSummary = true;
+    } else if (std::optional<OptimizationLevel> OptLevel =
+                   parseOptLevel(ParamName)) {
+      Result.OptLevel = *OptLevel;
+      HaveOptLevel = true;
+    } else {
+      return make_error<StringError>(
+          formatv("invalid fatlto-pre-link pass parameter '{}'", ParamName)
+              .str(),
+          inconvertibleErrorCode());
+    }
+  }
+  if (!HaveOptLevel)
+    return make_error<StringError>(
+        "missing optimization level for fatlto-pre-link pipeline",
+        inconvertibleErrorCode());
+  return Result;
+}
+
 } // namespace
 
 /// Tests whether registered callbacks will accept a given pass name.

diff  --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 1d924f38a47fb..65276489e6f02 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -276,6 +276,13 @@ MODULE_PASS_WITH_PARAMS(
       return buildLTODefaultPipeline(L, nullptr);
     },
     parseOptLevelParam, "O0;O1;O2;O3;Os;Oz")
+MODULE_PASS_WITH_PARAMS(
+    "fatlto-pre-link", "", [&](FatLTOOptions Opts) {
+      setupOptionsForPipelineAlias(PTO, Opts.OptLevel);
+      return buildFatLTODefaultPipeline(Opts.OptLevel, Opts.ThinLTO,
+                                        Opts.EmitSummary);
+    },
+    parseFatLTOOptions, "O0;O1;O2;O3;Os;Oz;thinlto;emit-summary")
 
 #undef MODULE_PASS_WITH_PARAMS
 

diff  --git a/llvm/test/Other/fatlto.ll b/llvm/test/Other/fatlto.ll
new file mode 100644
index 0000000000000..90e2701dc847b
--- /dev/null
+++ b/llvm/test/Other/fatlto.ll
@@ -0,0 +1,7 @@
+; RUN: opt -debug-pass-manager -passes='fatlto-pre-link<O2>' -disable-output %s 2>&1 | FileCheck %s
+; RUN: opt -debug-pass-manager -passes='fatlto-pre-link<O2;thinlto>' -disable-output %s 2>&1 | FileCheck %s --check-prefixes=CHECK,THINLTO
+
+; CHECK: Running pass: EmbedBitcodePass on [module]
+; THINLTO: Running analysis: ModuleSummaryIndexAnalysis on [module]
+; CHECK-NEXT: Running pass: FatLtoCleanup on [module]
+; CHECK-NEXT: Running pass: LowerTypeTestsPass on [module]

diff  --git a/llvm/test/Other/pipeline-alias-errors.ll b/llvm/test/Other/pipeline-alias-errors.ll
index 4d744144ed2ec..f27dd76568a56 100644
--- a/llvm/test/Other/pipeline-alias-errors.ll
+++ b/llvm/test/Other/pipeline-alias-errors.ll
@@ -8,6 +8,11 @@
 ; RUN: not opt -passes="lto-pre-link<foo>" < %s 2>&1 | FileCheck %s --check-prefix=INVALID-OPT-LEVEL
 ; RUN: not opt -passes="lto" < %s 2>&1 | FileCheck %s --check-prefix=MISSING-OPT-LEVEL
 ; RUN: not opt -passes="lto<foo>" < %s 2>&1 | FileCheck %s --check-prefix=INVALID-OPT-LEVEL
+; RUN: not opt -passes="fatlto-pre-link" < %s 2>&1 | FileCheck %s --check-prefix=FATLTO-MISSING-OPT-LEVEL
+; RUN: not opt -passes="fatlto-pre-link<foo>" < %s 2>&1 | FileCheck %s --check-prefix=FATLTO-INVALID-PARAMS
 
 ; MISSING-OPT-LEVEL: invalid optimization level ''
 ; INVALID-OPT-LEVEL: invalid optimization level 'foo'
+
+; FATLTO-MISSING-OPT-LEVEL: missing optimization level for fatlto-pre-link pipeline
+; FATLTO-INVALID-PARAMS: invalid fatlto-pre-link pass parameter 'foo'


        


More information about the llvm-commits mailing list