[compiler] useMemo calls directly induce memoization blocks
Summary: To support the always-bailing-out and change-detection modes for the compiler, and to potentially support end-user codebases in some situations, we previously built a mode where user-level useMemos weren't dropped. This, however, results in codegen that is quite vastly different from the compiler's default mode, and which is likely to exercise different bugs. This diff introduces a new mode that attempts to preserve user-level memoization in a way that is more compatible with the normal output of the compiler, dropping the literal useMemo calls and producing reactive scopes. The result of this is different from the existing ensurePreserveMemoizationGuarantees in that the reactive scope is marked as originating from a useMemo, and cannot be merged with other memoization blocks, and that some operations are memoized that are not necessarily memoized today: specifically, `obj.x` and `f()`. This is to account for the fact that current useMemo calls may call non-idempotent functions inside useMemo--this is a violation of React's rules and is unsupported, but this mode attempts to support this behavior to make the compiler's behavior as close to user-level behavior as possible. We build the user-level reactive scopes by simply adding all memoizable instructions between `StartMemo` and `FinishMemo` to their own reactive scope, possibly overwriting an existing scope. We do so before the scopes have been populated with dependencies or outputs so those passes can operate over these new scopes as normal. ghstack-source-id: 2b557ecc679eebbf4841508ce1d09c5bfb234ef6 Pull Request resolved: https://github.com/facebook/react/pull/30177
Showing
- compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts 11 additions, 1 deletion...es/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts
- compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts 19 additions, 1 deletion...ckages/babel-plugin-react-compiler/src/HIR/Environment.ts
- compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts 2 additions, 0 deletionscompiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts
- compiler/packages/babel-plugin-react-compiler/src/Inference/DropManualMemoization.ts 1 addition, 0 deletions...gin-react-compiler/src/Inference/DropManualMemoization.ts
- compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/InferReactiveScopeVariables.ts 99 additions, 76 deletions...ompiler/src/ReactiveScopes/InferReactiveScopeVariables.ts
- compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/MemoizeExistingUseMemos.ts 108 additions, 0 deletions...ct-compiler/src/ReactiveScopes/MemoizeExistingUseMemos.ts
- compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/MergeReactiveScopesThatInvalidateTogether.ts 9 additions, 9 deletions...activeScopes/MergeReactiveScopesThatInvalidateTogether.ts
- compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts 1 addition, 1 deletion...act-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts
- compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneUnusedScopes.ts 1 addition, 0 deletions...in-react-compiler/src/ReactiveScopes/PruneUnusedScopes.ts
- compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.expect.md 77 additions, 0 deletions...xtures/compiler/useMemo-preserve-non-idempotent.expect.md
- compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.js 20 additions, 0 deletions...ts__/fixtures/compiler/useMemo-preserve-non-idempotent.js
- compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.expect.md 13 additions, 18 deletions...ts__/fixtures/compiler/useMemo-simple-preserved.expect.md
- compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.js 1 addition, 1 deletion...c/__tests__/fixtures/compiler/useMemo-simple-preserved.js
- compiler/packages/snap/src/compiler.ts 13 additions, 0 deletionscompiler/packages/snap/src/compiler.ts
Please register or sign in to comment