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