dillon1000/react

Commit

Prune scopes whose values dont escape

Adds a new pass that uses escape analysis and React-specific heuristics to tune 
the amount of memoization applied. Specifically, the pass ensures that we only 
memoize: 

* Values which escape (are directly returned or transitively aliased by a 
returned value) 

* ...and that are not JSX elements 

* OR values which are _dependencies_ of scopes that produce an escaping value. 

The latter case is necessary to avoid breaking memoization of an escaping value 
bc a scope happened to have a non-escaping dependency. 

## Algorithm 

1. First we build up a graph, a mapping of IdentifierId to a node describing all 
the scopes and inputs involved in creating that identifier. Individual nodes are 
marked as definitely aliased, conditionally aliased, or unaliased: 

a. Arrays, objects, function calls all produce a new value and are always marked 
as aliased 

b. Conditional and logical expressions (and a few others) are conditinally 
aliased, depending on whether their result value is aliased. 

c. JSX is always unaliased (though its props children may be) 

2. The same pass which builds the graph also stores the set of returned 
identifiers 

3. We traverse the graph starting from the returned identifiers and mark 
reachable dependencies as escaping, based on the combination of the parent 
node's type and its children (eg a conditional node with an aliased dep promotes 
to aliased). 

4. Finally we prune scopes whose outputs weren't marked.
Browse files
Changed paths89 files
First-parent comparison
M compiler/forget/src/CompilerPipeline.ts ModifiedM compiler/forget/src/ReactiveScopes/PrintReactiveFunction.ts ModifiedA compiler/forget/src/ReactiveScopes/PruneNonEscapingScopes.ts AddedM compiler/forget/src/ReactiveScopes/index.ts ModifiedM compiler/forget/src/__tests__/fixtures/hir/_bug.capturing-function-renamed-ref.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/allocating-primitive-as-dep-nested-scope.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/allocating-primitive-as-dep.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/call.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/capture-func-passed-to-jsx.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/capturing-function-member-expr-call.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/component.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/concise-arrow-expr.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/conditional-on-mutable.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/constant-propagation-for.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/constant-propagation-while.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/constructor.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/controlled-input.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/dce-loop.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/destructure-direct-reassignment.expect.md ModifiedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-jsx-child.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-jsx-child.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-logical.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-logical.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-non-escaping-interleaved-allocating-dependency.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-non-escaping-interleaved-allocating-dependency.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-non-escaping-interleaved-primitive-dependency.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-non-escaping-interleaved-primitive-dependency.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-conditional-test.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-conditional-test.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-if-test.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-if-test.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-switch-case.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-switch-case.js AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-switch-test.expect.md AddedA compiler/forget/src/__tests__/fixtures/hir/escape-analysis-not-switch-test.js AddedM compiler/forget/src/__tests__/fixtures/hir/for-logical.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/gating-test-export-default-function.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/gating-test-export-function-and-default.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/gating-test-export-function.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/gating-test.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/hook-call.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/independent-across-if.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/independent.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/interdependent-across-if.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/interdependent.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/jsx-fragment.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/jsx-spread.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/logical-expression-object.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/logical-expression.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/mutable-liverange-loop.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/overlapping-scopes-shadowing-within-block.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/property-assignment.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reactive-scopes-if.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reactive-scopes.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reassignment-conditional.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reassignment.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-ifelse.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-nested-ifelse-missing.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-nested-ifelse.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-switch-missing-case.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-switch-missing-default.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-cfg-switch.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-no-uncond.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-promote-uncond.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-subpath-order1.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-subpath-order2.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-superpath-order1.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/reduce-reactive-cond-deps-superpath-order2.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/same-variable-as-dep-and-redeclare-maybe-frozen.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/same-variable-as-dep-and-redeclare.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-call-jsx-2.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-call-jsx.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-cascading-eliminated-phis.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-for-trivial-update.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-for.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-leave-case.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ssa-while.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/switch.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/temporary-at-start-of-value-block.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/ternary-expression.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/timers.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/type-binary-operator.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/type-test-return-type-inference.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/unary-expr.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/use-callback-simple.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/useMemo-simple.expect.md ModifiedM compiler/forget/src/__tests__/fixtures/hir/while-property.expect.md Modified
Patch

Files changed

Rendering syntax-highlighted changes…