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