From bc12f791127896cd3538fac4465e3190447b2257 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 9 Nov 2023 13:41:40 -0500 Subject: [PATCH] gh-111786: Optimize for space for _PyEval_EvalFrameDefault on MSVC for PGO (#111794) In PGO mode, this function caused a compiler error in MSVC. It turns out that optimizing for space only save the day, and is even faster. However, without PGO, this is neither necessary nor slower. --- PCbuild/pyproject.props | 1 + Python/ceval.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index fb12f2b0766..bb3555bd123 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -41,6 +41,7 @@ $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories) WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) Py_NOGIL=1;%(PreprocessorDefinitions) + _Py_USING_PGO=1;%(PreprocessorDefinitions) MaxSpeed true diff --git a/Python/ceval.c b/Python/ceval.c index 68bed93eae3..42100393f60 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -664,6 +664,15 @@ extern const struct _PyCode_DEF(8) _Py_InitCleanup; * so consume 3 units of C stack */ #define PY_EVAL_C_STACK_UNITS 2 +#if defined(_MSC_VER) && defined(_Py_USING_PGO) +/* gh-111786: _PyEval_EvalFrameDefault is too large to optimize for speed with + PGO on MSVC. Disable that optimization temporarily. If this is fixed + upstream, we should gate this on the version of MSVC. + */ +# pragma optimize("t", off) +/* This setting is reversed below following _PyEval_EvalFrameDefault */ +#endif + PyObject* _Py_HOT_FUNCTION _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag) { @@ -1080,6 +1089,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int # pragma GCC diagnostic pop #elif defined(_MSC_VER) /* MS_WINDOWS */ # pragma warning(pop) +# pragma optimize("", on) #endif static void