From 2deb5ff0a5ad5b9ef6bc2936f1d66c6146a17dbf Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 17 Sep 2025 11:29:29 -0400 Subject: [PATCH] Sema: Add -solver-{enable,disable}-prepared-overloads frontend flags --- include/swift/Basic/LangOptions.h | 3 +++ include/swift/Option/FrontendOptions.td | 6 ++++++ lib/Frontend/CompilerInvocation.cpp | 4 ++++ lib/Sema/CSSimplify.cpp | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/swift/Basic/LangOptions.h b/include/swift/Basic/LangOptions.h index cfd593e18112f..998c07d863b93 100644 --- a/include/swift/Basic/LangOptions.h +++ b/include/swift/Basic/LangOptions.h @@ -1011,6 +1011,9 @@ namespace swift { /// Disable the component splitter phase of the expression type checker. bool SolverDisableSplitter = false; + + /// Enable the experimental "prepared overloads" optimization. + bool SolverEnablePreparedOverloads = false; }; /// Options for controlling the behavior of the Clang importer. diff --git a/include/swift/Option/FrontendOptions.td b/include/swift/Option/FrontendOptions.td index c10e15a246409..d1abaebf97689 100644 --- a/include/swift/Option/FrontendOptions.td +++ b/include/swift/Option/FrontendOptions.td @@ -883,6 +883,12 @@ def solver_scope_threshold_EQ : Joined<["-"], "solver-scope-threshold=">, def solver_trail_threshold_EQ : Joined<["-"], "solver-trail-threshold=">, HelpText<"Expression type checking trail change limit">; +def solver_disable_prepared_overloads : Flag<["-"], "solver-disable-prepared-overloads">, + HelpText<"Disable experimental prepared overloads optimization">; + +def solver_enable_prepared_overloads : Flag<["-"], "solver-enable-prepared-overloads">, + HelpText<"Enable experimental prepared overloads optimization">; + def solver_disable_splitter : Flag<["-"], "solver-disable-splitter">, HelpText<"Disable the component splitter phase of expression type checking">; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index d31373ff4b4d7..e746f91a7f6cc 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2000,6 +2000,10 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args, if (Args.getLastArg(OPT_solver_disable_splitter)) Opts.SolverDisableSplitter = true; + if (Args.hasArg(OPT_solver_enable_prepared_overloads) || + Args.hasArg(OPT_solver_disable_prepared_overloads)) + Opts.SolverEnablePreparedOverloads = Args.hasArg(OPT_solver_enable_prepared_overloads); + if (FrontendOpts.RequestedAction == FrontendOptions::ActionType::Immediate) Opts.DeferToRuntime = true; diff --git a/lib/Sema/CSSimplify.cpp b/lib/Sema/CSSimplify.cpp index 976138a71b4f3..0f96d133bf49f 100644 --- a/lib/Sema/CSSimplify.cpp +++ b/lib/Sema/CSSimplify.cpp @@ -16737,7 +16737,7 @@ ConstraintSystem::simplifyConstraint(const Constraint &constraint) { } // FIXME: Transitional hack. - bool enablePreparedOverloads = false; + bool enablePreparedOverloads = getASTContext().TypeCheckerOpts.SolverEnablePreparedOverloads; auto *preparedOverload = constraint.getPreparedOverload(); if (!preparedOverload) {