diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
index aa36d6da831e7..b6f697edfee38 100644
--- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
+++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
@@ -1082,6 +1082,15 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
fn: A => R,
a: A,
): R {
+ // In legacy mode, we flush pending passive effects at the beginning of the
+ // next event, not at the end of the previous one.
+ if (
+ rootWithPendingPassiveEffects !== null &&
+ rootWithPendingPassiveEffects.tag === LegacyRoot
+ ) {
+ flushPassiveEffects();
+ }
+
const prevExecutionContext = executionContext;
executionContext |= BatchedContext;
diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
index 2fd46c7cda7ca..22c8395cb0988 100644
--- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
+++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
@@ -1082,6 +1082,15 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
fn: A => R,
a: A,
): R {
+ // In legacy mode, we flush pending passive effects at the beginning of the
+ // next event, not at the end of the previous one.
+ if (
+ rootWithPendingPassiveEffects !== null &&
+ rootWithPendingPassiveEffects.tag === LegacyRoot
+ ) {
+ flushPassiveEffects();
+ }
+
const prevExecutionContext = executionContext;
executionContext |= BatchedContext;