From 255700e2cdc5d66cb4158a136f9964b434352d55 Mon Sep 17 00:00:00 2001 From: Jan Kassens Date: Fri, 9 Dec 2022 13:10:01 -0500 Subject: [PATCH] Increase precision in InferMutableRangesForAlias Previously, this step just set the mutable range of any alias set including any mutation to the end of the last mutable range of any of the containing identifiers. This change makes it so that the ends are only updated of the ranges that end before the last mutation. Fixes #852 --- .../src/HIR/InferMutableRangesForAlias.ts | 19 +++-- .../fixtures/hir/component.expect.md | 52 ++++++------- .../__tests__/fixtures/hir/issue852.expect.md | 61 +++++++++++++++ .../src/__tests__/fixtures/hir/issue852.js | 6 ++ .../hir/ssa-complex-multiple-if.expect.md | 18 +++-- .../hir/ssa-complex-single-if.expect.md | 14 ++-- .../fixtures/hir/ssa-simple-phi.expect.md | 20 ++--- .../fixtures/hir/ssa-switch.expect.md | 24 +++--- .../hir/switch-non-final-default.expect.md | 74 +++++++++---------- .../__tests__/fixtures/hir/switch.expect.md | 70 +++++++++--------- 10 files changed, 220 insertions(+), 138 deletions(-) create mode 100644 compiler/forget/src/__tests__/fixtures/hir/issue852.expect.md create mode 100644 compiler/forget/src/__tests__/fixtures/hir/issue852.js diff --git a/compiler/forget/src/HIR/InferMutableRangesForAlias.ts b/compiler/forget/src/HIR/InferMutableRangesForAlias.ts index f3499b2075..de0c7855ad 100644 --- a/compiler/forget/src/HIR/InferMutableRangesForAlias.ts +++ b/compiler/forget/src/HIR/InferMutableRangesForAlias.ts @@ -7,18 +7,25 @@ export function inferMutableRangesForAlias(aliases: DisjointSet) { for (const aliasSet of aliasSets) { // Update mutableRange.end only if the identifiers have actually been // mutated. - const haveIdentifiersBeenMutated = [...aliasSet].some( + const mutatingIdentifiers = [...aliasSet].filter( (id) => id.mutableRange.end - id.mutableRange.start > 1 ); - if (haveIdentifiersBeenMutated) { + if (mutatingIdentifiers.length > 0) { // Find final instruction which mutates this alias set. - const mutableRangeEnds = [...aliasSet].map((id) => id.mutableRange.end); - const maxMutableRangeEnd = Math.max(...mutableRangeEnds) as InstructionId; + let lastMutatingInstructionId = 0; + for (const id of mutatingIdentifiers) { + if (id.mutableRange.end > lastMutatingInstructionId) { + lastMutatingInstructionId = id.mutableRange.end; + } + } - // Update mutableRange.end for all aliases in this set. + // Update mutableRange.end for all aliases in this set ending before the + // last mutation. for (const alias of aliasSet) { - alias.mutableRange.end = maxMutableRangeEnd; + if (alias.mutableRange.end < lastMutatingInstructionId) { + alias.mutableRange.end = lastMutatingInstructionId as InstructionId; + } } } } diff --git a/compiler/forget/src/__tests__/fixtures/hir/component.expect.md b/compiler/forget/src/__tests__/fixtures/hir/component.expect.md index f7c39ff2fe..f1a704f665 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/component.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/component.expect.md @@ -37,7 +37,7 @@ function Component(props) { bb0: [1] Const mutate items$27_@0 = read props$26.items [2] Const mutate maxItems$28_@1 = read props$26.maxItems - [3] Const mutate renderedItems$29_@2[3:26] = Array [] + [3] Const mutate renderedItems$29_@2[3:22] = Array [] [4] Const mutate seen$30_@3[0:19] = New mutate Set$6_@3() [5] Const mutate $31_@4 = 0 [6] Const mutate max$32_@5[0:7] = Call mutate Math$8_@5.max(read $31_@4, read maxItems$28_@1) @@ -71,23 +71,23 @@ bb4: [19] Const mutate $43_@7 = "div" [20] Const mutate $44_@8 = JSX {read item$10_@3} [21] Call mutate renderedItems$29_@2.push(read $44_@8) - [22] Const mutate $49_@2[3:26] = Binary read renderedItems$29_@2.length >= read max$32_@5 - [23] If (read $49_@2) then:bb2 else:bb10 fallthrough=bb10 + [22] Const mutate $49_@9 = Binary read renderedItems$29_@2.length >= read max$32_@5 + [23] If (read $49_@9) then:bb2 else:bb10 fallthrough=bb10 bb10: predecessor blocks: bb4 [24] Goto(Continue) bb1 bb2: predecessor blocks: bb4 bb1 - [25] Const mutate count$52_@2[3:26] = read renderedItems$29_@2.length - [26] Const mutate $53_@9 = "div" - [27] Const mutate $54_@10 = "\n " - [28] Const mutate $55_@11 = "h1" - [29] Const mutate $56_@12 = " Items" - [30] Const mutate $57_@13 = JSX {freeze count$52_@2}{read $56_@12} - [31] Const mutate $58_@14 = "\n " - [32] Const mutate $59_@15 = "\n " - [33] Const mutate $60_@16 = JSX {read $54_@10}{read $57_@13}{read $58_@14}{freeze renderedItems$29_@2}{read $59_@15} - [34] Return read $60_@16 + [25] Const mutate count$52_@10 = read renderedItems$29_@2.length + [26] Const mutate $53_@11 = "div" + [27] Const mutate $54_@12 = "\n " + [28] Const mutate $55_@13 = "h1" + [29] Const mutate $56_@14 = " Items" + [30] Const mutate $57_@15 = JSX {freeze count$52_@10}{read $56_@14} + [31] Const mutate $58_@16 = "\n " + [32] Const mutate $59_@17 = "\n " + [33] Const mutate $60_@18 = JSX {read $54_@12}{read $57_@15}{read $58_@16}{freeze renderedItems$29_@2}{read $59_@17} + [34] Return read $60_@18 scope0 [1:2]: - read props$26.items scope1 [2:3]: @@ -103,7 +103,7 @@ flowchart TB bb0_instrs[" [1] Const mutate items$27_@0 = read props$26.items [2] Const mutate maxItems$28_@1 = read props$26.maxItems - [3] Const mutate renderedItems$29_@2[3:26] = Array [] + [3] Const mutate renderedItems$29_@2[3:22] = Array [] [4] Const mutate seen$30_@3[0:19] = New mutate Set$6_@3() [5] Const mutate $31_@4 = 0 [6] Const mutate max$32_@5[0:7] = Call mutate Math$8_@5.max(read $31_@4, read maxItems$28_@1) @@ -145,26 +145,26 @@ flowchart TB [19] Const mutate $43_@7 = 'div' [20] Const mutate $44_@8 = JSX {read item$10_@3} [21] Call mutate renderedItems$29_@2.push(read $44_@8) - [22] Const mutate $49_@2[3:26] = Binary read renderedItems$29_@2.length >= read max$32_@5 + [22] Const mutate $49_@9 = Binary read renderedItems$29_@2.length >= read max$32_@5 "] - bb4_instrs --> bb4_terminal(["If (read $49_@2)"]) + bb4_instrs --> bb4_terminal(["If (read $49_@9)"]) end subgraph bb10 bb10_terminal(["Goto"]) end subgraph bb2 bb2_instrs[" - [25] Const mutate count$52_@2[3:26] = read renderedItems$29_@2.length - [26] Const mutate $53_@9 = 'div' - [27] Const mutate $54_@10 = '\n ' - [28] Const mutate $55_@11 = 'h1' - [29] Const mutate $56_@12 = ' Items' - [30] Const mutate $57_@13 = JSX {freeze count$52_@2}{read $56_@12} - [31] Const mutate $58_@14 = '\n ' - [32] Const mutate $59_@15 = '\n ' - [33] Const mutate $60_@16 = JSX {read $54_@10}{read $57_@13}{read $58_@14}{freeze renderedItems$29_@2}{read $59_@15} + [25] Const mutate count$52_@10 = read renderedItems$29_@2.length + [26] Const mutate $53_@11 = 'div' + [27] Const mutate $54_@12 = '\n ' + [28] Const mutate $55_@13 = 'h1' + [29] Const mutate $56_@14 = ' Items' + [30] Const mutate $57_@15 = JSX {freeze count$52_@10}{read $56_@14} + [31] Const mutate $58_@16 = '\n ' + [32] Const mutate $59_@17 = '\n ' + [33] Const mutate $60_@18 = JSX {read $54_@12}{read $57_@15}{read $58_@16}{freeze renderedItems$29_@2}{read $59_@17} "] - bb2_instrs --> bb2_terminal(["Return read $60_@16"]) + bb2_instrs --> bb2_terminal(["Return read $60_@18"]) end %% Jumps diff --git a/compiler/forget/src/__tests__/fixtures/hir/issue852.expect.md b/compiler/forget/src/__tests__/fixtures/hir/issue852.expect.md new file mode 100644 index 0000000000..72fd2a98b7 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/issue852.expect.md @@ -0,0 +1,61 @@ + +## Input + +```javascript +function Component(c) { + let x = { c }; + mutate(x); + let a = x; + let b = a; +} + +``` + +## HIR + +``` +bb0: + [1] Const mutate x$7_@0[0:3] = Object { c: read c$6 } + [2] Call mutate mutate$3_@0(mutate x$7_@0) + [3] Const mutate a$8_@1 = read x$7_@0 + [4] Const mutate b$9_@2 = read a$8_@1 + [5] Return +scope1 [3:4]: + - read x$7_@0 +scope2 [4:5]: + - read a$8_@1 +``` + +### CFG + +```mermaid +flowchart TB + %% Basic Blocks + subgraph bb0 + bb0_instrs[" + [1] Const mutate x$7_@0[0:3] = Object { c: read c$6 } + [2] Call mutate mutate$3_@0(mutate x$7_@0) + [3] Const mutate a$8_@1 = read x$7_@0 + [4] Const mutate b$9_@2 = read a$8_@1 + "] + bb0_instrs --> bb0_terminal(["Return"]) + end + + %% Jumps + %% empty +``` + +## Code + +```javascript +function Component$0(c$6) { + const x$7 = { + c: c$6, + }; + mutate$3(x$7); + const a$8 = x$7; + const b$9 = a$8; +} + +``` + \ No newline at end of file diff --git a/compiler/forget/src/__tests__/fixtures/hir/issue852.js b/compiler/forget/src/__tests__/fixtures/hir/issue852.js new file mode 100644 index 0000000000..907ff058d5 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/issue852.js @@ -0,0 +1,6 @@ +function Component(c) { + let x = { c }; + mutate(x); + let a = x; + let b = a; +} diff --git a/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-multiple-if.expect.md b/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-multiple-if.expect.md index c46bac7c0d..618d0a3fd6 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-multiple-if.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-multiple-if.expect.md @@ -21,14 +21,14 @@ function foo() { ``` bb0: - [1] Let mutate x$7_@0[1:14] = 1 + [1] Let mutate x$7_@0[1:13] = 1 [2] Const mutate y$8_@1 = 2 [3] Const mutate $9_@2 = 2 [4] Const mutate $10_@3 = Binary read y$8_@1 === read $9_@2 [5] If (read $10_@3) then:bb2 else:bb1 fallthrough=bb1 bb2: predecessor blocks: bb0 - [6] Reassign mutate x$7_@0[1:14] = 3 + [6] Reassign mutate x$7_@0[1:13] = 3 [7] Goto bb1 bb1: predecessor blocks: bb2 bb0 @@ -37,11 +37,11 @@ bb1: [10] If (read $14_@5) then:bb4 else:bb3 fallthrough=bb3 bb4: predecessor blocks: bb1 - [11] Reassign mutate x$7_@0[1:14] = 5 + [11] Reassign mutate x$7_@0[1:13] = 5 [12] Goto bb3 bb3: predecessor blocks: bb4 bb1 - [13] Const mutate y$18_@0[1:14] = read x$7_@0 + [13] Const mutate y$18_@6 = read x$7_@0 [14] Return scope3 [4:5]: - read y$8_@1 @@ -49,6 +49,8 @@ scope3 [4:5]: scope5 [9:10]: - read y$8_@1 - read $12_@4 +scope6 [13:14]: + - read x$7_@0 ``` ### CFG @@ -58,7 +60,7 @@ flowchart TB %% Basic Blocks subgraph bb0 bb0_instrs[" - [1] Let mutate x$7_@0[1:14] = 1 + [1] Let mutate x$7_@0[1:13] = 1 [2] Const mutate y$8_@1 = 2 [3] Const mutate $9_@2 = 2 [4] Const mutate $10_@3 = Binary read y$8_@1 === read $9_@2 @@ -67,7 +69,7 @@ flowchart TB end subgraph bb2 bb2_instrs[" - [6] Reassign mutate x$7_@0[1:14] = 3 + [6] Reassign mutate x$7_@0[1:13] = 3 "] bb2_instrs --> bb2_terminal(["Goto"]) end @@ -80,13 +82,13 @@ flowchart TB end subgraph bb4 bb4_instrs[" - [11] Reassign mutate x$7_@0[1:14] = 5 + [11] Reassign mutate x$7_@0[1:13] = 5 "] bb4_instrs --> bb4_terminal(["Goto"]) end subgraph bb3 bb3_instrs[" - [13] Const mutate y$18_@0[1:14] = read x$7_@0 + [13] Const mutate y$18_@6 = read x$7_@0 "] bb3_instrs --> bb3_terminal(["Return"]) end diff --git a/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-single-if.expect.md b/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-single-if.expect.md index 924f0f0f7e..6c52423540 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-single-if.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/ssa-complex-single-if.expect.md @@ -18,22 +18,24 @@ function foo() { ``` bb0: - [1] Let mutate x$5_@0[1:9] = 1 + [1] Let mutate x$5_@0[1:8] = 1 [2] Const mutate y$6_@1 = 2 [3] Const mutate $7_@2 = 2 [4] Const mutate $8_@3 = Binary read y$6_@1 === read $7_@2 [5] If (read $8_@3) then:bb2 else:bb1 fallthrough=bb1 bb2: predecessor blocks: bb0 - [6] Reassign mutate x$5_@0[1:9] = 3 + [6] Reassign mutate x$5_@0[1:8] = 3 [7] Goto bb1 bb1: predecessor blocks: bb2 bb0 - [8] Const mutate y$11_@0[1:9] = read x$5_@0 + [8] Const mutate y$11_@4 = read x$5_@0 [9] Return scope3 [4:5]: - read y$6_@1 - read $7_@2 +scope4 [8:9]: + - read x$5_@0 ``` ### CFG @@ -43,7 +45,7 @@ flowchart TB %% Basic Blocks subgraph bb0 bb0_instrs[" - [1] Let mutate x$5_@0[1:9] = 1 + [1] Let mutate x$5_@0[1:8] = 1 [2] Const mutate y$6_@1 = 2 [3] Const mutate $7_@2 = 2 [4] Const mutate $8_@3 = Binary read y$6_@1 === read $7_@2 @@ -52,13 +54,13 @@ flowchart TB end subgraph bb2 bb2_instrs[" - [6] Reassign mutate x$5_@0[1:9] = 3 + [6] Reassign mutate x$5_@0[1:8] = 3 "] bb2_instrs --> bb2_terminal(["Goto"]) end subgraph bb1 bb1_instrs[" - [8] Const mutate y$11_@0[1:9] = read x$5_@0 + [8] Const mutate y$11_@4 = read x$5_@0 "] bb1_instrs --> bb1_terminal(["Return"]) end diff --git a/compiler/forget/src/__tests__/fixtures/hir/ssa-simple-phi.expect.md b/compiler/forget/src/__tests__/fixtures/hir/ssa-simple-phi.expect.md index 30d24d7585..157a49d60d 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/ssa-simple-phi.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/ssa-simple-phi.expect.md @@ -23,25 +23,27 @@ bb0: [1] Const mutate y$5_@0 = 2 [2] Const mutate $6_@1 = 1 [3] Const mutate $7_@2 = Binary read y$5_@0 > read $6_@1 - [4] Let mutate y$8_@3[4:10] = undefined + [4] Let mutate y$8_@3[4:9] = undefined [4] If (read $7_@2) then:bb2 else:bb3 fallthrough=bb1 bb2: predecessor blocks: bb0 - [5] Reassign mutate y$8_@3[4:10] = 1 + [5] Reassign mutate y$8_@3[4:9] = 1 [6] Goto bb1 bb3: predecessor blocks: bb0 - [7] Reassign mutate y$8_@3[4:10] = 2 + [7] Reassign mutate y$8_@3[4:9] = 2 [8] Goto bb1 bb1: predecessor blocks: bb2 bb3 - [9] Const mutate x$11_@3[4:10] = read y$8_@3 + [9] Const mutate x$11_@4 = read y$8_@3 [10] Return scope2 [3:4]: - read y$5_@0 - read $6_@1 -scope3 [4:10]: +scope3 [4:9]: - read $7_@2 +scope4 [9:10]: + - read y$8_@3 ``` ### CFG @@ -54,25 +56,25 @@ flowchart TB [1] Const mutate y$5_@0 = 2 [2] Const mutate $6_@1 = 1 [3] Const mutate $7_@2 = Binary read y$5_@0 > read $6_@1 - [4] Let mutate y$8_@3[4:10] = undefined + [4] Let mutate y$8_@3[4:9] = undefined "] bb0_instrs --> bb0_terminal(["If (read $7_@2)"]) end subgraph bb2 bb2_instrs[" - [5] Reassign mutate y$8_@3[4:10] = 1 + [5] Reassign mutate y$8_@3[4:9] = 1 "] bb2_instrs --> bb2_terminal(["Goto"]) end subgraph bb3 bb3_instrs[" - [7] Reassign mutate y$8_@3[4:10] = 2 + [7] Reassign mutate y$8_@3[4:9] = 2 "] bb3_instrs --> bb3_terminal(["Goto"]) end subgraph bb1 bb1_instrs[" - [9] Const mutate x$11_@3[4:10] = read y$8_@3 + [9] Const mutate x$11_@4 = read y$8_@3 "] bb1_instrs --> bb1_terminal(["Return"]) end diff --git a/compiler/forget/src/__tests__/fixtures/hir/ssa-switch.expect.md b/compiler/forget/src/__tests__/fixtures/hir/ssa-switch.expect.md index 83660156d9..64bac403d1 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/ssa-switch.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/ssa-switch.expect.md @@ -33,7 +33,7 @@ bb0: [3] Const mutate $12_@2 = Binary read x$10_@0 === read $11_@1 [4] Const mutate $13_@3 = 1 [5] Const mutate $14_@4 = Binary read x$10_@0 === read $13_@3 - [6] Let mutate x$16_@5[6:17] = undefined + [6] Let mutate x$16_@5[6:16] = undefined [6] Switch (read x$10_@0) Case read $14_@4: bb5 Case read $12_@2: bb3 @@ -42,21 +42,21 @@ bb0: bb5: predecessor blocks: bb0 [7] Const mutate $15_@6 = 1 - [8] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $15_@6 + [8] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $15_@6 [9] Goto bb1 bb3: predecessor blocks: bb0 [10] Const mutate $17_@7 = 2 - [11] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $17_@7 + [11] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $17_@7 [12] Goto bb1 bb2: predecessor blocks: bb0 [13] Const mutate $19_@8 = 3 - [14] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $19_@8 + [14] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $19_@8 [15] Goto bb1 bb1: predecessor blocks: bb5 bb3 bb2 - [16] Const mutate y$22_@5[6:17] = read x$16_@5 + [16] Const mutate y$22_@9 = read x$16_@5 [17] Return scope2 [3:4]: - read x$10_@0 @@ -64,7 +64,7 @@ scope2 [3:4]: scope4 [5:6]: - read x$10_@0 - read $13_@3 -scope5 [6:17]: +scope5 [6:16]: - read x$10_@0 scope8 [13:14]: - read x$10_@0 @@ -72,6 +72,8 @@ scope7 [10:11]: - read x$10_@0 scope6 [7:8]: - read x$10_@0 +scope9 [16:17]: + - read x$16_@5 ``` ### CFG @@ -86,34 +88,34 @@ flowchart TB [3] Const mutate $12_@2 = Binary read x$10_@0 === read $11_@1 [4] Const mutate $13_@3 = 1 [5] Const mutate $14_@4 = Binary read x$10_@0 === read $13_@3 - [6] Let mutate x$16_@5[6:17] = undefined + [6] Let mutate x$16_@5[6:16] = undefined "] bb0_instrs --> bb0_terminal(["Switch (read x$10_@0)"]) end subgraph bb5 bb5_instrs[" [7] Const mutate $15_@6 = 1 - [8] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $15_@6 + [8] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $15_@6 "] bb5_instrs --> bb5_terminal(["Goto"]) end subgraph bb3 bb3_instrs[" [10] Const mutate $17_@7 = 2 - [11] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $17_@7 + [11] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $17_@7 "] bb3_instrs --> bb3_terminal(["Goto"]) end subgraph bb2 bb2_instrs[" [13] Const mutate $19_@8 = 3 - [14] Reassign mutate x$16_@5[6:17] = Binary read x$10_@0 + read $19_@8 + [14] Reassign mutate x$16_@5[6:16] = Binary read x$10_@0 + read $19_@8 "] bb2_instrs --> bb2_terminal(["Goto"]) end subgraph bb1 bb1_instrs[" - [16] Const mutate y$22_@5[6:17] = read x$16_@5 + [16] Const mutate y$22_@9 = read x$16_@5 "] bb1_instrs --> bb1_terminal(["Return"]) end diff --git a/compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md b/compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md index bfb1e5bd77..b8ae586733 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md @@ -32,44 +32,44 @@ function Component(props) { ``` bb0: - [1] Const mutate x$10_@0[1:12] = Array [] - [2] Let mutate y$11_@0[1:12] = undefined - [3] Const mutate $12_@1 = false - [4] Const mutate $13_@2 = true - [5] Const mutate $14_@3 = 1 + [1] Const mutate x$10_@1[1:12] = Array [] + [2] Let mutate y$11_@1[1:12] = undefined + [3] Const mutate $12_@2 = false + [4] Const mutate $13_@3 = true + [5] Const mutate $14_@4 = 1 [6] Switch (read props$9.p0) - Case read $14_@3: bb1 - Case read $13_@2: bb6 + Case read $14_@4: bb1 + Case read $13_@3: bb6 Default: bb1 - Case read $12_@1: bb2 + Case read $12_@2: bb2 Fallthrough: bb1 bb6: predecessor blocks: bb0 - [7] Call mutate x$10_@0.push(read props$9.p2) - [8] Reassign mutate y$11_@0[1:12] = Array [] + [7] Call mutate x$10_@1.push(read props$9.p2) + [8] Reassign mutate y$11_@1[1:12] = Array [] [9] Goto bb1 bb2: predecessor blocks: bb0 - [10] Reassign mutate y$11_@0[1:12] = read x$10_@0 + [10] Reassign mutate y$11_@1[1:12] = read x$10_@1 [11] Goto bb1 bb1: predecessor blocks: bb0 bb6 bb2 - [12] Const mutate child$19_@4 = JSX - [13] Call read y$11_@0.push(read props$9.p4) - [14] Const mutate $22_@5 = JSX {read child$19_@4} - [15] Return read $22_@5 -scope0 [1:12]: + [12] Const mutate child$19_@5 = JSX + [13] Call read y$11_@1.push(read props$9.p4) + [14] Const mutate $22_@6 = JSX {read child$19_@5} + [15] Return read $22_@6 +scope1 [1:12]: - read props$9.p2 - read props$9.p0 -scope4 [12:13]: +scope5 [12:13]: - read Component$0 - - freeze x$10_@0 - - read y$11_@0.push + - freeze x$10_@1 + - read y$11_@1.push - read props$9.p4 -scope5 [14:15]: +scope6 [14:15]: - read Component$0 - - freeze y$11_@0 - - read child$19_@4 + - freeze y$11_@1 + - read child$19_@5 ``` ### CFG @@ -79,41 +79,41 @@ flowchart TB %% Basic Blocks subgraph bb0 bb0_instrs[" - [1] Const mutate x$10_@0[1:12] = Array [] - [2] Let mutate y$11_@0[1:12] = undefined - [3] Const mutate $12_@1 = false - [4] Const mutate $13_@2 = true - [5] Const mutate $14_@3 = 1 + [1] Const mutate x$10_@1[1:12] = Array [] + [2] Let mutate y$11_@1[1:12] = undefined + [3] Const mutate $12_@2 = false + [4] Const mutate $13_@3 = true + [5] Const mutate $14_@4 = 1 "] bb0_instrs --> bb0_terminal(["Switch (read props$9.p0)"]) end subgraph bb6 bb6_instrs[" - [7] Call mutate x$10_@0.push(read props$9.p2) - [8] Reassign mutate y$11_@0[1:12] = Array [] + [7] Call mutate x$10_@1.push(read props$9.p2) + [8] Reassign mutate y$11_@1[1:12] = Array [] "] bb6_instrs --> bb6_terminal(["Goto"]) end subgraph bb2 bb2_instrs[" - [10] Reassign mutate y$11_@0[1:12] = read x$10_@0 + [10] Reassign mutate y$11_@1[1:12] = read x$10_@1 "] bb2_instrs --> bb2_terminal(["Goto"]) end subgraph bb1 bb1_instrs[" - [12] Const mutate child$19_@4 = JSX - [13] Call read y$11_@0.push(read props$9.p4) - [14] Const mutate $22_@5 = JSX {read child$19_@4} + [12] Const mutate child$19_@5 = JSX + [13] Call read y$11_@1.push(read props$9.p4) + [14] Const mutate $22_@6 = JSX {read child$19_@5} "] - bb1_instrs --> bb1_terminal(["Return read $22_@5"]) + bb1_instrs --> bb1_terminal(["Return read $22_@6"]) end %% Jumps - bb0_terminal -- "read $14_@3" --> bb1 - bb0_terminal -- "read $13_@2" --> bb6 + bb0_terminal -- "read $14_@4" --> bb1 + bb0_terminal -- "read $13_@3" --> bb6 bb0_terminal -- "default" --> bb1 - bb0_terminal -- "read $12_@1" --> bb2 + bb0_terminal -- "read $12_@2" --> bb2 bb0_terminal -- "fallthrough" --> bb1 bb6_terminal --> bb1 bb2_terminal --> bb1 diff --git a/compiler/forget/src/__tests__/fixtures/hir/switch.expect.md b/compiler/forget/src/__tests__/fixtures/hir/switch.expect.md index 2cc0afbc80..82055ff408 100644 --- a/compiler/forget/src/__tests__/fixtures/hir/switch.expect.md +++ b/compiler/forget/src/__tests__/fixtures/hir/switch.expect.md @@ -28,44 +28,44 @@ function Component(props) { ``` bb0: - [1] Const mutate x$9_@0[1:12] = Array [] - [2] Let mutate y$10_@0[1:12] = undefined - [3] Const mutate $11_@1 = false - [4] Const mutate $12_@2 = true + [1] Const mutate x$9_@1[1:12] = Array [] + [2] Let mutate y$10_@1[1:12] = undefined + [3] Const mutate $11_@2 = false + [4] Const mutate $12_@3 = true [5] Switch (read props$8.p0) - Case read $12_@2: bb4 - Case read $11_@1: bb2 + Case read $12_@3: bb4 + Case read $11_@2: bb2 Default: bb1 Fallthrough: bb1 bb4: predecessor blocks: bb0 - [6] Call mutate x$9_@0.push(read props$8.p2) - [7] Call mutate x$9_@0.push(read props$8.p3) - [8] Const mutate y$13_@3 = Array [] + [6] Call mutate x$9_@1.push(read props$8.p2) + [7] Call mutate x$9_@1.push(read props$8.p3) + [8] Const mutate y$13_@4 = Array [] [9] Goto bb2 bb2: predecessor blocks: bb4 bb0 - [10] Reassign mutate y$10_@0[1:12] = read x$9_@0 + [10] Reassign mutate y$10_@1[1:12] = read x$9_@1 [11] Goto bb1 bb1: predecessor blocks: bb2 bb0 - [12] Const mutate child$19_@4 = JSX - [13] Call read y$10_@0.push(read props$8.p4) - [14] Const mutate $23_@5 = JSX {read child$19_@4} - [15] Return read $23_@5 -scope0 [1:12]: + [12] Const mutate child$19_@5 = JSX + [13] Call read y$10_@1.push(read props$8.p4) + [14] Const mutate $23_@6 = JSX {read child$19_@5} + [15] Return read $23_@6 +scope1 [1:12]: - read props$8.p2 - read props$8.p3 - read props$8.p0 -scope4 [12:13]: +scope5 [12:13]: - read Component$0 - - freeze x$9_@0 - - read y$10_@0.push + - freeze x$9_@1 + - read y$10_@1.push - read props$8.p4 -scope5 [14:15]: +scope6 [14:15]: - read Component$0 - - read y$10_@0 - - read child$19_@4 + - read y$10_@1 + - read child$19_@5 ``` ### CFG @@ -75,39 +75,39 @@ flowchart TB %% Basic Blocks subgraph bb0 bb0_instrs[" - [1] Const mutate x$9_@0[1:12] = Array [] - [2] Let mutate y$10_@0[1:12] = undefined - [3] Const mutate $11_@1 = false - [4] Const mutate $12_@2 = true + [1] Const mutate x$9_@1[1:12] = Array [] + [2] Let mutate y$10_@1[1:12] = undefined + [3] Const mutate $11_@2 = false + [4] Const mutate $12_@3 = true "] bb0_instrs --> bb0_terminal(["Switch (read props$8.p0)"]) end subgraph bb4 bb4_instrs[" - [6] Call mutate x$9_@0.push(read props$8.p2) - [7] Call mutate x$9_@0.push(read props$8.p3) - [8] Const mutate y$13_@3 = Array [] + [6] Call mutate x$9_@1.push(read props$8.p2) + [7] Call mutate x$9_@1.push(read props$8.p3) + [8] Const mutate y$13_@4 = Array [] "] bb4_instrs --> bb4_terminal(["Goto"]) end subgraph bb2 bb2_instrs[" - [10] Reassign mutate y$10_@0[1:12] = read x$9_@0 + [10] Reassign mutate y$10_@1[1:12] = read x$9_@1 "] bb2_instrs --> bb2_terminal(["Goto"]) end subgraph bb1 bb1_instrs[" - [12] Const mutate child$19_@4 = JSX - [13] Call read y$10_@0.push(read props$8.p4) - [14] Const mutate $23_@5 = JSX {read child$19_@4} + [12] Const mutate child$19_@5 = JSX + [13] Call read y$10_@1.push(read props$8.p4) + [14] Const mutate $23_@6 = JSX {read child$19_@5} "] - bb1_instrs --> bb1_terminal(["Return read $23_@5"]) + bb1_instrs --> bb1_terminal(["Return read $23_@6"]) end %% Jumps - bb0_terminal -- "read $12_@2" --> bb4 - bb0_terminal -- "read $11_@1" --> bb2 + bb0_terminal -- "read $12_@3" --> bb4 + bb0_terminal -- "read $11_@2" --> bb2 bb0_terminal -- "default" --> bb1 bb0_terminal -- "fallthrough" --> bb1 bb4_terminal --> bb2