llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: Fangrui Song (MaskRay)

<details>
<summary>Changes</summary>

PR #<!-- -->232599 added `PipelineTuningOptions(const cl::LibraryOptionsContext
*);` for per-context library option support. The default ctor passes a
null context, so it and the getters it calls (e.g.
getForgetSCEVInLoopUnroll) read `T::Global` instead of the values parsed
into an LLVMContext.

Make the members whose defaults come from library options std::optional.
PassBuilder sets the unset ones from its LLVMContext. Remove the pointer
parameter ctor from #<!-- -->232599.

LLVMRunPasses now reads these options from the module's context, like
the other PassBuilder options.

LLM-aided

---

Patch is 37.41 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/238434.diff


27 Files Affected:

- (modified) clang/lib/CodeGen/BackendUtil.cpp (+1-2) 
- (modified) clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp (-1) 
- (modified) flang/lib/Frontend/FrontendActions.cpp (+1-1) 
- (modified) lld/COFF/LTO.cpp (-1) 
- (modified) lld/ELF/LTO.cpp (-1) 
- (modified) lld/MachO/LTO.cpp (-1) 
- (modified) lld/wasm/LTO.cpp (-1) 
- (modified) llvm/include/llvm/Analysis/CallGraphSCCPass.h (+1-1) 
- (modified) llvm/include/llvm/Passes/PassBuilder.h (+21-28) 
- (modified) llvm/include/llvm/Transforms/Scalar/LICM.h (+4-6) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h (+2-3) 
- (modified) llvm/lib/Analysis/CallGraphSCCPass.cpp (+2-3) 
- (modified) llvm/lib/DTLTO/CMakeLists.txt (+1) 
- (modified) llvm/lib/DTLTO/DTLTO.cpp (+4-1) 
- (modified) llvm/lib/LTO/LTOCodeGenerator.cpp (-1) 
- (modified) llvm/lib/LTO/ThinLTOCodeGenerator.cpp (+1-1) 
- (modified) llvm/lib/Passes/PassBuilder.cpp (+2-1) 
- (modified) llvm/lib/Passes/PassBuilderPipelines.cpp (+58-50) 
- (modified) llvm/lib/Passes/RunCodeGen.cpp (+1-2) 
- (modified) llvm/lib/Transforms/Scalar/LICM.cpp (+4-6) 
- (modified) llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp (+2-3) 
- (modified) llvm/tools/gold/gold-plugin.cpp (-1) 
- (modified) llvm/tools/llvm-lto2/llvm-lto2.cpp (-1) 
- (modified) llvm/tools/opt/NewPMDriver.cpp (+1-1) 
- (modified) llvm/utils/gn/secondary/llvm/lib/DTLTO/BUILD.gn (+1) 
- (modified) mlir/lib/ExecutionEngine/OptUtils.cpp (+1-1) 
- (modified) utils/bazel/llvm-project-overlay/llvm/BUILD.bazel (+1) 


``````````diff
diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index e04934548176f8..f226878f64f6f8 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -910,7 +910,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
   if (TM)
     TM->setPGOOption(PGOOpt);
 
-  PipelineTuningOptions PTO(&LibraryOptions);
+  PipelineTuningOptions PTO;
   PTO.LoopUnrolling = CodeGenOpts.UnrollLoops;
   PTO.LoopInterchange = CodeGenOpts.InterchangeLoops;
   PTO.LoopFusion = CodeGenOpts.FuseLoops;
@@ -1387,7 +1387,6 @@ runThinLTOBackend(CompilerInstance &CI, 
ModuleSummaryIndex *CombinedIndex,
   Conf.SampleProfile = std::move(SampleProfile);
   const cl::LibraryOptionsContext &LibraryOptions =
       M->getContext().getLibraryOptions();
-  Conf.PTO = PipelineTuningOptions(&LibraryOptions);
   Conf.PTO.LoopUnrolling = CGOpts.UnrollLoops;
   Conf.PTO.LoopInterchange = CGOpts.InterchangeLoops;
   Conf.PTO.LoopFusion = CGOpts.FuseLoops;
diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp 
b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp
index 6550902a6a6551..7bd9b007c74087 100644
--- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp
+++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp
@@ -376,7 +376,6 @@ createLTO(const cl::LibraryOptionsContext &LibraryOptions,
   const llvm::Triple Triple("nvptx64-nvidia-cuda");
   lto::Config Conf;
   Conf.LibraryOptions = &LibraryOptions;
-  Conf.PTO = PipelineTuningOptions(&LibraryOptions);
   lto::ThinBackend Backend;
   unsigned Jobs = 0;
   if (auto *Arg = Args.getLastArg(OPT_jobs))
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index 823b437d6e83fc..12047a65fb423f 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -966,7 +966,7 @@ void 
CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
   llvm::PassInstrumentationCallbacks pic;
   const llvm::cl::LibraryOptionsContext &libraryOptions =
       llvmModule->getContext().getLibraryOptions();
-  llvm::PipelineTuningOptions pto(&libraryOptions);
+  llvm::PipelineTuningOptions pto;
   std::optional<llvm::PGOOptions> pgoOpt;
 
   if (opts.hasProfileIRInstr()) {
diff --git a/lld/COFF/LTO.cpp b/lld/COFF/LTO.cpp
index 20209019a3e6fe..ed22a2f8206395 100644
--- a/lld/COFF/LTO.cpp
+++ b/lld/COFF/LTO.cpp
@@ -57,7 +57,6 @@ std::string BitcodeCompiler::getThinLTOOutputFile(StringRef 
path) {
 lto::Config BitcodeCompiler::createConfig() {
   lto::Config c;
   c.LibraryOptions = &ctx.config.libraryOptions;
-  c.PTO = PipelineTuningOptions(c.LibraryOptions);
   c.Options = initTargetOptionsFromCodeGenFlags();
   c.Options.EmitAddrsig = true;
   for (StringRef C : ctx.config.mllvmOpts)
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 0fa5673ed0f25b..7666e2bbb84094 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -56,7 +56,6 @@ static std::string getThinLTOOutputFile(Ctx &ctx, StringRef 
modulePath) {
 static lto::Config createConfig(Ctx &ctx) {
   lto::Config c;
   c.LibraryOptions = &ctx.arg.libraryOptions;
-  c.PTO = PipelineTuningOptions(c.LibraryOptions);
 
   // LLD supports the new relocations and address-significance tables.
   c.Options = initTargetOptionsFromCodeGenFlags();
diff --git a/lld/MachO/LTO.cpp b/lld/MachO/LTO.cpp
index 8eb008c990fe6c..d54a74e108e05f 100644
--- a/lld/MachO/LTO.cpp
+++ b/lld/MachO/LTO.cpp
@@ -39,7 +39,6 @@ static std::string getThinLTOOutputFile(StringRef modulePath) 
{
 static lto::Config createConfig() {
   lto::Config c;
   c.LibraryOptions = &config->libraryOptions;
-  c.PTO = PipelineTuningOptions(c.LibraryOptions);
   c.Options = initTargetOptionsFromCodeGenFlags();
   c.Options.EmitAddrsig = config->icfLevel == ICFLevel::safe ||
                           config->icfLevel == ICFLevel::safe_thunks;
diff --git a/lld/wasm/LTO.cpp b/lld/wasm/LTO.cpp
index 8bafd95a258688..774908babc84de 100644
--- a/lld/wasm/LTO.cpp
+++ b/lld/wasm/LTO.cpp
@@ -43,7 +43,6 @@ static std::string getThinLTOOutputFile(StringRef modulePath) 
{
 static lto::Config createConfig() {
   lto::Config c;
   c.LibraryOptions = &ctx.arg.libraryOptions;
-  c.PTO = PipelineTuningOptions(c.LibraryOptions);
   c.Options = initTargetOptionsFromCodeGenFlags();
 
   // Always emit a section per function/data with LTO.
diff --git a/llvm/include/llvm/Analysis/CallGraphSCCPass.h 
b/llvm/include/llvm/Analysis/CallGraphSCCPass.h
index a9042a43fec700..68c0277e9fb63d 100644
--- a/llvm/include/llvm/Analysis/CallGraphSCCPass.h
+++ b/llvm/include/llvm/Analysis/CallGraphSCCPass.h
@@ -35,7 +35,7 @@ namespace cl {
 class LibraryOptionsContext;
 } // namespace cl
 
-LLVM_ABI unsigned getMaxDevirtIterations(const cl::LibraryOptionsContext *);
+LLVM_ABI unsigned getMaxDevirtIterations(const cl::LibraryOptionsContext &);
 
 class LLVM_ABI CallGraphSCCPass : public Pass {
 public:
diff --git a/llvm/include/llvm/Passes/PassBuilder.h 
b/llvm/include/llvm/Passes/PassBuilder.h
index 3512c9c9a9ca29..07882a21a1b857 100644
--- a/llvm/include/llvm/Passes/PassBuilder.h
+++ b/llvm/include/llvm/Passes/PassBuilder.h
@@ -42,18 +42,16 @@ namespace cl {
 class LibraryOptionsContext;
 } // namespace cl
 
-/// Tunable parameters for passes in the default pipelines.
+/// Tunable parameters for passes in the default pipelines. An unset optional
+/// member takes the value of its library option in the PassBuilder's
+/// LLVMContext.
 class PipelineTuningOptions {
 public:
-  /// Constructor sets pipeline tuning defaults based on the global values of
-  /// the library options. Each option can be set in the PassBuilder when using
-  /// a LLVM as a library.
-  PipelineTuningOptions() : PipelineTuningOptions(nullptr) {}
+  LLVM_ABI PipelineTuningOptions();
 
-  /// Reads the defaults from \p LibraryOptions, or their global values if
-  /// null.
-  LLVM_ABI explicit PipelineTuningOptions(
-      const cl::LibraryOptionsContext *LibraryOptions);
+  /// Return a copy whose unset members are set from \p LibraryOptions.
+  [[nodiscard]] LLVM_ABI PipelineTuningOptions
+  resolve(const cl::LibraryOptionsContext &LibraryOptions) const;
 
   /// Tuning option to set loop interleaving on/off, set based on opt level.
   bool LoopInterleaving;
@@ -69,24 +67,22 @@ class PipelineTuningOptions {
   /// Tuning option to enable/disable loop unrolling. Its default value is 
true.
   bool LoopUnrolling;
 
-  /// Tuning option to enable/disable loop interchange. Its default value is
-  /// false.
-  bool LoopInterchange;
+  /// Tuning option to enable/disable loop interchange.
+  std::optional<bool> LoopInterchange;
 
   /// Tuning option to enable/disable loop fusion. Its default value is false.
   bool LoopFusion;
 
-  /// Tuning option to forget all SCEV loops in LoopUnroll. Its default value
-  /// is that of the flag: `-forget-scev-loop-unroll`.
-  bool ForgetAllSCEVInLoopUnroll;
+  /// Tuning option to forget all SCEV loops in LoopUnroll.
+  std::optional<bool> ForgetAllSCEVInLoopUnroll;
 
   /// Tuning option to cap the number of calls to retrive clobbering accesses 
in
   /// MemorySSA, in LICM.
-  unsigned LicmMssaOptCap;
+  std::optional<unsigned> LicmMssaOptCap;
 
   /// Tuning option to disable promotion to scalars in LICM with MemorySSA, if
   /// the number of access is too large.
-  unsigned LicmMssaNoAccForPromotionCap;
+  std::optional<unsigned> LicmMssaNoAccForPromotionCap;
 
   /// Tuning option to enable/disable call graph profile. Its default value is
   /// that of the flag: `-enable-npm-call-graph-profile`.
@@ -95,17 +91,15 @@ class PipelineTuningOptions {
   // Add LTO pipeline tuning option to enable the unified LTO pipeline.
   bool UnifiedLTO;
 
-  /// Tuning option to enable/disable function merging. Its default value is
-  /// false.
-  bool MergeFunctions;
+  /// Tuning option to enable/disable function merging.
+  std::optional<bool> MergeFunctions;
 
   /// Tuning option to override the default inliner threshold.
   int InlinerThreshold;
 
   /// Tuning option to cap how many times the inliner pipeline reruns on an SCC
-  /// after devirtualizing a call. Its default value is that of the flag:
-  /// `-max-devirt-iterations`.
-  unsigned MaxDevirtIterations;
+  /// after devirtualizing a call.
+  std::optional<unsigned> MaxDevirtIterations;
 
   // Experimental option to eagerly invalidate more analyses. This has the
   // potential to decrease max memory usage in exchange for more compile time.
@@ -114,11 +108,10 @@ class PipelineTuningOptions {
   // stale/imprecise but still valid. Currently this invalidates all function
   // analyses after various module->function or cgscc->function adaptors in the
   // default pipelines.
-  bool EagerlyInvalidateAnalyses;
+  std::optional<bool> EagerlyInvalidateAnalyses;
 
   // Tuning option to enable/disable speculative devirtualization.
-  // Its default value is false.
-  bool DevirtualizeSpeculatively;
+  std::optional<bool> DevirtualizeSpeculatively;
 };
 
 enum class PrintPipelinePassesFormat {
@@ -156,8 +149,8 @@ class PassBuilder {
   };
 
   /// The pipelines read the library options of \p Context, which must outlive
-  /// the PassBuilder. If \p PTO is not given, it reads its defaults from
-  /// \p Context.
+  /// the PassBuilder. Unset members of \p PTO, or all of them if \p PTO is not
+  /// given, are set from \p Context.
   LLVM_ABI explicit PassBuilder(
       LLVMContext &Context, TargetMachine *TM = nullptr,
       std::optional<PipelineTuningOptions> PTO = std::nullopt,
diff --git a/llvm/include/llvm/Transforms/Scalar/LICM.h 
b/llvm/include/llvm/Transforms/Scalar/LICM.h
index 7eb460e7b33599..379dbd2152a308 100644
--- a/llvm/include/llvm/Transforms/Scalar/LICM.h
+++ b/llvm/include/llvm/Transforms/Scalar/LICM.h
@@ -45,14 +45,12 @@ namespace cl {
 class LibraryOptionsContext;
 } // namespace cl
 
-/// Returns -licm-mssa-optimization-cap of LibraryOptions, or its global value
-/// if null.
+/// Return -licm-mssa-optimization-cap.
 LLVM_ABI unsigned
-getLicmMssaOptCap(const cl::LibraryOptionsContext *LibraryOptions);
-/// Returns -licm-mssa-max-acc-promotion of LibraryOptions, or its global value
-/// if null.
+getLicmMssaOptCap(const cl::LibraryOptionsContext &LibraryOptions);
+/// Return -licm-mssa-max-acc-promotion.
 LLVM_ABI unsigned getLicmMssaNoAccForPromotionCap(
-    const cl::LibraryOptionsContext *LibraryOptions);
+    const cl::LibraryOptionsContext &LibraryOptions);
 
 struct LICMOptions {
   // Unset means the -licm-mssa-* value of the loop's LLVMContext.
diff --git a/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h 
b/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h
index 7955d8f79dc5c0..f2e50353b9b42e 100644
--- a/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h
+++ b/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h
@@ -19,10 +19,9 @@ namespace cl {
 class LibraryOptionsContext;
 } // namespace cl
 
-/// Returns -forget-scev-loop-unroll of LibraryOptions, or its global value if
-/// null.
+/// Return -forget-scev-loop-unroll.
 LLVM_ABI bool
-getForgetSCEVInLoopUnroll(const cl::LibraryOptionsContext *LibraryOptions);
+getForgetSCEVInLoopUnroll(const cl::LibraryOptionsContext &LibraryOptions);
 
 class Function;
 class Loop;
diff --git a/llvm/lib/Analysis/CallGraphSCCPass.cpp 
b/llvm/lib/Analysis/CallGraphSCCPass.cpp
index ba120b245275df..bff6aee0cad972 100644
--- a/llvm/lib/Analysis/CallGraphSCCPass.cpp
+++ b/llvm/lib/Analysis/CallGraphSCCPass.cpp
@@ -44,9 +44,8 @@ using namespace llvm;
 #define DEBUG_TYPE "cgscc-passmgr"
 
 unsigned
-llvm::getMaxDevirtIterations(const cl::LibraryOptionsContext *LibraryOptions) {
-  return cl::LibraryOptionsContext::get<AnalysisOptions>(LibraryOptions)
-      .max_devirt_iterations;
+llvm::getMaxDevirtIterations(const cl::LibraryOptionsContext &LibraryOptions) {
+  return LibraryOptions.get<AnalysisOptions>().max_devirt_iterations;
 }
 
 STATISTIC(MaxSCCIterations, "Maximum CGSCCPassMgr iterations on one SCC");
diff --git a/llvm/lib/DTLTO/CMakeLists.txt b/llvm/lib/DTLTO/CMakeLists.txt
index f40f5709321088..6296e0efd91ff0 100644
--- a/llvm/lib/DTLTO/CMakeLists.txt
+++ b/llvm/lib/DTLTO/CMakeLists.txt
@@ -11,5 +11,6 @@ add_llvm_component_library(LLVMDTLTO
   Core
   LTO
   Object
+  Passes
   Support
   )
diff --git a/llvm/lib/DTLTO/DTLTO.cpp b/llvm/lib/DTLTO/DTLTO.cpp
index 669ba75c80d4b6..0f4ccc4cfe1a04 100644
--- a/llvm/lib/DTLTO/DTLTO.cpp
+++ b/llvm/lib/DTLTO/DTLTO.cpp
@@ -226,7 +226,10 @@ void lto::DTLTO::buildCommonRemoteCompilerOptions() {
     Ops.push_back("-ffunction-sections");
   if (C.Options.DataSections)
     Ops.push_back("-fdata-sections");
-  if (C.PTO.LoopInterchange)
+  // Match what an in-process backend resolves from C.LibraryOptions.
+  cl::LibraryOptionsContext NoLibraryOptions;
+  if (*C.PTO.resolve(C.LibraryOptions ? *C.LibraryOptions : NoLibraryOptions)
+           .LoopInterchange)
     Ops.push_back("-floop-interchange");
 
   if (C.RelocModel == Reloc::PIC_)
diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp 
b/llvm/lib/LTO/LTOCodeGenerator.cpp
index ad58b4fc3cf239..82a089a454dd21 100644
--- a/llvm/lib/LTO/LTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/LTOCodeGenerator.cpp
@@ -564,7 +564,6 @@ bool LTOCodeGenerator::optimize() {
   Config.RunCSIRInstr = LTORunCSIRInstr;
   Config.CSIRProfile = LTOCSIRProfile;
   Config.SampleProfile = SampleProfileFile;
-  Config.PTO = PipelineTuningOptions(Config.LibraryOptions);
   Config.PTO.LoopVectorization = Config.OptLevel > 1;
   Config.PTO.SLPVectorization = Config.OptLevel > 1;
 
diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp 
b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
index 13e4c7bb5fc6f6..a2060b003ffa37 100644
--- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
@@ -261,7 +261,7 @@ static void optimizeModule(Module &TheModule, TargetMachine 
&TM,
   PassInstrumentationCallbacks PIC;
   StandardInstrumentations SI(TheModule.getContext(), DebugPassManager);
   SI.registerCallbacks(PIC, &MAM);
-  PipelineTuningOptions PTO(&TheModule.getContext().getLibraryOptions());
+  PipelineTuningOptions PTO;
   PTO.LoopVectorization = true;
   PTO.SLPVectorization = true;
   PassBuilder PB(TheModule.getContext(), &TM, PTO, PGOOpt, &PIC);
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 8db9e561c825e4..3ca89c8d11163f 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -574,7 +574,8 @@ PassBuilder::PassBuilder(LLVMContext &Context, 
TargetMachine *TM,
                          PassInstrumentationCallbacks *PIC,
                          IntrusiveRefCntPtr<vfs::FileSystem> FS)
     : Context(Context), Opts(getPassesOptions(Context)), TM(TM),
-      PTO(PTO ? *PTO : PipelineTuningOptions(&Context.getLibraryOptions())),
+      PTO(PTO.value_or(PipelineTuningOptions())
+              .resolve(Context.getLibraryOptions())),
       PGOOpt(PGOOpt), PIC(PIC), FS(std::move(FS)) {
   if (TM)
     TM->registerPassBuilderCallbacks(*this);
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp 
b/llvm/lib/Passes/PassBuilderPipelines.cpp
index d1229a93ecf275..b815fe6e80113b 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -170,27 +170,35 @@ extern cl::opt<bool> EnableMemProfContextDisambiguation;
 extern cl::opt<bool> EnableProfcheckInPipeline;
 } // namespace llvm
 
-PipelineTuningOptions::PipelineTuningOptions(
-    const cl::LibraryOptionsContext *LibraryOptions) {
-  const PassesOptions &Opts =
-      cl::LibraryOptionsContext::get<PassesOptions>(LibraryOptions);
+PipelineTuningOptions::PipelineTuningOptions() {
   LoopInterleaving = true;
   LoopVectorization = true;
   SLPVectorization = false;
   LoopUnrolling = true;
-  LoopInterchange = Opts.enable_loopinterchange;
   LoopFusion = false;
-  ForgetAllSCEVInLoopUnroll = getForgetSCEVInLoopUnroll(LibraryOptions);
-  LicmMssaOptCap = getLicmMssaOptCap(LibraryOptions);
-  LicmMssaNoAccForPromotionCap =
-      getLicmMssaNoAccForPromotionCap(LibraryOptions);
   CallGraphProfile = true;
   UnifiedLTO = false;
-  MergeFunctions = Opts.enable_merge_functions;
   InlinerThreshold = -1;
-  MaxDevirtIterations = getMaxDevirtIterations(LibraryOptions);
-  EagerlyInvalidateAnalyses = Opts.eagerly_invalidate_analyses;
-  DevirtualizeSpeculatively = Opts.enable_devirtualize_speculatively;
+}
+
+PipelineTuningOptions PipelineTuningOptions::resolve(
+    const cl::LibraryOptionsContext &LibraryOptions) const {
+  const PassesOptions &Opts = LibraryOptions.get<PassesOptions>();
+  PipelineTuningOptions R = *this;
+  R.LoopInterchange = LoopInterchange.value_or(Opts.enable_loopinterchange);
+  R.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll.value_or(
+      getForgetSCEVInLoopUnroll(LibraryOptions));
+  R.LicmMssaOptCap = 
LicmMssaOptCap.value_or(getLicmMssaOptCap(LibraryOptions));
+  R.LicmMssaNoAccForPromotionCap = LicmMssaNoAccForPromotionCap.value_or(
+      getLicmMssaNoAccForPromotionCap(LibraryOptions));
+  R.MergeFunctions = MergeFunctions.value_or(Opts.enable_merge_functions);
+  R.MaxDevirtIterations =
+      MaxDevirtIterations.value_or(getMaxDevirtIterations(LibraryOptions));
+  R.EagerlyInvalidateAnalyses =
+      EagerlyInvalidateAnalyses.value_or(Opts.eagerly_invalidate_analyses);
+  R.DevirtualizeSpeculatively = DevirtualizeSpeculatively.value_or(
+      Opts.enable_devirtualize_speculatively);
+  return R;
 }
 
 void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
@@ -425,13 +433,13 @@ 
PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
   // will destroy metadata that may not need to be destroyed if run
   // after loop rotation.
   // TODO: Investigate promotion cap for O1.
-  LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
+  LPM1.addPass(LICMPass(*PTO.LicmMssaOptCap, *PTO.LicmMssaNoAccForPromotionCap,
                         /*AllowSpeculation=*/false));
 
   LPM1.addPass(
       LoopRotatePass(/*EnableHeaderDuplication=*/true, isLTOPreLink(Phase)));
   // TODO: Investigate promotion cap for O1.
-  LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
+  LPM1.addPass(LICMPass(*PTO.LicmMssaOptCap, *PTO.LicmMssaNoAccForPromotionCap,
                         /*AllowSpeculation=*/true));
   LPM1.addPass(SimpleLoopUnswitchPass());
   if (Opts.enable_loop_flatten)
@@ -453,7 +461,7 @@ 
PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
       PGOOpt->Action != PGOOptions::SampleUse)
     LPM2.addPass(LoopFullUnrollPass(static_cast<int>(Level),
                                     /* OnlyWhenForced= */ !PTO.LoopUnrolling,
-                                    PTO.ForgetAllSCEVInLoopUnroll));
+                                    *PTO.ForgetAllSCEVInLoopUnroll));
 
   invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
 
@@ -599,13 +607,13 @@ 
PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
   // will destroy metadata that may not need to be destroyed if run
   // after loop rotation.
   // TODO: Investigate promotion cap for O1.
-  LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
+  LPM1.addPass(LICMPass(*PTO.LicmMssaOptCap, *PTO.LicmMssaNoAccForPromotionCap,
                         /*AllowSpeculation=*/false));
 
   LPM1.addPass(
       LoopRotatePass(/*EnableHeaderDuplication=*/true, isLTOPreLink(Phase)));
   // TODO: Investigate promotion cap for O1.
-  LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
+  LPM1.addPass(LICMPass(*PTO.LicmMssaOptCap, *PTO.LicmMssaNoAccForPromotionCap,
                         /*AllowSpeculation=*/true));
   LPM1.addPass(
       SimpleLoopUnswitchPass(/* NonTrivial */ Level == OptimizationLevel::O3));
@@ -635,7 +643,7 @@ 
PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
       PGOOpt->Action != PGOOptions::SampleUse)
     LPM2.addPass(LoopFullUnrollPass(static_cast<int>(Level),
                                     /* OnlyWhenForced= */ !PTO.LoopUnrolling,
-                                    PTO.ForgetAllSCEVInLoopUnroll));
+                                    *PTO.ForgetAllSCEVInLoopUnroll));
 
   invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
 
@@ -699,7 +707,7 @@ 
PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
   FPM.addPass(MoveAutoInitPass());
 
   FPM.addPass(createFunctionToLoopPassAdaptor(
-      LICMPass(PTO.LicmMssaOptC...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/238434
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to