diff --git a/cpython-windows/build.py b/cpython-windows/build.py index 638a2c78..190ac9f6 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -1327,6 +1327,25 @@ def build_cpython( ) if pgo: + if ( + meets_python_minimum_version(python_version, "3.14") + and build_platform == "x64" + ): + # On 3.14.0a5, PGO cannot be run on ceval so we disable it there + # See https://github.com/python/cpython/issues/130004 + # We should be able to drop this patch in 3.14.0a6 + exec_and_log( + [ + "patch", + "-p1", + "-i", + SUPPORT / "patch-disable-pgo-ceval-3.14.patch", + ], + str(cpython_source_path), + env=os.environ, + exit_on_error=False, + ) + run_msbuild( msbuild, pcbuild_path, diff --git a/cpython-windows/patch-disable-pgo-ceval-3.14.patch b/cpython-windows/patch-disable-pgo-ceval-3.14.patch new file mode 100644 index 00000000..8e96d601 --- /dev/null +++ b/cpython-windows/patch-disable-pgo-ceval-3.14.patch @@ -0,0 +1,72 @@ +diff --git a/Python/ceval.c b/Python/ceval.c +index c6a7a0f841f027..5f8f0ae69ef31b 100644 +--- a/Python/ceval.c ++++ b/Python/ceval.c +@@ -764,15 +764,10 @@ _PyObjectArray_Free(PyObject **array, PyObject **scratch) + #define PY_EVAL_C_STACK_UNITS 2 + + +-/* _PyEval_EvalFrameDefault is too large to optimize for speed with PGO on MSVC +- when the JIT is enabled or GIL is disabled. Disable that optimization around +- this function only. If this is fixed upstream, we should gate this on the +- version of MSVC. ++/* _PyEval_EvalFrameDefault is too large to optimize for speed with PGO on MSVC. + */ + #if (defined(_MSC_VER) && \ +- defined(_Py_USING_PGO) && \ +- (defined(_Py_JIT) || \ +- defined(Py_GIL_DISABLED))) ++ defined(_Py_USING_PGO)) + #define DO_NOT_OPTIMIZE_INTERP_LOOP + #endif +diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props +index dbdb6b743bea37..17abfa85201a90 100644 +--- a/PCbuild/pyproject.props ++++ b/PCbuild/pyproject.props +@@ -53,6 +53,7 @@ + + $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(GeneratedPyConfigDir);$(PySourcePath)PC;%(AdditionalIncludeDirectories) + WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PyStatsPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) ++ _Py_USING_PGO=1;%(PreprocessorDefinitions) + + MaxSpeed + true +diff --git a/Python/ceval.c b/Python/ceval.c +index 1e4f1f3af20aca..c6a7a0f841f027 100644 +--- a/Python/ceval.c ++++ b/Python/ceval.c +@@ -764,6 +764,23 @@ _PyObjectArray_Free(PyObject **array, PyObject **scratch) + #define PY_EVAL_C_STACK_UNITS 2 + + ++/* _PyEval_EvalFrameDefault is too large to optimize for speed with PGO on MSVC ++ when the JIT is enabled or GIL is disabled. Disable that optimization around ++ this function only. If this is fixed upstream, we should gate this on the ++ version of MSVC. ++ */ ++#if (defined(_MSC_VER) && \ ++ defined(_Py_USING_PGO) && \ ++ (defined(_Py_JIT) || \ ++ defined(Py_GIL_DISABLED))) ++#define DO_NOT_OPTIMIZE_INTERP_LOOP ++#endif ++ ++#ifdef DO_NOT_OPTIMIZE_INTERP_LOOP ++# pragma optimize("t", off) ++/* This setting is reversed below following _PyEval_EvalFrameDefault */ ++#endif ++ + #ifdef Py_TAIL_CALL_INTERP + #include "opcode_targets.h" + #include "generated_cases.c.h" +@@ -986,6 +1003,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int + return NULL; + } + ++#ifdef DO_NOT_OPTIMIZE_INTERP_LOOP ++# pragma optimize("", on) ++#endif ++ + #if defined(__GNUC__) + # pragma GCC diagnostic pop + #elif defined(_MSC_VER) /* MS_WINDOWS */