@samitouri / QOS-React / commits / 3b3107fb3e

Add Mermaid visualizations for CFG into fixtures

This PR adds a new section to fixture tests, which renders the HIR into a visualization using mermaid.js syntax which can then be embedded directly into markdown. The nice thing about the mermaid syntax is that it's quite readable, so if desired we could replace the current basic block textual output with the mermaid block. I'm opting to append it for now and wait for feedback if we want to keep both or replace. To view the graphs in your editor, download an extension that adds mermaid.js support: https://mermaid-js.github.io/mermaid/#/integrations?id=editor-plugins. In vscode you can use this plugin by right clicking on "Open Preview" on any expect.md file. No extra dependencies are required for GitHub which should have builtin support for mermaid in markdown

Lauren Tan committed Nov 10, 2022 at 17:09 UTC 3b3107fb3e335d39287589a37b68495d47862cf3
54 files changed +3175 -3
compiler/forget/src/HIR/VisualizeHIRMermaid.ts new
+180
@@ -0,0 +1,180 @@
1 +import { assertExhaustive } from "../Common/utils";
2 +import { BasicBlock, BlockId, HIRFunction, Terminal } from "./HIR";
3 +import { printInstruction, printPlace } from "./PrintHIR";
4 +
5 +enum MermaidFlowchartDirection {
6 + TopBottom = "TB", // top to bottom
7 + TopDown = "TD", // top-down/ same as top to bottom
8 + BottomTop = "BT", // bottom to top
9 + RightLeft = "RL", // right to left
10 + LeftRight = "LR", // left to right
11 +}
12 +
13 +function indent(str: string, level: number = 1) {
14 + const leadingSpaces = " ".repeat(level * 2);
15 + return str
16 + .split("\n")
17 + .map((line) => `${leadingSpaces}${line}`)
18 + .join("\n");
19 +}
20 +
21 +function printBlockId(id: BlockId): string {
22 + return `bb${id}`;
23 +}
24 +
25 +function printJump(from: BlockId, to: BlockId, label: string | null): string {
26 + const fromId = printBlockId(from);
27 + const toId = printBlockId(to);
28 + if (label != null) {
29 + return `${fromId}_terminal -- ${label} --> ${toId}\n`;
30 + }
31 + return `${fromId}_terminal --> ${toId}\n`;
32 +}
33 +
34 +function visualizeInstructions({ id, instructions }: BasicBlock): string {
35 + return (
36 + `${printBlockId(id)}_instrs["\n` +
37 + indent(
38 + instructions
39 + .map((instr) => printInstruction(instr).replaceAll('"', "'"))
40 + .join("\n"),
41 + 2
42 + ) +
43 + indent('\n"]')
44 + );
45 +}
46 +
47 +function visualizeTerminal(terminal: Terminal) {
48 + let buffer = "";
49 + switch (terminal.kind) {
50 + case "if": {
51 + buffer = buffer.concat(`If (${printPlace(terminal.test)})`);
52 + break;
53 + }
54 + case "goto": {
55 + buffer = buffer.concat("Goto");
56 + break;
57 + }
58 + case "return": {
59 + if (terminal.value != null) {
60 + buffer = buffer.concat(`Return ${printPlace(terminal.value)}`);
61 + } else {
62 + buffer = buffer.concat("Return");
63 + }
64 + break;
65 + }
66 + case "switch":
67 + buffer = buffer.concat(`Switch (${printPlace(terminal.test)})`);
68 + break;
69 + case "throw":
70 + buffer = buffer.concat(`Throw ${printPlace(terminal.value)}`);
71 + break;
72 + case "while":
73 + buffer = buffer.concat("While");
74 + break;
75 + default:
76 + assertExhaustive(terminal, `unhandled terminal ${terminal}`);
77 + }
78 + return buffer;
79 +}
80 +
81 +function visualizeJump(blockId: BlockId, terminal: Terminal): string {
82 + let buffer = "";
83 + switch (terminal.kind) {
84 + case "if": {
85 + buffer = buffer.concat(printJump(blockId, terminal.consequent, "then"));
86 + buffer = buffer.concat(printJump(blockId, terminal.alternate, "else"));
87 + if (
88 + terminal.fallthrough != null &&
89 + terminal.alternate !== terminal.fallthrough
90 + ) {
91 + buffer = buffer.concat(
92 + printJump(blockId, terminal.fallthrough, "fallthrough")
93 + );
94 + }
95 + break;
96 + }
97 + case "goto": {
98 + buffer = buffer.concat(printJump(blockId, terminal.block, null));
99 + break;
100 + }
101 + case "switch": {
102 + terminal.cases.forEach((case_) => {
103 + if (case_.test != null) {
104 + buffer = buffer.concat(
105 + printJump(blockId, case_.block, printPlace(case_.test))
106 + );
107 + } else {
108 + buffer = buffer.concat(printJump(blockId, case_.block, "default"));
109 + }
110 + });
111 + if (terminal.fallthrough != null) {
112 + buffer = buffer.concat(
113 + printJump(blockId, terminal.fallthrough, "fallthrough")
114 + );
115 + }
116 + break;
117 + }
118 + case "while": {
119 + buffer = buffer.concat(printJump(blockId, terminal.test, "test"));
120 + buffer = buffer.concat(printJump(blockId, terminal.loop, "loop"));
121 + buffer = buffer.concat(
122 + printJump(blockId, terminal.fallthrough, "fallthrough")
123 + );
124 + break;
125 + }
126 + case "throw":
127 + case "return": {
128 + break;
129 + }
130 + default:
131 + assertExhaustive(terminal, `unhandled terminal ${terminal}`);
132 + }
133 + return buffer;
134 +}
135 +
136 +/**
137 + * Visualizes the HIR as a mermaid.js diagram.
138 + */
139 +export default function visualizeHIRMermaid(fn: HIRFunction): string {
140 + const ir = fn.body;
141 + const subgraphs = [];
142 + const jumps = [];
143 +
144 + for (const [blockId, block] of ir.blocks) {
145 + let buffer;
146 + const bbId = printBlockId(blockId);
147 + buffer = indent(`subgraph ${bbId}\n`);
148 + if (block.instructions.length > 0) {
149 + buffer = buffer.concat(indent(visualizeInstructions(block)));
150 + buffer = buffer.concat(
151 + indent(
152 + `\n${bbId}_instrs --> ${bbId}_terminal(["${visualizeTerminal(
153 + block.terminal
154 + )}"])`,
155 + 2
156 + )
157 + );
158 + } else {
159 + buffer = buffer.concat(
160 + indent(`${bbId}_terminal(["${visualizeTerminal(block.terminal)}"])`)
161 + );
162 + }
163 + buffer = buffer.concat(indent("\nend\n"));
164 + subgraphs.push(buffer);
165 + }
166 +
167 + for (const [blockId, block] of ir.blocks) {
168 + const jump = visualizeJump(blockId, block.terminal);
169 + if (jump.length > 0) {
170 + jumps.push(indent(jump));
171 + }
172 + }
173 +
174 + return `flowchart ${MermaidFlowchartDirection.TopBottom}
175 + %% Basic Blocks
176 +${subgraphs.length ? subgraphs.join("\n") : " %% empty"}
177 +
178 + %% Jumps
179 +${jumps.length ? jumps.join("\n") : " %% empty"}`;
180 +}
compiler/forget/src/__tests__/fixtures/hir/call.expect.md
+38
@@ -22,6 +22,20 @@ bb0:
22 Return
23 ```
24
25 +### CFG
26 +
27 +```mermaid
28 +flowchart TB
29 + %% Basic Blocks
30 + subgraph bb0
31 + bb0_terminal(["Return"])
32 + end
33 +
34 +
35 + %% Jumps
36 + %% empty
37 +```
38 +
39 ## Code
40
41 ```javascript
@@ -45,6 +59,30 @@ bb0:
59 Return read $15
60 ```
61
62 +### CFG
63 +
64 +```mermaid
65 +flowchart TB
66 + %% Basic Blocks
67 + subgraph bb0
68 + bb0_instrs["
69 + [1] Const mutate a$10[1:3] = Array []
70 + [2] Const mutate b$11[2:6] = Object { }
71 + [3] Call mutate foo$4(mutate a$10, mutate b$11)
72 + [4] Const mutate $12 = 'div'
73 + [5] Let mutate _$13 = JSX <read $12 a={freeze a$10} ></read $12>
74 + [6] Call mutate foo$4(mutate b$11)
75 + [7] Const mutate $14 = 'div'
76 + [8] Const mutate $15 = JSX <read $14 a={read a$10} b={freeze b$11} ></read $14>
77 + "]
78 + bb0_instrs --> bb0_terminal(["Return read $15"])
79 + end
80 +
81 +
82 + %% Jumps
83 + %% empty
84 +```
85 +
86 ## Code
87
88 ```javascript
compiler/forget/src/__tests__/fixtures/hir/complex-while.expect.md
+48
@@ -36,6 +36,54 @@ bb1:
36 Return
37 ```
38
39 +### CFG
40 +
41 +```mermaid
42 +flowchart TB
43 + %% Basic Blocks
44 + subgraph bb0
45 + bb0_terminal(["If (read a$4)"])
46 + end
47 +
48 + subgraph bb3
49 + bb3_terminal(["While"])
50 + end
51 +
52 + subgraph bb4
53 + bb4_terminal(["If (read b$5)"])
54 + end
55 +
56 + subgraph bb6
57 + bb6_terminal(["If (read c$6)"])
58 + end
59 +
60 + subgraph bb7
61 + bb7_terminal(["Goto"])
62 + end
63 +
64 + subgraph bb1
65 + bb1_terminal(["Return"])
66 + end
67 +
68 +
69 + %% Jumps
70 + bb0_terminal -- then --> bb3
71 + bb0_terminal -- else --> bb1
72 +
73 + bb3_terminal -- test --> bb4
74 + bb3_terminal -- loop --> bb6
75 + bb3_terminal -- fallthrough --> bb1
76 +
77 + bb4_terminal -- then --> bb6
78 + bb4_terminal -- else --> bb1
79 +
80 + bb6_terminal -- then --> bb1
81 + bb6_terminal -- else --> bb7
82 +
83 + bb7_terminal --> bb4
84 +
85 +```
86 +
87 ## Code
88
89 ```javascript
compiler/forget/src/__tests__/fixtures/hir/component.expect.md
+108
@@ -89,6 +89,114 @@ bb2:
89 Return read $60
90 ```
91
92 +### CFG
93 +
94 +```mermaid
95 +flowchart TB
96 + %% Basic Blocks
97 + subgraph bb0
98 + bb0_instrs["
99 + [1] Const mutate items$27 = read props$26.items
100 + [2] Const mutate maxItems$28 = read props$26.maxItems
101 + [3] Const mutate renderedItems$29[3:14] = Array []
102 + [4] Const mutate seen$30[4:11] = New mutate Set$6()
103 + [5] Const mutate $31 = 0
104 + [6] Const mutate max$32 = Call mutate Math$8.max(read $31, read maxItems$28)
105 + "]
106 + bb0_instrs --> bb0_terminal(["Goto"])
107 + end
108 +
109 + subgraph bb1
110 + bb1_terminal(["If (read items$27)"])
111 + end
112 +
113 + subgraph bb3
114 + bb3_instrs["
115 + [7] Const mutate $34 = null
116 + [8] Const mutate $36 = Binary read item$10 == read $34
117 + "]
118 + bb3_instrs --> bb3_terminal(["If (read $36)"])
119 + end
120 +
121 + subgraph bb8
122 + bb8_instrs["
123 + [9] Const mutate $13 = read $36
124 + "]
125 + bb8_instrs --> bb8_terminal(["Goto"])
126 + end
127 +
128 + subgraph bb9
129 + bb9_instrs["
130 + [10] Const mutate $13 = Call mutate seen$30.has(mutate item$10)
131 + "]
132 + bb9_instrs --> bb9_terminal(["Goto"])
133 + end
134 +
135 + subgraph bb7
136 + bb7_terminal(["If (read $13)"])
137 + end
138 +
139 + subgraph bb5
140 + bb5_terminal(["Goto"])
141 + end
142 +
143 + subgraph bb4
144 + bb4_instrs["
145 + [11] Call mutate seen$30.add(mutate item$10)
146 + [12] Const mutate $43 = 'div'
147 + [13] Const mutate $44 = JSX <read $43>{read item$10}</read $43>
148 + [14] Call mutate renderedItems$29.push(read $44)
149 + [15] Const mutate $49 = Binary read renderedItems$29.length >= read max$32
150 + "]
151 + bb4_instrs --> bb4_terminal(["If (read $49)"])
152 + end
153 +
154 + subgraph bb10
155 + bb10_terminal(["Goto"])
156 + end
157 +
158 + subgraph bb2
159 + bb2_instrs["
160 + [16] Const mutate count$52 = read renderedItems$29.length
161 + [17] Const mutate $53 = 'div'
162 + [18] Const mutate $54 = '\n '
163 + [19] Const mutate $55 = 'h1'
164 + [20] Const mutate $56 = ' Items'
165 + [21] Const mutate $57 = JSX <read $55>{freeze count$52}{read $56}</read $55>
166 + [22] Const mutate $58 = '\n '
167 + [23] Const mutate $59 = '\n '
168 + [24] Const mutate $60 = JSX <read $53>{read $54}{read $57}{read $58}{freeze renderedItems$29}{read $59}</read $53>
169 + "]
170 + bb2_instrs --> bb2_terminal(["Return read $60"])
171 + end
172 +
173 +
174 + %% Jumps
175 + bb0_terminal --> bb1
176 +
177 + bb1_terminal -- then --> bb3
178 + bb1_terminal -- else --> bb2
179 +
180 + bb3_terminal -- then --> bb8
181 + bb3_terminal -- else --> bb9
182 + bb3_terminal -- fallthrough --> bb7
183 +
184 + bb8_terminal --> bb7
185 +
186 + bb9_terminal --> bb7
187 +
188 + bb7_terminal -- then --> bb5
189 + bb7_terminal -- else --> bb4
190 +
191 + bb5_terminal --> bb1
192 +
193 + bb4_terminal -- then --> bb2
194 + bb4_terminal -- else --> bb10
195 +
196 + bb10_terminal --> bb1
197 +
198 +```
199 +
200 ## Code
201
202 ```javascript
compiler/forget/src/__tests__/fixtures/hir/conditional-break.expect.md
+175
@@ -91,6 +91,40 @@ bb1:
91 Return freeze a_DEBUG$5
92 ```
93
94 +### CFG
95 +
96 +```mermaid
97 +flowchart TB
98 + %% Basic Blocks
99 + subgraph bb0
100 + bb0_instrs["
101 + [1] Const mutate a_DEBUG$5[1:4] = Array []
102 + [2] Call mutate a_DEBUG$5.push(read props$4.a)
103 + "]
104 + bb0_instrs --> bb0_terminal(["If (read props$4.b)"])
105 + end
106 +
107 + subgraph bb2
108 + bb2_instrs["
109 + [3] Const mutate $6 = null
110 + "]
111 + bb2_instrs --> bb2_terminal(["Return read $6"])
112 + end
113 +
114 + subgraph bb1
115 + bb1_instrs["
116 + [4] Call mutate a_DEBUG$5.push(read props$4.d)
117 + "]
118 + bb1_instrs --> bb1_terminal(["Return freeze a_DEBUG$5"])
119 + end
120 +
121 +
122 + %% Jumps
123 + bb0_terminal -- then --> bb2
124 + bb0_terminal -- else --> bb1
125 +
126 +```
127 +
128 ## Code
129
130 ```javascript
@@ -123,6 +157,42 @@ bb1:
157 Return freeze a$4
158 ```
159
160 +### CFG
161 +
162 +```mermaid
163 +flowchart TB
164 + %% Basic Blocks
165 + subgraph bb0
166 + bb0_instrs["
167 + [1] Const mutate a$4[1:4] = Array []
168 + [2] Call mutate a$4.push(read props$3.a)
169 + "]
170 + bb0_instrs --> bb0_terminal(["If (read props$3.b)"])
171 + end
172 +
173 + subgraph bb2
174 + bb2_instrs["
175 + [3] Call mutate a$4.push(read props$3.c)
176 + "]
177 + bb2_instrs --> bb2_terminal(["Goto"])
178 + end
179 +
180 + subgraph bb1
181 + bb1_instrs["
182 + [4] Call mutate a$4.push(read props$3.d)
183 + "]
184 + bb1_instrs --> bb1_terminal(["Return freeze a$4"])
185 + end
186 +
187 +
188 + %% Jumps
189 + bb0_terminal -- then --> bb2
190 + bb0_terminal -- else --> bb1
191 +
192 + bb2_terminal --> bb1
193 +
194 +```
195 +
196 ## Code
197
198 ```javascript
@@ -156,6 +226,41 @@ bb1:
226 Return freeze a$5
227 ```
228
229 +### CFG
230 +
231 +```mermaid
232 +flowchart TB
233 + %% Basic Blocks
234 + subgraph bb0
235 + bb0_instrs["
236 + [1] Const mutate a$5[1:5] = Array []
237 + [2] Call mutate a$5.push(read props$4.a)
238 + "]
239 + bb0_instrs --> bb0_terminal(["If (read props$4.b)"])
240 + end
241 +
242 + subgraph bb2
243 + bb2_instrs["
244 + [3] Call mutate a$5.push(read props$4.c)
245 + [4] Const mutate $6 = null
246 + "]
247 + bb2_instrs --> bb2_terminal(["Return read $6"])
248 + end
249 +
250 + subgraph bb1
251 + bb1_instrs["
252 + [5] Call mutate a$5.push(read props$4.d)
253 + "]
254 + bb1_instrs --> bb1_terminal(["Return freeze a$5"])
255 + end
256 +
257 +
258 + %% Jumps
259 + bb0_terminal -- then --> bb2
260 + bb0_terminal -- else --> bb1
261 +
262 +```
263 +
264 ## Code
265
266 ```javascript
@@ -189,6 +294,40 @@ bb1:
294 Return freeze a$4
295 ```
296
297 +### CFG
298 +
299 +```mermaid
300 +flowchart TB
301 + %% Basic Blocks
302 + subgraph bb0
303 + bb0_instrs["
304 + [1] Const mutate a$4[1:4] = Array []
305 + [2] Call mutate a$4.push(read props$3.a)
306 + "]
307 + bb0_instrs --> bb0_terminal(["If (read props$3.b)"])
308 + end
309 +
310 + subgraph bb2
311 + bb2_instrs["
312 + [3] Call mutate a$4.push(read props$3.c)
313 + "]
314 + bb2_instrs --> bb2_terminal(["Return freeze a$4"])
315 + end
316 +
317 + subgraph bb1
318 + bb1_instrs["
319 + [4] Call mutate a$4.push(read props$3.d)
320 + "]
321 + bb1_instrs --> bb1_terminal(["Return freeze a$4"])
322 + end
323 +
324 +
325 + %% Jumps
326 + bb0_terminal -- then --> bb2
327 + bb0_terminal -- else --> bb1
328 +
329 +```
330 +
331 ## Code
332
333 ```javascript
@@ -222,6 +361,42 @@ bb1:
361 Return freeze a$4
362 ```
363
364 +### CFG
365 +
366 +```mermaid
367 +flowchart TB
368 + %% Basic Blocks
369 + subgraph bb0
370 + bb0_instrs["
371 + [1] Const mutate a$4[1:4] = Array []
372 + [2] Call mutate a$4.push(read props$3.a)
373 + "]
374 + bb0_instrs --> bb0_terminal(["If (read props$3.b)"])
375 + end
376 +
377 + subgraph bb2
378 + bb2_instrs["
379 + [3] Call mutate a$4.push(read props$3.c)
380 + "]
381 + bb2_instrs --> bb2_terminal(["Goto"])
382 + end
383 +
384 + subgraph bb1
385 + bb1_instrs["
386 + [4] Call mutate a$4.push(read props$3.d)
387 + "]
388 + bb1_instrs --> bb1_terminal(["Return freeze a$4"])
389 + end
390 +
391 +
392 + %% Jumps
393 + bb0_terminal -- then --> bb1
394 + bb0_terminal -- else --> bb2
395 +
396 + bb2_terminal --> bb1
397 +
398 +```
399 +
400 ## Code
401
402 ```javascript
compiler/forget/src/__tests__/fixtures/hir/conditional-on-mutable.expect.md
+133
@@ -87,6 +87,58 @@ bb3:
87 Return read $16
88 ```
89
90 +### CFG
91 +
92 +```mermaid
93 +flowchart TB
94 + %% Basic Blocks
95 + subgraph bb0
96 + bb0_instrs["
97 + [1] Const mutate a$7[1:3] = Array []
98 + [2] Const mutate b$8[2:4] = Array []
99 + "]
100 + bb0_instrs --> bb0_terminal(["If (read b$8)"])
101 + end
102 +
103 + subgraph bb2
104 + bb2_instrs["
105 + [3] Call mutate a$7.push(read props$6.p0)
106 + "]
107 + bb2_instrs --> bb2_terminal(["Goto"])
108 + end
109 +
110 + subgraph bb1
111 + bb1_terminal(["If (read props$6.p1)"])
112 + end
113 +
114 + subgraph bb4
115 + bb4_instrs["
116 + [4] Call mutate b$8.push(read props$6.p2)
117 + "]
118 + bb4_instrs --> bb4_terminal(["Goto"])
119 + end
120 +
121 + subgraph bb3
122 + bb3_instrs["
123 + [5] Const mutate $16 = JSX <read Foo$4 a={freeze a$7} b={freeze b$8} ></read Foo$4>
124 + "]
125 + bb3_instrs --> bb3_terminal(["Return read $16"])
126 + end
127 +
128 +
129 + %% Jumps
130 + bb0_terminal -- then --> bb2
131 + bb0_terminal -- else --> bb1
132 +
133 + bb2_terminal --> bb1
134 +
135 + bb1_terminal -- then --> bb4
136 + bb1_terminal -- else --> bb3
137 +
138 + bb4_terminal --> bb3
139 +
140 +```
141 +
142 ## Code
143
144 ```javascript
@@ -130,6 +182,59 @@ bb3:
182 Return read $19
183 ```
184
185 +### CFG
186 +
187 +```mermaid
188 +flowchart TB
189 + %% Basic Blocks
190 + subgraph bb0
191 + bb0_instrs["
192 + [1] Const mutate a$9[1:4] = Array []
193 + [2] Const mutate b$10[2:5] = Array []
194 + [3] Const mutate $11 = Call mutate mayMutate$4(mutate b$10)
195 + "]
196 + bb0_instrs --> bb0_terminal(["If (read $11)"])
197 + end
198 +
199 + subgraph bb2
200 + bb2_instrs["
201 + [4] Call mutate a$9.push(read props$8.p0)
202 + "]
203 + bb2_instrs --> bb2_terminal(["Goto"])
204 + end
205 +
206 + subgraph bb1
207 + bb1_terminal(["If (read props$8.p1)"])
208 + end
209 +
210 + subgraph bb4
211 + bb4_instrs["
212 + [5] Call mutate b$10.push(read props$8.p2)
213 + "]
214 + bb4_instrs --> bb4_terminal(["Goto"])
215 + end
216 +
217 + subgraph bb3
218 + bb3_instrs["
219 + [6] Const mutate $19 = JSX <read Foo$6 a={freeze a$9} b={freeze b$10} ></read Foo$6>
220 + "]
221 + bb3_instrs --> bb3_terminal(["Return read $19"])
222 + end
223 +
224 +
225 + %% Jumps
226 + bb0_terminal -- then --> bb2
227 + bb0_terminal -- else --> bb1
228 +
229 + bb2_terminal --> bb1
230 +
231 + bb1_terminal -- then --> bb4
232 + bb1_terminal -- else --> bb3
233 +
234 + bb4_terminal --> bb3
235 +
236 +```
237 +
238 ## Code
239
240 ```javascript
@@ -155,6 +260,20 @@ bb0:
260 Return
261 ```
262
263 +### CFG
264 +
265 +```mermaid
266 +flowchart TB
267 + %% Basic Blocks
268 + subgraph bb0
269 + bb0_terminal(["Return"])
270 + end
271 +
272 +
273 + %% Jumps
274 + %% empty
275 +```
276 +
277 ## Code
278
279 ```javascript
@@ -170,6 +289,20 @@ bb0:
289 Return
290 ```
291
292 +### CFG
293 +
294 +```mermaid
295 +flowchart TB
296 + %% Basic Blocks
297 + subgraph bb0
298 + bb0_terminal(["Return"])
299 + end
300 +
301 +
302 + %% Jumps
303 + %% empty
304 +```
305 +
306 ## Code
307
308 ```javascript
compiler/forget/src/__tests__/fixtures/hir/constructor.expect.md
+38
@@ -22,6 +22,20 @@ bb0:
22 Return
23 ```
24
25 +### CFG
26 +
27 +```mermaid
28 +flowchart TB
29 + %% Basic Blocks
30 + subgraph bb0
31 + bb0_terminal(["Return"])
32 + end
33 +
34 +
35 + %% Jumps
36 + %% empty
37 +```
38 +
39 ## Code
40
41 ```javascript
@@ -45,6 +59,30 @@ bb0:
59 Return read $15
60 ```
61
62 +### CFG
63 +
64 +```mermaid
65 +flowchart TB
66 + %% Basic Blocks
67 + subgraph bb0
68 + bb0_instrs["
69 + [1] Const mutate a$10[1:3] = Array []
70 + [2] Const mutate b$11[2:6] = Object { }
71 + [3] New mutate Foo$4(mutate a$10, mutate b$11)
72 + [4] Const mutate $12 = 'div'
73 + [5] Let mutate _$13 = JSX <read $12 a={freeze a$10} ></read $12>
74 + [6] New mutate Foo$4(mutate b$11)
75 + [7] Const mutate $14 = 'div'
76 + [8] Const mutate $15 = JSX <read $14 a={read a$10} b={freeze b$11} ></read $14>
77 + "]
78 + bb0_instrs --> bb0_terminal(["Return read $15"])
79 + end
80 +
81 +
82 + %% Jumps
83 + %% empty
84 +```
85 +
86 ## Code
87
88 ```javascript
compiler/forget/src/__tests__/fixtures/hir/frozen-after-alias.expect.md
+48
@@ -25,6 +25,26 @@ bb0:
25 Return
26 ```
27
28 +### CFG
29 +
30 +```mermaid
31 +flowchart TB
32 + %% Basic Blocks
33 + subgraph bb0
34 + bb0_instrs["
35 + [1] Const mutate a$5 = Array []
36 + [2] Const mutate b$6 = read a$5
37 + [3] Call read useFreeze$3(freeze a$5)
38 + [4] Call mutate foo$4(read b$6)
39 + "]
40 + bb0_instrs --> bb0_terminal(["Return"])
41 + end
42 +
43 +
44 + %% Jumps
45 + %% empty
46 +```
47 +
48 ## Code
49
50 ```javascript
@@ -44,6 +64,20 @@ bb0:
64 Return
65 ```
66
67 +### CFG
68 +
69 +```mermaid
70 +flowchart TB
71 + %% Basic Blocks
72 + subgraph bb0
73 + bb0_terminal(["Return"])
74 + end
75 +
76 +
77 + %% Jumps
78 + %% empty
79 +```
80 +
81 ## Code
82
83 ```javascript
@@ -59,6 +93,20 @@ bb0:
93 Return
94 ```
95
96 +### CFG
97 +
98 +```mermaid
99 +flowchart TB
100 + %% Basic Blocks
101 + subgraph bb0
102 + bb0_terminal(["Return"])
103 + end
104 +
105 +
106 + %% Jumps
107 + %% empty
108 +```
109 +
110 ## Code
111
112 ```javascript
compiler/forget/src/__tests__/fixtures/hir/hook-call.expect.md
+51
@@ -26,6 +26,20 @@ bb0:
26 Return
27 ```
28
29 +### CFG
30 +
31 +```mermaid
32 +flowchart TB
33 + %% Basic Blocks
34 + subgraph bb0
35 + bb0_terminal(["Return"])
36 + end
37 +
38 +
39 + %% Jumps
40 + %% empty
41 +```
42 +
43 ## Code
44
45 ```javascript
@@ -41,6 +55,20 @@ bb0:
55 Return
56 ```
57
58 +### CFG
59 +
60 +```mermaid
61 +flowchart TB
62 + %% Basic Blocks
63 + subgraph bb0
64 + bb0_terminal(["Return"])
65 + end
66 +
67 +
68 + %% Jumps
69 + %% empty
70 +```
71 +
72 ## Code
73
74 ```javascript
@@ -63,6 +91,29 @@ bb0:
91 Return read $16
92 ```
93
94 +### CFG
95 +
96 +```mermaid
97 +flowchart TB
98 + %% Basic Blocks
99 + subgraph bb0
100 + bb0_instrs["
101 + [1] Const mutate x$11 = Array []
102 + [2] Const mutate y$12 = Call read useFreeze$4(freeze x$11)
103 + [3] Call mutate foo$5(read y$12, read x$11)
104 + [4] Const mutate $13 = '\n '
105 + [5] Const mutate $14 = '\n '
106 + [6] Const mutate $15 = '\n '
107 + [7] Const mutate $16 = JSX <read Component$0>{read $13}{read x$11}{read $14}{read y$12}{read $15}</read Component$0>
108 + "]
109 + bb0_instrs --> bb0_terminal(["Return read $16"])
110 + end
111 +
112 +
113 + %% Jumps
114 + %% empty
115 +```
116 +
117 ## Code
118
119 ```javascript
compiler/forget/src/__tests__/fixtures/hir/hooks-freeze-arguments.expect.md
+48
@@ -26,6 +26,26 @@ bb0:
26 Return read a$4
27 ```
28
29 +### CFG
30 +
31 +```mermaid
32 +flowchart TB
33 + %% Basic Blocks
34 + subgraph bb0
35 + bb0_instrs["
36 + [1] Const mutate a$4 = Array []
37 + [2] Call read useFreeze$2(freeze a$4)
38 + [3] Call read useFreeze$2(read a$4)
39 + [4] Call mutate call$3(read a$4)
40 + "]
41 + bb0_instrs --> bb0_terminal(["Return read a$4"])
42 + end
43 +
44 +
45 + %% Jumps
46 + %% empty
47 +```
48 +
49 ## Code
50
51 ```javascript
@@ -45,6 +65,20 @@ bb0:
65 Return
66 ```
67
68 +### CFG
69 +
70 +```mermaid
71 +flowchart TB
72 + %% Basic Blocks
73 + subgraph bb0
74 + bb0_terminal(["Return"])
75 + end
76 +
77 +
78 + %% Jumps
79 + %% empty
80 +```
81 +
82 ## Code
83
84 ```javascript
@@ -60,6 +94,20 @@ bb0:
94 Return
95 ```
96
97 +### CFG
98 +
99 +```mermaid
100 +flowchart TB
101 + %% Basic Blocks
102 + subgraph bb0
103 + bb0_terminal(["Return"])
104 + end
105 +
106 +
107 + %% Jumps
108 + %% empty
109 +```
110 +
111 ## Code
112
113 ```javascript
compiler/forget/src/__tests__/fixtures/hir/hooks-freeze-possibly-mutable-arguments.expect.md
+77
@@ -46,6 +46,55 @@ bb1:
46 Return read a$4
47 ```
48
49 +### CFG
50 +
51 +```mermaid
52 +flowchart TB
53 + %% Basic Blocks
54 + subgraph bb0
55 + bb0_instrs["
56 + [1] Const mutate cond$8 = read props$7.cond
57 + [2] Const mutate x$9 = read props$7.x
58 + [3] Let mutate a$10 = undefined
59 + "]
60 + bb0_instrs --> bb0_terminal(["If (read cond$8)"])
61 + end
62 +
63 + subgraph bb2
64 + bb2_instrs["
65 + [4] Reassign mutate a$4 = read x$9
66 + "]
67 + bb2_instrs --> bb2_terminal(["Goto"])
68 + end
69 +
70 + subgraph bb3
71 + bb3_instrs["
72 + [5] Reassign mutate a$4 = Array []
73 + "]
74 + bb3_instrs --> bb3_terminal(["Goto"])
75 + end
76 +
77 + subgraph bb1
78 + bb1_instrs["
79 + [6] Call read useFreeze$5(freeze a$4)
80 + [7] Call read useFreeze$5(read a$4)
81 + [8] Call mutate call$6(read a$4)
82 + "]
83 + bb1_instrs --> bb1_terminal(["Return read a$4"])
84 + end
85 +
86 +
87 + %% Jumps
88 + bb0_terminal -- then --> bb2
89 + bb0_terminal -- else --> bb3
90 + bb0_terminal -- fallthrough --> bb1
91 +
92 + bb2_terminal --> bb1
93 +
94 + bb3_terminal --> bb1
95 +
96 +```
97 +
98 ## Code
99
100 ```javascript
@@ -73,6 +122,20 @@ bb0:
122 Return
123 ```
124
125 +### CFG
126 +
127 +```mermaid
128 +flowchart TB
129 + %% Basic Blocks
130 + subgraph bb0
131 + bb0_terminal(["Return"])
132 + end
133 +
134 +
135 + %% Jumps
136 + %% empty
137 +```
138 +
139 ## Code
140
141 ```javascript
@@ -88,6 +151,20 @@ bb0:
151 Return
152 ```
153
154 +### CFG
155 +
156 +```mermaid
157 +flowchart TB
158 + %% Basic Blocks
159 + subgraph bb0
160 + bb0_terminal(["Return"])
161 + end
162 +
163 +
164 + %% Jumps
165 + %% empty
166 +```
167 +
168 ## Code
169
170 ```javascript
compiler/forget/src/__tests__/fixtures/hir/independent-across-if.expect.md
+93
@@ -40,6 +40,20 @@ bb0:
40 Return
41 ```
42
43 +### CFG
44 +
45 +```mermaid
46 +flowchart TB
47 + %% Basic Blocks
48 + subgraph bb0
49 + bb0_terminal(["Return"])
50 + end
51 +
52 +
53 + %% Jumps
54 + %% empty
55 +```
56 +
57 ## Code
58
59 ```javascript
@@ -55,6 +69,20 @@ bb0:
69 Return
70 ```
71
72 +### CFG
73 +
74 +```mermaid
75 +flowchart TB
76 + %% Basic Blocks
77 + subgraph bb0
78 + bb0_terminal(["Return"])
79 + end
80 +
81 +
82 + %% Jumps
83 + %% empty
84 +```
85 +
86 ## Code
87
88 ```javascript
@@ -70,6 +98,20 @@ bb0:
98 Return
99 ```
100
101 +### CFG
102 +
103 +```mermaid
104 +flowchart TB
105 + %% Basic Blocks
106 + subgraph bb0
107 + bb0_terminal(["Return"])
108 + end
109 +
110 +
111 + %% Jumps
112 + %% empty
113 +```
114 +
115 ## Code
116
117 ```javascript
@@ -85,6 +127,20 @@ bb0:
127 Return
128 ```
129
130 +### CFG
131 +
132 +```mermaid
133 +flowchart TB
134 + %% Basic Blocks
135 + subgraph bb0
136 + bb0_terminal(["Return"])
137 + end
138 +
139 +
140 + %% Jumps
141 + %% empty
142 +```
143 +
144 ## Code
145
146 ```javascript
@@ -111,6 +167,43 @@ bb1:
167 Return read $14
168 ```
169
170 +### CFG
171 +
172 +```mermaid
173 +flowchart TB
174 + %% Basic Blocks
175 + subgraph bb0
176 + bb0_instrs["
177 + [1] Const mutate a$9[1:3] = Call mutate compute$3(read props$8.a)
178 + [2] Const mutate b$10[2:4] = Call mutate compute$3(read props$8.b)
179 + "]
180 + bb0_instrs --> bb0_terminal(["If (read props$8.c)"])
181 + end
182 +
183 + subgraph bb2
184 + bb2_instrs["
185 + [3] Call mutate mutate$5(mutate a$9)
186 + [4] Call mutate mutate$5(mutate b$10)
187 + "]
188 + bb2_instrs --> bb2_terminal(["Goto"])
189 + end
190 +
191 + subgraph bb1
192 + bb1_instrs["
193 + [5] Const mutate $14 = JSX <read Foo$6 a={freeze a$9} b={freeze b$10} ></read Foo$6>
194 + "]
195 + bb1_instrs --> bb1_terminal(["Return read $14"])
196 + end
197 +
198 +
199 + %% Jumps
200 + bb0_terminal -- then --> bb2
201 + bb0_terminal -- else --> bb1
202 +
203 + bb2_terminal --> bb1
204 +
205 +```
206 +
207 ## Code
208
209 ```javascript
compiler/forget/src/__tests__/fixtures/hir/independent.expect.md
+61
@@ -34,6 +34,25 @@ bb0:
34 Return read $10
35 ```
36
37 +### CFG
38 +
39 +```mermaid
40 +flowchart TB
41 + %% Basic Blocks
42 + subgraph bb0
43 + bb0_instrs["
44 + [1] Const mutate a$8 = Call mutate compute$3(read props$7.a)
45 + [2] Const mutate b$9 = Call mutate compute$3(read props$7.b)
46 + [3] Const mutate $10 = JSX <read Foo$5 a={freeze a$8} b={freeze b$9} ></read Foo$5>
47 + "]
48 + bb0_instrs --> bb0_terminal(["Return read $10"])
49 + end
50 +
51 +
52 + %% Jumps
53 + %% empty
54 +```
55 +
56 ## Code
57
58 ```javascript
@@ -51,6 +70,20 @@ bb0:
70 Return
71 ```
72
73 +### CFG
74 +
75 +```mermaid
76 +flowchart TB
77 + %% Basic Blocks
78 + subgraph bb0
79 + bb0_terminal(["Return"])
80 + end
81 +
82 +
83 + %% Jumps
84 + %% empty
85 +```
86 +
87 ## Code
88
89 ```javascript
@@ -66,6 +99,20 @@ bb0:
99 Return
100 ```
101
102 +### CFG
103 +
104 +```mermaid
105 +flowchart TB
106 + %% Basic Blocks
107 + subgraph bb0
108 + bb0_terminal(["Return"])
109 + end
110 +
111 +
112 + %% Jumps
113 + %% empty
114 +```
115 +
116 ## Code
117
118 ```javascript
@@ -81,6 +128,20 @@ bb0:
128 Return
129 ```
130
131 +### CFG
132 +
133 +```mermaid
134 +flowchart TB
135 + %% Basic Blocks
136 + subgraph bb0
137 + bb0_terminal(["Return"])
138 + end
139 +
140 +
141 + %% Jumps
142 + %% empty
143 +```
144 +
145 ## Code
146
147 ```javascript
compiler/forget/src/__tests__/fixtures/hir/interdependent-across-if.expect.md
+78
@@ -34,6 +34,20 @@ bb0:
34 Return
35 ```
36
37 +### CFG
38 +
39 +```mermaid
40 +flowchart TB
41 + %% Basic Blocks
42 + subgraph bb0
43 + bb0_terminal(["Return"])
44 + end
45 +
46 +
47 + %% Jumps
48 + %% empty
49 +```
50 +
51 ## Code
52
53 ```javascript
@@ -49,6 +63,20 @@ bb0:
63 Return
64 ```
65
66 +### CFG
67 +
68 +```mermaid
69 +flowchart TB
70 + %% Basic Blocks
71 + subgraph bb0
72 + bb0_terminal(["Return"])
73 + end
74 +
75 +
76 + %% Jumps
77 + %% empty
78 +```
79 +
80 ## Code
81
82 ```javascript
@@ -64,6 +92,20 @@ bb0:
92 Return
93 ```
94
95 +### CFG
96 +
97 +```mermaid
98 +flowchart TB
99 + %% Basic Blocks
100 + subgraph bb0
101 + bb0_terminal(["Return"])
102 + end
103 +
104 +
105 + %% Jumps
106 + %% empty
107 +```
108 +
109 ## Code
110
111 ```javascript
@@ -89,6 +131,42 @@ bb1:
131 Return read $14
132 ```
133
134 +### CFG
135 +
136 +```mermaid
137 +flowchart TB
138 + %% Basic Blocks
139 + subgraph bb0
140 + bb0_instrs["
141 + [1] Const mutate a$9[1:3] = Call mutate compute$3(read props$8.a)
142 + [2] Const mutate b$10[2:3] = Call mutate compute$3(read props$8.b)
143 + "]
144 + bb0_instrs --> bb0_terminal(["If (read props$8.c)"])
145 + end
146 +
147 + subgraph bb2
148 + bb2_instrs["
149 + [3] Call mutate foo$5(mutate a$9, mutate b$10)
150 + "]
151 + bb2_instrs --> bb2_terminal(["Goto"])
152 + end
153 +
154 + subgraph bb1
155 + bb1_instrs["
156 + [4] Const mutate $14 = JSX <read Foo$6 a={freeze a$9} b={freeze b$10} ></read Foo$6>
157 + "]
158 + bb1_instrs --> bb1_terminal(["Return read $14"])
159 + end
160 +
161 +
162 + %% Jumps
163 + bb0_terminal -- then --> bb2
164 + bb0_terminal -- else --> bb1
165 +
166 + bb2_terminal --> bb1
167 +
168 +```
169 +
170 ## Code
171
172 ```javascript
compiler/forget/src/__tests__/fixtures/hir/interdependent.expect.md
+62
@@ -35,6 +35,26 @@ bb0:
35 Return read $11
36 ```
37
38 +### CFG
39 +
40 +```mermaid
41 +flowchart TB
42 + %% Basic Blocks
43 + subgraph bb0
44 + bb0_instrs["
45 + [1] Const mutate a$9[1:3] = Call mutate compute$3(read props$8.a)
46 + [2] Const mutate b$10[2:3] = Call mutate compute$3(read props$8.b)
47 + [3] Call mutate foo$5(mutate a$9, mutate b$10)
48 + [4] Const mutate $11 = JSX <read Foo$6 a={freeze a$9} b={freeze b$10} ></read Foo$6>
49 + "]
50 + bb0_instrs --> bb0_terminal(["Return read $11"])
51 + end
52 +
53 +
54 + %% Jumps
55 + %% empty
56 +```
57 +
58 ## Code
59
60 ```javascript
@@ -53,6 +73,20 @@ bb0:
73 Return
74 ```
75
76 +### CFG
77 +
78 +```mermaid
79 +flowchart TB
80 + %% Basic Blocks
81 + subgraph bb0
82 + bb0_terminal(["Return"])
83 + end
84 +
85 +
86 + %% Jumps
87 + %% empty
88 +```
89 +
90 ## Code
91
92 ```javascript
@@ -68,6 +102,20 @@ bb0:
102 Return
103 ```
104
105 +### CFG
106 +
107 +```mermaid
108 +flowchart TB
109 + %% Basic Blocks
110 + subgraph bb0
111 + bb0_terminal(["Return"])
112 + end
113 +
114 +
115 + %% Jumps
116 + %% empty
117 +```
118 +
119 ## Code
120
121 ```javascript
@@ -83,6 +131,20 @@ bb0:
131 Return
132 ```
133
134 +### CFG
135 +
136 +```mermaid
137 +flowchart TB
138 + %% Basic Blocks
139 + subgraph bb0
140 + bb0_terminal(["Return"])
141 + end
142 +
143 +
144 + %% Jumps
145 + %% empty
146 +```
147 +
148 ## Code
149
150 ```javascript
compiler/forget/src/__tests__/fixtures/hir/jsx-fragment.expect.md
+27
@@ -33,6 +33,33 @@ bb0:
33 Return read $24
34 ```
35
36 +### CFG
37 +
38 +```mermaid
39 +flowchart TB
40 + %% Basic Blocks
41 + subgraph bb0
42 + bb0_instrs["
43 + [1] Const mutate $14 = '\n Hello '
44 + [2] Const mutate $15 = ' '
45 + [3] Const mutate $16 = '\n '
46 + [4] Const mutate $17 = 'div'
47 + [5] Const mutate $18 = '\n '
48 + [6] Const mutate $19 = 'Text'
49 + [7] Const mutate $20 = JsxFragment [read $19]
50 + [8] Const mutate $21 = '\n '
51 + [9] Const mutate $22 = JSX <read $17>{read $18}{read $20}{read $21}</read $17>
52 + [10] Const mutate $23 = '\n '
53 + [11] Const mutate $24 = JsxFragment [read $14, read props$13.greeting, read $15, read $16, read $22, read $23]
54 + "]
55 + bb0_instrs --> bb0_terminal(["Return read $24"])
56 + end
57 +
58 +
59 + %% Jumps
60 + %% empty
61 +```
62 +
63 ## Code
64
65 ```javascript
compiler/forget/src/__tests__/fixtures/hir/logical-expression.expect.md
+156
@@ -38,6 +38,48 @@ bb1:
38 Return freeze $3
39 ```
40
41 +### CFG
42 +
43 +```mermaid
44 +flowchart TB
45 + %% Basic Blocks
46 + subgraph bb0
47 + bb0_instrs["
48 + [1] Const mutate $5 = Call mutate f$1()
49 + "]
50 + bb0_instrs --> bb0_terminal(["If (read $5)"])
51 + end
52 +
53 + subgraph bb2
54 + bb2_instrs["
55 + [2] Const mutate $3 = Call mutate g$4()
56 + "]
57 + bb2_instrs --> bb2_terminal(["Goto"])
58 + end
59 +
60 + subgraph bb3
61 + bb3_instrs["
62 + [3] Const mutate $3 = read $5
63 + "]
64 + bb3_instrs --> bb3_terminal(["Goto"])
65 + end
66 +
67 + subgraph bb1
68 + bb1_terminal(["Return freeze $3"])
69 + end
70 +
71 +
72 + %% Jumps
73 + bb0_terminal -- then --> bb2
74 + bb0_terminal -- else --> bb3
75 + bb0_terminal -- fallthrough --> bb1
76 +
77 + bb2_terminal --> bb1
78 +
79 + bb3_terminal --> bb1
80 +
81 +```
82 +
83 ## Code
84
85 ```javascript
@@ -68,6 +110,48 @@ bb1:
110 Return freeze $3
111 ```
112
113 +### CFG
114 +
115 +```mermaid
116 +flowchart TB
117 + %% Basic Blocks
118 + subgraph bb0
119 + bb0_instrs["
120 + [1] Const mutate $5 = Call mutate f$1()
121 + "]
122 + bb0_instrs --> bb0_terminal(["If (read $5)"])
123 + end
124 +
125 + subgraph bb2
126 + bb2_instrs["
127 + [2] Const mutate $3 = read $5
128 + "]
129 + bb2_instrs --> bb2_terminal(["Goto"])
130 + end
131 +
132 + subgraph bb3
133 + bb3_instrs["
134 + [3] Const mutate $3 = Call mutate g$4()
135 + "]
136 + bb3_instrs --> bb3_terminal(["Goto"])
137 + end
138 +
139 + subgraph bb1
140 + bb1_terminal(["Return freeze $3"])
141 + end
142 +
143 +
144 + %% Jumps
145 + bb0_terminal -- then --> bb2
146 + bb0_terminal -- else --> bb3
147 + bb0_terminal -- fallthrough --> bb1
148 +
149 + bb2_terminal --> bb1
150 +
151 + bb3_terminal --> bb1
152 +
153 +```
154 +
155 ## Code
156
157 ```javascript
@@ -100,6 +184,50 @@ bb1:
184 Return freeze $6
185 ```
186
187 +### CFG
188 +
189 +```mermaid
190 +flowchart TB
191 + %% Basic Blocks
192 + subgraph bb0
193 + bb0_instrs["
194 + [1] Const mutate $9 = Call mutate f$2()
195 + [2] Const mutate $10 = null
196 + [3] Const mutate $11 = Binary read $9 != read $10
197 + "]
198 + bb0_instrs --> bb0_terminal(["If (read $11)"])
199 + end
200 +
201 + subgraph bb2
202 + bb2_instrs["
203 + [4] Const mutate $6 = read $9
204 + "]
205 + bb2_instrs --> bb2_terminal(["Goto"])
206 + end
207 +
208 + subgraph bb3
209 + bb3_instrs["
210 + [5] Const mutate $6 = Call mutate g$7()
211 + "]
212 + bb3_instrs --> bb3_terminal(["Goto"])
213 + end
214 +
215 + subgraph bb1
216 + bb1_terminal(["Return freeze $6"])
217 + end
218 +
219 +
220 + %% Jumps
221 + bb0_terminal -- then --> bb2
222 + bb0_terminal -- else --> bb3
223 + bb0_terminal -- fallthrough --> bb1
224 +
225 + bb2_terminal --> bb1
226 +
227 + bb3_terminal --> bb1
228 +
229 +```
230 +
231 ## Code
232
233 ```javascript
@@ -118,6 +246,20 @@ bb0:
246 Return
247 ```
248
249 +### CFG
250 +
251 +```mermaid
252 +flowchart TB
253 + %% Basic Blocks
254 + subgraph bb0
255 + bb0_terminal(["Return"])
256 + end
257 +
258 +
259 + %% Jumps
260 + %% empty
261 +```
262 +
263 ## Code
264
265 ```javascript
@@ -133,6 +275,20 @@ bb0:
275 Return
276 ```
277
278 +### CFG
279 +
280 +```mermaid
281 +flowchart TB
282 + %% Basic Blocks
283 + subgraph bb0
284 + bb0_terminal(["Return"])
285 + end
286 +
287 +
288 + %% Jumps
289 + %% empty
290 +```
291 +
292 ## Code
293
294 ```javascript
compiler/forget/src/__tests__/fixtures/hir/mutable-lifetime-loops.expect.md
+119
@@ -46,6 +46,20 @@ bb0:
46 Return
47 ```
48
49 +### CFG
50 +
51 +```mermaid
52 +flowchart TB
53 + %% Basic Blocks
54 + subgraph bb0
55 + bb0_terminal(["Return"])
56 + end
57 +
58 +
59 + %% Jumps
60 + %% empty
61 +```
62 +
63 ## Code
64
65 ```javascript
@@ -61,6 +75,20 @@ bb0:
75 Return
76 ```
77
78 +### CFG
79 +
80 +```mermaid
81 +flowchart TB
82 + %% Basic Blocks
83 + subgraph bb0
84 + bb0_terminal(["Return"])
85 + end
86 +
87 +
88 + %% Jumps
89 + %% empty
90 +```
91 +
92 ## Code
93
94 ```javascript
@@ -114,6 +142,97 @@ bb13:
142 Return
143 ```
144
145 +### CFG
146 +
147 +```mermaid
148 +flowchart TB
149 + %% Basic Blocks
150 + subgraph bb0
151 + bb0_instrs["
152 + [1] Let mutate a$2 = Object { }
153 + [2] Let mutate b$3 = Object { }
154 + [3] Let mutate c$4 = Object { }
155 + [4] Let mutate d$5 = Object { }
156 + "]
157 + bb0_instrs --> bb0_terminal(["While"])
158 + end
159 +
160 + subgraph bb1
161 + bb1_instrs["
162 + [5] Const mutate $17 = true
163 + "]
164 + bb1_instrs --> bb1_terminal(["If (read $17)"])
165 + end
166 +
167 + subgraph bb3
168 + bb3_instrs["
169 + [6] Let mutate z$19 = read a$2
170 + [7] Reassign mutate a$2 = read b$3
171 + [8] Reassign mutate b$3 = read c$4
172 + [9] Reassign mutate c$4 = read d$5
173 + [10] Reassign mutate d$5 = read z$19
174 + [11] Call mutate mutate$7(mutate a$2, mutate b$3)
175 + [12] Const mutate $29 = Call mutate cond$8(mutate a$2)
176 + "]
177 + bb3_instrs --> bb3_terminal(["If (read $29)"])
178 + end
179 +
180 + subgraph bb4
181 + bb4_terminal(["Goto"])
182 + end
183 +
184 + subgraph bb2
185 + bb2_terminal(["If (read a$2)"])
186 + end
187 +
188 + subgraph bb7
189 + bb7_terminal(["If (read b$3)"])
190 + end
191 +
192 + subgraph bb9
193 + bb9_terminal(["If (read c$4)"])
194 + end
195 +
196 + subgraph bb11
197 + bb11_terminal(["If (read d$5)"])
198 + end
199 +
200 + subgraph bb13
201 + bb13_instrs["
202 + [13] Const mutate $34 = null
203 + [14] Call mutate mutate$7(mutate d$5, read $34)
204 + "]
205 + bb13_instrs --> bb13_terminal(["Return"])
206 + end
207 +
208 +
209 + %% Jumps
210 + bb0_terminal -- test --> bb1
211 + bb0_terminal -- loop --> bb3
212 + bb0_terminal -- fallthrough --> bb2
213 +
214 + bb1_terminal -- then --> bb3
215 + bb1_terminal -- else --> bb2
216 +
217 + bb3_terminal -- then --> bb2
218 + bb3_terminal -- else --> bb4
219 +
220 + bb4_terminal --> bb1
221 +
222 + bb2_terminal -- then --> bb7
223 + bb2_terminal -- else --> bb7
224 +
225 + bb7_terminal -- then --> bb9
226 + bb7_terminal -- else --> bb9
227 +
228 + bb9_terminal -- then --> bb11
229 + bb9_terminal -- else --> bb11
230 +
231 + bb11_terminal -- then --> bb13
232 + bb11_terminal -- else --> bb13
233 +
234 +```
235 +
236 ## Code
237
238 ```javascript
compiler/forget/src/__tests__/fixtures/hir/mutable-lifetime-with-aliasing.expect.md
+75
@@ -42,6 +42,20 @@ bb0:
42 Return
43 ```
44
45 +### CFG
46 +
47 +```mermaid
48 +flowchart TB
49 + %% Basic Blocks
50 + subgraph bb0
51 + bb0_terminal(["Return"])
52 + end
53 +
54 +
55 + %% Jumps
56 + %% empty
57 +```
58 +
59 ## Code
60
61 ```javascript
@@ -81,6 +95,67 @@ bb9:
95 Return
96 ```
97
98 +### CFG
99 +
100 +```mermaid
101 +flowchart TB
102 + %% Basic Blocks
103 + subgraph bb0
104 + bb0_instrs["
105 + [1] Const mutate a$11 = Object { }
106 + [2] Const mutate b$12 = Array [read a$11]
107 + [3] Const mutate c$13 = Object { }
108 + [4] Const mutate d$14[4:7] = Object { c: read c$13 }
109 + [5] Const mutate x$15[5:9] = Object { }
110 + [6] Reassign mutate x$15.b[5:9] = read b$12
111 + [7] Const mutate y$16 = Call mutate mutate$8(mutate x$15, mutate d$14)
112 + "]
113 + bb0_instrs --> bb0_terminal(["If (read a$11)"])
114 + end
115 +
116 + subgraph bb1
117 + bb1_terminal(["If (read b$12)"])
118 + end
119 +
120 + subgraph bb3
121 + bb3_terminal(["If (read c$13)"])
122 + end
123 +
124 + subgraph bb5
125 + bb5_terminal(["If (read d$14)"])
126 + end
127 +
128 + subgraph bb7
129 + bb7_terminal(["If (read y$16)"])
130 + end
131 +
132 + subgraph bb9
133 + bb9_instrs["
134 + [8] Const mutate $17 = null
135 + [9] Call mutate mutate$8(mutate x$15, read $17)
136 + "]
137 + bb9_instrs --> bb9_terminal(["Return"])
138 + end
139 +
140 +
141 + %% Jumps
142 + bb0_terminal -- then --> bb1
143 + bb0_terminal -- else --> bb1
144 +
145 + bb1_terminal -- then --> bb3
146 + bb1_terminal -- else --> bb3
147 +
148 + bb3_terminal -- then --> bb5
149 + bb3_terminal -- else --> bb5
150 +
151 + bb5_terminal -- then --> bb7
152 + bb5_terminal -- else --> bb7
153 +
154 + bb7_terminal -- then --> bb9
155 + bb7_terminal -- else --> bb9
156 +
157 +```
158 +
159 ## Code
160
161 ```javascript
compiler/forget/src/__tests__/fixtures/hir/mutable-liverange-loop.expect.md
+114
@@ -41,6 +41,20 @@ bb0:
41 Return
42 ```
43
44 +### CFG
45 +
46 +```mermaid
47 +flowchart TB
48 + %% Basic Blocks
49 + subgraph bb0
50 + bb0_terminal(["Return"])
51 + end
52 +
53 +
54 + %% Jumps
55 + %% empty
56 +```
57 +
58 ## Code
59
60 ```javascript
@@ -56,6 +70,20 @@ bb0:
70 Return
71 ```
72
73 +### CFG
74 +
75 +```mermaid
76 +flowchart TB
77 + %% Basic Blocks
78 + subgraph bb0
79 + bb0_terminal(["Return"])
80 + end
81 +
82 +
83 + %% Jumps
84 + %% empty
85 +```
86 +
87 ## Code
88
89 ```javascript
@@ -104,6 +132,92 @@ bb13:
132 Return
133 ```
134
135 +### CFG
136 +
137 +```mermaid
138 +flowchart TB
139 + %% Basic Blocks
140 + subgraph bb0
141 + bb0_instrs["
142 + [1] Let mutate a$12[1:7] = Object { }
143 + [2] Let mutate b$13[2:6] = Object { }
144 + [3] Let mutate c$14 = Object { }
145 + [4] Let mutate d$15[4:9] = Object { }
146 + "]
147 + bb0_instrs --> bb0_terminal(["While"])
148 + end
149 +
150 + subgraph bb1
151 + bb1_instrs["
152 + [5] Const mutate $16 = true
153 + "]
154 + bb1_instrs --> bb1_terminal(["If (read $16)"])
155 + end
156 +
157 + subgraph bb3
158 + bb3_instrs["
159 + [6] Call mutate mutate$6(mutate a$12, mutate b$13)
160 + [7] Const mutate $21 = Call mutate cond$7(mutate a$12)
161 + "]
162 + bb3_instrs --> bb3_terminal(["If (read $21)"])
163 + end
164 +
165 + subgraph bb4
166 + bb4_terminal(["Goto"])
167 + end
168 +
169 + subgraph bb2
170 + bb2_terminal(["If (read a$12)"])
171 + end
172 +
173 + subgraph bb7
174 + bb7_terminal(["If (read b$13)"])
175 + end
176 +
177 + subgraph bb9
178 + bb9_terminal(["If (read c$14)"])
179 + end
180 +
181 + subgraph bb11
182 + bb11_terminal(["If (read d$15)"])
183 + end
184 +
185 + subgraph bb13
186 + bb13_instrs["
187 + [8] Const mutate $28 = null
188 + [9] Call mutate mutate$6(mutate d$15, read $28)
189 + "]
190 + bb13_instrs --> bb13_terminal(["Return"])
191 + end
192 +
193 +
194 + %% Jumps
195 + bb0_terminal -- test --> bb1
196 + bb0_terminal -- loop --> bb3
197 + bb0_terminal -- fallthrough --> bb2
198 +
199 + bb1_terminal -- then --> bb3
200 + bb1_terminal -- else --> bb2
201 +
202 + bb3_terminal -- then --> bb2
203 + bb3_terminal -- else --> bb4
204 +
205 + bb4_terminal --> bb1
206 +
207 + bb2_terminal -- then --> bb7
208 + bb2_terminal -- else --> bb7
209 +
210 + bb7_terminal -- then --> bb9
211 + bb7_terminal -- else --> bb9
212 +
213 + bb9_terminal -- then --> bb11
214 + bb9_terminal -- else --> bb11
215 +
216 + bb11_terminal -- then --> bb13
217 + bb11_terminal -- else --> bb13
218 +
219 +```
220 +
221 ## Code
222
223 ```javascript
compiler/forget/src/__tests__/fixtures/hir/property-assignment.expect.md
+22
@@ -26,6 +26,28 @@ bb0:
26 Return read $10
27 ```
28
29 +### CFG
30 +
31 +```mermaid
32 +flowchart TB
33 + %% Basic Blocks
34 + subgraph bb0
35 + bb0_instrs["
36 + [1] Const mutate x$7[1:5] = Object { }
37 + [2] Const mutate y$8 = Array []
38 + [3] Reassign mutate x$7.y[1:5] = read y$8
39 + [4] Const mutate child$9 = JSX <read Component$0 data={freeze y$8} ></read Component$0>
40 + [5] Call mutate x$7.y.push(read props$6.p0)
41 + [6] Const mutate $10 = JSX <read Component$0 data={freeze x$7} >{read child$9}</read Component$0>
42 + "]
43 + bb0_instrs --> bb0_terminal(["Return read $10"])
44 + end
45 +
46 +
47 + %% Jumps
48 + %% empty
49 +```
50 +
51 ## Code
52
53 ```javascript
compiler/forget/src/__tests__/fixtures/hir/reassignment-conditional.expect.md
+39
@@ -39,6 +39,45 @@ bb1:
39 Return read $15
40 ```
41
42 +### CFG
43 +
44 +```mermaid
45 +flowchart TB
46 + %% Basic Blocks
47 + subgraph bb0
48 + bb0_instrs["
49 + [1] Let mutate x$2 = Array []
50 + [2] Call mutate x$2.push(read props$6.p0)
51 + [3] Let mutate y$8 = read x$2
52 + "]
53 + bb0_instrs --> bb0_terminal(["If (read props$6.p1)"])
54 + end
55 +
56 + subgraph bb2
57 + bb2_instrs["
58 + [4] Reassign mutate x$2 = Array []
59 + "]
60 + bb2_instrs --> bb2_terminal(["Goto"])
61 + end
62 +
63 + subgraph bb1
64 + bb1_instrs["
65 + [5] Let mutate _$12 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
66 + [6] Call read y$8.push(read props$6.p2)
67 + [7] Const mutate $15 = JSX <read Component$0 x={read x$2} y={read y$8} ></read Component$0>
68 + "]
69 + bb1_instrs --> bb1_terminal(["Return read $15"])
70 + end
71 +
72 +
73 + %% Jumps
74 + bb0_terminal -- then --> bb2
75 + bb0_terminal -- else --> bb1
76 +
77 + bb2_terminal --> bb1
78 +
79 +```
80 +
81 ## Code
82
83 ```javascript
compiler/forget/src/__tests__/fixtures/hir/reassignment.expect.md
+23
@@ -31,6 +31,29 @@ bb0:
31 Return read $11
32 ```
33
34 +### CFG
35 +
36 +```mermaid
37 +flowchart TB
38 + %% Basic Blocks
39 + subgraph bb0
40 + bb0_instrs["
41 + [1] Let mutate x$7[1:2] = Array []
42 + [2] Call mutate x$7.push(read props$6.p0)
43 + [3] Let mutate y$8[3:6] = read x$7
44 + [4] Reassign mutate x$9 = Array []
45 + [5] Let mutate _$10 = JSX <read Component$0 x={freeze x$9} ></read Component$0>
46 + [6] Call mutate y$8.push(read props$6.p1)
47 + [7] Const mutate $11 = JSX <read Component$0 x={read x$9} y={freeze y$8} ></read Component$0>
48 + "]
49 + bb0_instrs --> bb0_terminal(["Return read $11"])
50 + end
51 +
52 +
53 + %% Jumps
54 + %% empty
55 +```
56 +
57 ## Code
58
59 ```javascript
compiler/forget/src/__tests__/fixtures/hir/reverse-postorder.expect.md
+95
@@ -77,6 +77,101 @@ bb1:
77 Return
78 ```
79
80 +### CFG
81 +
82 +```mermaid
83 +flowchart TB
84 + %% Basic Blocks
85 + subgraph bb0
86 + bb0_instrs["
87 + [1] Let mutate x$7 = undefined
88 + "]
89 + bb0_instrs --> bb0_terminal(["If (read props$6.cond)"])
90 + end
91 +
92 + subgraph bb2
93 + bb2_instrs["
94 + [2] Const mutate $8 = 2
95 + [3] Const mutate $9 = 1
96 + [4] Const mutate $10 = 0
97 + "]
98 + bb2_instrs --> bb2_terminal(["Switch (read props$6.test)"])
99 + end
100 +
101 + subgraph bb8
102 + bb8_instrs["
103 + [5] Reassign mutate x$2 = read props$6.v0
104 + "]
105 + bb8_instrs --> bb8_terminal(["Goto"])
106 + end
107 +
108 + subgraph bb6
109 + bb6_instrs["
110 + [6] Reassign mutate x$2 = read props$6.v1
111 + "]
112 + bb6_instrs --> bb6_terminal(["Goto"])
113 + end
114 +
115 + subgraph bb4
116 + bb4_instrs["
117 + [7] Reassign mutate x$2 = read props$6.v2
118 + "]
119 + bb4_instrs --> bb4_terminal(["Goto"])
120 + end
121 +
122 + subgraph bb10
123 + bb10_terminal(["If (read props$6.cond2)"])
124 + end
125 +
126 + subgraph bb12
127 + bb12_instrs["
128 + [8] Reassign mutate x$2 = read props$6.b
129 + "]
130 + bb12_instrs --> bb12_terminal(["Goto"])
131 + end
132 +
133 + subgraph bb13
134 + bb13_instrs["
135 + [9] Reassign mutate x$2 = read props$6.c
136 + "]
137 + bb13_instrs --> bb13_terminal(["Goto"])
138 + end
139 +
140 + subgraph bb1
141 + bb1_instrs["
142 + [10] read x$2
143 + "]
144 + bb1_instrs --> bb1_terminal(["Return"])
145 + end
146 +
147 +
148 + %% Jumps
149 + bb0_terminal -- then --> bb2
150 + bb0_terminal -- else --> bb10
151 + bb0_terminal -- fallthrough --> bb1
152 +
153 + bb2_terminal -- read $10 --> bb8
154 + bb2_terminal -- read $9 --> bb6
155 + bb2_terminal -- read $8 --> bb4
156 + bb2_terminal -- default --> bb4
157 + bb2_terminal -- fallthrough --> bb1
158 +
159 + bb8_terminal --> bb1
160 +
161 + bb6_terminal --> bb1
162 +
163 + bb4_terminal --> bb1
164 +
165 + bb10_terminal -- then --> bb12
166 + bb10_terminal -- else --> bb13
167 + bb10_terminal -- fallthrough --> bb1
168 +
169 + bb12_terminal --> bb1
170 +
171 + bb13_terminal --> bb1
172 +
173 +```
174 +
175 ## Code
176
177 ```javascript
compiler/forget/src/__tests__/fixtures/hir/simple.expect.md
+33
@@ -29,6 +29,39 @@ bb1:
29 Return freeze $14
30 ```
31
32 +### CFG
33 +
34 +```mermaid
35 +flowchart TB
36 + %% Basic Blocks
37 + subgraph bb0
38 + bb0_terminal(["If (read x$8)"])
39 + end
40 +
41 + subgraph bb2
42 + bb2_instrs["
43 + [1] Const mutate $10 = false
44 + [2] Const mutate $11 = Call read foo$0(read $10, read y$9)
45 + "]
46 + bb2_instrs --> bb2_terminal(["Return freeze $11"])
47 + end
48 +
49 + subgraph bb1
50 + bb1_instrs["
51 + [3] Const mutate $12 = 10
52 + [4] Const mutate $13 = Binary read y$9 * read $12
53 + [5] Const mutate $14 = Array [read $13]
54 + "]
55 + bb1_instrs --> bb1_terminal(["Return freeze $14"])
56 + end
57 +
58 +
59 + %% Jumps
60 + bb0_terminal -- then --> bb2
61 + bb0_terminal -- else --> bb1
62 +
63 +```
64 +
65 ## Code
66
67 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-arrayexpression.expect.md
+19
@@ -21,6 +21,25 @@ bb0:
21 Return freeze x$8
22 ```
23
24 +### CFG
25 +
26 +```mermaid
27 +flowchart TB
28 + %% Basic Blocks
29 + subgraph bb0
30 + bb0_instrs["
31 + [1] Const mutate a$6 = 1
32 + [2] Const mutate b$7 = 2
33 + [3] Const mutate x$8 = Array [read a$6, read b$7]
34 + "]
35 + bb0_instrs --> bb0_terminal(["Return freeze x$8"])
36 + end
37 +
38 +
39 + %% Jumps
40 + %% empty
41 +```
42 +
43 ## Code
44
45 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-call-jsx-2.expect.md
+55
@@ -25,6 +25,20 @@ bb0:
25 Return
26 ```
27
28 +### CFG
29 +
30 +```mermaid
31 +flowchart TB
32 + %% Basic Blocks
33 + subgraph bb0
34 + bb0_terminal(["Return"])
35 + end
36 +
37 +
38 + %% Jumps
39 + %% empty
40 +```
41 +
42 ## Code
43
44 ```javascript
@@ -55,6 +69,47 @@ bb1:
69 Return read $20
70 ```
71
72 +### CFG
73 +
74 +```mermaid
75 +flowchart TB
76 + %% Basic Blocks
77 + subgraph bb0
78 + bb0_instrs["
79 + [1] Const mutate a$11[1:3] = Array []
80 + [2] Const mutate b$12[2:7] = Object { }
81 + [3] Call mutate foo$4(mutate a$11, mutate b$12)
82 + [4] Const mutate $13 = Call mutate foo$4()
83 + "]
84 + bb0_instrs --> bb0_terminal(["If (read $13)"])
85 + end
86 +
87 + subgraph bb2
88 + bb2_instrs["
89 + [5] Const mutate $14 = 'div'
90 + [6] Let mutate _$15 = JSX <read $14 a={freeze a$11} ></read $14>
91 + "]
92 + bb2_instrs --> bb2_terminal(["Goto"])
93 + end
94 +
95 + subgraph bb1
96 + bb1_instrs["
97 + [7] Call mutate foo$4(read a$11, mutate b$12)
98 + [8] Const mutate $19 = 'div'
99 + [9] Const mutate $20 = JSX <read $19 a={freeze a$11} b={freeze b$12} ></read $19>
100 + "]
101 + bb1_instrs --> bb1_terminal(["Return read $20"])
102 + end
103 +
104 +
105 + %% Jumps
106 + bb0_terminal -- then --> bb2
107 + bb0_terminal -- else --> bb1
108 +
109 + bb2_terminal --> bb1
110 +
111 +```
112 +
113 ## Code
114
115 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-call-jsx.expect.md
+38
@@ -22,6 +22,20 @@ bb0:
22 Return
23 ```
24
25 +### CFG
26 +
27 +```mermaid
28 +flowchart TB
29 + %% Basic Blocks
30 + subgraph bb0
31 + bb0_terminal(["Return"])
32 + end
33 +
34 +
35 + %% Jumps
36 + %% empty
37 +```
38 +
39 ## Code
40
41 ```javascript
@@ -45,6 +59,30 @@ bb0:
59 Return read $15
60 ```
61
62 +### CFG
63 +
64 +```mermaid
65 +flowchart TB
66 + %% Basic Blocks
67 + subgraph bb0
68 + bb0_instrs["
69 + [1] Const mutate a$10[1:3] = Array []
70 + [2] Const mutate b$11[2:6] = Object { }
71 + [3] Call mutate foo$4(mutate a$10, mutate b$11)
72 + [4] Const mutate $12 = 'div'
73 + [5] Let mutate _$13 = JSX <read $12 a={freeze a$10} ></read $12>
74 + [6] Call mutate foo$4(read a$10, mutate b$11)
75 + [7] Const mutate $14 = 'div'
76 + [8] Const mutate $15 = JSX <read $14 a={read a$10} b={freeze b$11} ></read $14>
77 + "]
78 + bb0_instrs --> bb0_terminal(["Return read $15"])
79 + end
80 +
81 +
82 + %% Jumps
83 + %% empty
84 +```
85 +
86 ## Code
87
88 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-complex-multiple-if.expect.md
+58
@@ -45,6 +45,64 @@ bb3:
45 Return
46 ```
47
48 +### CFG
49 +
50 +```mermaid
51 +flowchart TB
52 + %% Basic Blocks
53 + subgraph bb0
54 + bb0_instrs["
55 + [1] Let mutate x$1 = 1
56 + [2] Let mutate y$8 = 2
57 + [3] Const mutate $9 = 2
58 + [4] Const mutate $10 = Binary read y$8 === read $9
59 + "]
60 + bb0_instrs --> bb0_terminal(["If (read $10)"])
61 + end
62 +
63 + subgraph bb2
64 + bb2_instrs["
65 + [5] Reassign mutate x$1 = 3
66 + "]
67 + bb2_instrs --> bb2_terminal(["Goto"])
68 + end
69 +
70 + subgraph bb1
71 + bb1_instrs["
72 + [6] Const mutate $12 = 3
73 + [7] Const mutate $14 = Binary read y$8 === read $12
74 + "]
75 + bb1_instrs --> bb1_terminal(["If (read $14)"])
76 + end
77 +
78 + subgraph bb4
79 + bb4_instrs["
80 + [8] Reassign mutate x$1 = 5
81 + "]
82 + bb4_instrs --> bb4_terminal(["Goto"])
83 + end
84 +
85 + subgraph bb3
86 + bb3_instrs["
87 + [9] Reassign mutate y$18 = read x$1
88 + "]
89 + bb3_instrs --> bb3_terminal(["Return"])
90 + end
91 +
92 +
93 + %% Jumps
94 + bb0_terminal -- then --> bb2
95 + bb0_terminal -- else --> bb1
96 +
97 + bb2_terminal --> bb1
98 +
99 + bb1_terminal -- then --> bb4
100 + bb1_terminal -- else --> bb3
101 +
102 + bb4_terminal --> bb3
103 +
104 +```
105 +
106 ## Code
107
108 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-complex-single-if.expect.md
+38
@@ -33,6 +33,44 @@ bb1:
33 Return
34 ```
35
36 +### CFG
37 +
38 +```mermaid
39 +flowchart TB
40 + %% Basic Blocks
41 + subgraph bb0
42 + bb0_instrs["
43 + [1] Let mutate x$1 = 1
44 + [2] Let mutate y$6 = 2
45 + [3] Const mutate $7 = 2
46 + [4] Const mutate $8 = Binary read y$6 === read $7
47 + "]
48 + bb0_instrs --> bb0_terminal(["If (read $8)"])
49 + end
50 +
51 + subgraph bb2
52 + bb2_instrs["
53 + [5] Reassign mutate x$1 = 3
54 + "]
55 + bb2_instrs --> bb2_terminal(["Goto"])
56 + end
57 +
58 + subgraph bb1
59 + bb1_instrs["
60 + [6] Reassign mutate y$11 = read x$1
61 + "]
62 + bb1_instrs --> bb1_terminal(["Return"])
63 + end
64 +
65 +
66 + %% Jumps
67 + bb0_terminal -- then --> bb2
68 + bb0_terminal -- else --> bb1
69 +
70 + bb2_terminal --> bb1
71 +
72 +```
73 +
74 ## Code
75
76 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-for-of.expect.md
+54
@@ -40,6 +40,60 @@ bb2:
40 Return freeze items$5
41 ```
42
43 +### CFG
44 +
45 +```mermaid
46 +flowchart TB
47 + %% Basic Blocks
48 + subgraph bb0
49 + bb0_instrs["
50 + [1] Let mutate items$5 = Array []
51 + "]
52 + bb0_instrs --> bb0_terminal(["Goto"])
53 + end
54 +
55 + subgraph bb1
56 + bb1_terminal(["If (read items$5)"])
57 + end
58 +
59 + subgraph bb3
60 + bb3_instrs["
61 + [2] Let mutate y$7 = 0
62 + "]
63 + bb3_instrs --> bb3_terminal(["If (read cond$4)"])
64 + end
65 +
66 + subgraph bb5
67 + bb5_instrs["
68 + [3] Reassign mutate y$9 = 1
69 + "]
70 + bb5_instrs --> bb5_terminal(["Goto"])
71 + end
72 +
73 + subgraph bb4
74 + bb4_terminal(["Goto"])
75 + end
76 +
77 + subgraph bb2
78 + bb2_terminal(["Return freeze items$5"])
79 + end
80 +
81 +
82 + %% Jumps
83 + bb0_terminal --> bb1
84 +
85 + bb1_terminal -- then --> bb3
86 + bb1_terminal -- else --> bb2
87 +
88 + bb3_terminal -- then --> bb5
89 + bb3_terminal -- else --> bb4
90 +
91 + bb5_terminal --> bb4
92 +
93 + bb4_terminal --> bb1
94 +
95 +```
96 +
97 ## Code
98
99 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-for.expect.md
+43
@@ -33,6 +33,49 @@ bb2:
33 Return read x$1
34 ```
35
36 +### CFG
37 +
38 +```mermaid
39 +flowchart TB
40 + %% Basic Blocks
41 + subgraph bb0
42 + bb0_instrs["
43 + [1] Let mutate x$1 = 0
44 + "]
45 + bb0_instrs --> bb0_terminal(["Goto"])
46 + end
47 +
48 + subgraph bb1
49 + bb1_instrs["
50 + [2] Const mutate $6 = 10
51 + [3] Const mutate $8 = Binary read x$1 < read $6
52 + "]
53 + bb1_instrs --> bb1_terminal(["If (read $8)"])
54 + end
55 +
56 + subgraph bb4
57 + bb4_instrs["
58 + [4] Const mutate $9 = 1
59 + [5] Reassign mutate x$1 = Binary read x$1 + read $9
60 + "]
61 + bb4_instrs --> bb4_terminal(["Goto"])
62 + end
63 +
64 + subgraph bb2
65 + bb2_terminal(["Return read x$1"])
66 + end
67 +
68 +
69 + %% Jumps
70 + bb0_terminal --> bb1
71 +
72 + bb1_terminal -- then --> bb4
73 + bb1_terminal -- else --> bb2
74 +
75 + bb4_terminal --> bb1
76 +
77 +```
78 +
79 ## Code
80
81 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-if-else.expect.md
+43
@@ -35,6 +35,49 @@ bb1:
35 Return
36 ```
37
38 +### CFG
39 +
40 +```mermaid
41 +flowchart TB
42 + %% Basic Blocks
43 + subgraph bb0
44 + bb0_instrs["
45 + [1] Let mutate x$5 = 1
46 + [2] Let mutate y$6 = 2
47 + "]
48 + bb0_instrs --> bb0_terminal(["If (read y$6)"])
49 + end
50 +
51 + subgraph bb2
52 + bb2_instrs["
53 + [3] Let mutate z$7 = Binary read x$5 + read y$6
54 + "]
55 + bb2_instrs --> bb2_terminal(["Goto"])
56 + end
57 +
58 + subgraph bb3
59 + bb3_instrs["
60 + [4] Let mutate z$8 = read x$5
61 + "]
62 + bb3_instrs --> bb3_terminal(["Goto"])
63 + end
64 +
65 + subgraph bb1
66 + bb1_terminal(["Return"])
67 + end
68 +
69 +
70 + %% Jumps
71 + bb0_terminal -- then --> bb2
72 + bb0_terminal -- else --> bb3
73 + bb0_terminal -- fallthrough --> bb1
74 +
75 + bb2_terminal --> bb1
76 +
77 + bb3_terminal --> bb1
78 +
79 +```
80 +
81 ## Code
82
83 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-nested-loops-no-reassign.expect.md
+83
@@ -54,6 +54,89 @@ bb2:
54 Return read x$9
55 ```
56
57 +### CFG
58 +
59 +```mermaid
60 +flowchart TB
61 + %% Basic Blocks
62 + subgraph bb0
63 + bb0_instrs["
64 + [1] Let mutate x$9 = 0
65 + "]
66 + bb0_instrs --> bb0_terminal(["While"])
67 + end
68 +
69 + subgraph bb1
70 + bb1_terminal(["If (read a$6)"])
71 + end
72 +
73 + subgraph bb3
74 + bb3_terminal(["While"])
75 + end
76 +
77 + subgraph bb4
78 + bb4_terminal(["If (read b$7)"])
79 + end
80 +
81 + subgraph bb6
82 + bb6_terminal(["While"])
83 + end
84 +
85 + subgraph bb7
86 + bb7_terminal(["If (read c$8)"])
87 + end
88 +
89 + subgraph bb9
90 + bb9_instrs["
91 + [2] Const mutate $13 = 1
92 + [3] Binary read x$9 + read $13
93 + "]
94 + bb9_instrs --> bb9_terminal(["Goto"])
95 + end
96 +
97 + subgraph bb8
98 + bb8_terminal(["Goto"])
99 + end
100 +
101 + subgraph bb5
102 + bb5_terminal(["Goto"])
103 + end
104 +
105 + subgraph bb2
106 + bb2_terminal(["Return read x$9"])
107 + end
108 +
109 +
110 + %% Jumps
111 + bb0_terminal -- test --> bb1
112 + bb0_terminal -- loop --> bb3
113 + bb0_terminal -- fallthrough --> bb2
114 +
115 + bb1_terminal -- then --> bb3
116 + bb1_terminal -- else --> bb2
117 +
118 + bb3_terminal -- test --> bb4
119 + bb3_terminal -- loop --> bb6
120 + bb3_terminal -- fallthrough --> bb5
121 +
122 + bb4_terminal -- then --> bb6
123 + bb4_terminal -- else --> bb5
124 +
125 + bb6_terminal -- test --> bb7
126 + bb6_terminal -- loop --> bb9
127 + bb6_terminal -- fallthrough --> bb8
128 +
129 + bb7_terminal -- then --> bb9
130 + bb7_terminal -- else --> bb8
131 +
132 + bb9_terminal --> bb7
133 +
134 + bb8_terminal --> bb4
135 +
136 + bb5_terminal --> bb1
137 +
138 +```
139 +
140 ## Code
141
142 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-newexpression.expect.md
+33
@@ -20,6 +20,20 @@ bb0:
20 Return
21 ```
22
23 +### CFG
24 +
25 +```mermaid
26 +flowchart TB
27 + %% Basic Blocks
28 + subgraph bb0
29 + bb0_terminal(["Return"])
30 + end
31 +
32 +
33 + %% Jumps
34 + %% empty
35 +```
36 +
37 ## Code
38
39 ```javascript
@@ -38,6 +52,25 @@ bb0:
52 Return freeze c$9
53 ```
54
55 +### CFG
56 +
57 +```mermaid
58 +flowchart TB
59 + %% Basic Blocks
60 + subgraph bb0
61 + bb0_instrs["
62 + [1] Const mutate a$7[1:3] = Array []
63 + [2] Const mutate b$8[2:3] = Object { }
64 + [3] Let mutate c$9 = New mutate Foo$5(mutate a$7, mutate b$8)
65 + "]
66 + bb0_instrs --> bb0_terminal(["Return freeze c$9"])
67 + end
68 +
69 +
70 + %% Jumps
71 + %% empty
72 +```
73 +
74 ## Code
75
76 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-objectexpression-phi.expect.md
+48
@@ -41,6 +41,54 @@ bb1:
41 Return freeze t$14
42 ```
43
44 +### CFG
45 +
46 +```mermaid
47 +flowchart TB
48 + %% Basic Blocks
49 + subgraph bb0
50 + bb0_instrs["
51 + [1] Let mutate x$1 = 1
52 + [2] Let mutate y$2 = 2
53 + [3] Const mutate $8 = 1
54 + [4] Const mutate $9 = Binary read x$1 > read $8
55 + "]
56 + bb0_instrs --> bb0_terminal(["If (read $9)"])
57 + end
58 +
59 + subgraph bb2
60 + bb2_instrs["
61 + [5] Reassign mutate x$1 = 2
62 + "]
63 + bb2_instrs --> bb2_terminal(["Goto"])
64 + end
65 +
66 + subgraph bb3
67 + bb3_instrs["
68 + [6] Reassign mutate y$2 = 3
69 + "]
70 + bb3_instrs --> bb3_terminal(["Goto"])
71 + end
72 +
73 + subgraph bb1
74 + bb1_instrs["
75 + [7] Let mutate t$14 = Object { x: read x$1, y: read y$2 }
76 + "]
77 + bb1_instrs --> bb1_terminal(["Return freeze t$14"])
78 + end
79 +
80 +
81 + %% Jumps
82 + bb0_terminal -- then --> bb2
83 + bb0_terminal -- else --> bb3
84 + bb0_terminal -- fallthrough --> bb1
85 +
86 + bb2_terminal --> bb1
87 +
88 + bb3_terminal --> bb1
89 +
90 +```
91 +
92 ## Code
93
94 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-objectexpression.expect.md
+19
@@ -21,6 +21,25 @@ bb0:
21 Return freeze x$8
22 ```
23
24 +### CFG
25 +
26 +```mermaid
27 +flowchart TB
28 + %% Basic Blocks
29 + subgraph bb0
30 + bb0_instrs["
31 + [1] Const mutate a$6 = 1
32 + [2] Const mutate b$7 = 2
33 + [3] Const mutate x$8 = Object { a: read a$6, b: read b$7 }
34 + "]
35 + bb0_instrs --> bb0_terminal(["Return freeze x$8"])
36 + end
37 +
38 +
39 + %% Jumps
40 + %% empty
41 +```
42 +
43 ## Code
44
45 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-property-call.expect.md
+20
@@ -22,6 +22,26 @@ bb0:
22 Return freeze y$5
23 ```
24
25 +### CFG
26 +
27 +```mermaid
28 +flowchart TB
29 + %% Basic Blocks
30 + subgraph bb0
31 + bb0_instrs["
32 + [1] Const mutate x$4 = Array []
33 + [2] Const mutate y$5[2:4] = Object { x: read x$4 }
34 + [3] Const mutate $6[3:4] = Array []
35 + [4] Call mutate y$5.x.push(mutate $6)
36 + "]
37 + bb0_instrs --> bb0_terminal(["Return freeze y$5"])
38 + end
39 +
40 +
41 + %% Jumps
42 + %% empty
43 +```
44 +
45 ## Code
46
47 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-property.expect.md
+19
@@ -21,6 +21,25 @@ bb0:
21 Return freeze y$4
22 ```
23
24 +### CFG
25 +
26 +```mermaid
27 +flowchart TB
28 + %% Basic Blocks
29 + subgraph bb0
30 + bb0_instrs["
31 + [1] Const mutate x$3 = Array []
32 + [2] Const mutate y$4[2:3] = Object { }
33 + [3] Reassign mutate y$4.x[2:3] = read x$3
34 + "]
35 + bb0_instrs --> bb0_terminal(["Return freeze y$4"])
36 + end
37 +
38 +
39 + %% Jumps
40 + %% empty
41 +```
42 +
43 ## Code
44
45 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-return.expect.md
+34
@@ -30,6 +30,40 @@ bb1:
30 Return read x$1
31 ```
32
33 +### CFG
34 +
35 +```mermaid
36 +flowchart TB
37 + %% Basic Blocks
38 + subgraph bb0
39 + bb0_instrs["
40 + [1] Let mutate x$1 = 1
41 + [2] Const mutate $5 = 1
42 + [3] Const mutate $6 = Binary read x$1 === read $5
43 + "]
44 + bb0_instrs --> bb0_terminal(["If (read $6)"])
45 + end
46 +
47 + subgraph bb2
48 + bb2_instrs["
49 + [4] Reassign mutate x$1 = 2
50 + "]
51 + bb2_instrs --> bb2_terminal(["Goto"])
52 + end
53 +
54 + subgraph bb1
55 + bb1_terminal(["Return read x$1"])
56 + end
57 +
58 +
59 + %% Jumps
60 + bb0_terminal -- then --> bb2
61 + bb0_terminal -- else --> bb1
62 +
63 + bb2_terminal --> bb1
64 +
65 +```
66 +
67 ## Code
68
69 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-shadowing.expect.md
+60
@@ -24,6 +24,20 @@ bb0:
24 Return
25 ```
26
27 +### CFG
28 +
29 +```mermaid
30 +flowchart TB
31 + %% Basic Blocks
32 + subgraph bb0
33 + bb0_terminal(["Return"])
34 + end
35 +
36 +
37 + %% Jumps
38 + %% empty
39 +```
40 +
41 ## Code
42
43 ```javascript
@@ -53,6 +67,52 @@ bb1:
67 Return
68 ```
69
70 +### CFG
71 +
72 +```mermaid
73 +flowchart TB
74 + %% Basic Blocks
75 + subgraph bb0
76 + bb0_instrs["
77 + [1] Let mutate str$2 = ''
78 + "]
79 + bb0_instrs --> bb0_terminal(["If (read cond$5)"])
80 + end
81 +
82 + subgraph bb2
83 + bb2_instrs["
84 + [2] Let mutate str$7 = 'other test'
85 + [3] Call mutate log$4(read str$7)
86 + "]
87 + bb2_instrs --> bb2_terminal(["Goto"])
88 + end
89 +
90 + subgraph bb3
91 + bb3_instrs["
92 + [4] Reassign mutate str$2 = 'fallthrough test'
93 + "]
94 + bb3_instrs --> bb3_terminal(["Goto"])
95 + end
96 +
97 + subgraph bb1
98 + bb1_instrs["
99 + [5] Call mutate log$4(read str$2)
100 + "]
101 + bb1_instrs --> bb1_terminal(["Return"])
102 + end
103 +
104 +
105 + %% Jumps
106 + bb0_terminal -- then --> bb2
107 + bb0_terminal -- else --> bb3
108 + bb0_terminal -- fallthrough --> bb1
109 +
110 + bb2_terminal --> bb1
111 +
112 + bb3_terminal --> bb1
113 +
114 +```
115 +
116 ## Code
117
118 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-simple-phi.expect.md
+47
@@ -38,6 +38,53 @@ bb1:
38 Return
39 ```
40
41 +### CFG
42 +
43 +```mermaid
44 +flowchart TB
45 + %% Basic Blocks
46 + subgraph bb0
47 + bb0_instrs["
48 + [1] Let mutate y$5 = 2
49 + [2] Const mutate $6 = 1
50 + [3] Const mutate $7 = Binary read y$5 > read $6
51 + "]
52 + bb0_instrs --> bb0_terminal(["If (read $7)"])
53 + end
54 +
55 + subgraph bb2
56 + bb2_instrs["
57 + [4] Reassign mutate y$1 = 1
58 + "]
59 + bb2_instrs --> bb2_terminal(["Goto"])
60 + end
61 +
62 + subgraph bb3
63 + bb3_instrs["
64 + [5] Reassign mutate y$1 = 2
65 + "]
66 + bb3_instrs --> bb3_terminal(["Goto"])
67 + end
68 +
69 + subgraph bb1
70 + bb1_instrs["
71 + [6] Let mutate x$11 = read y$1
72 + "]
73 + bb1_instrs --> bb1_terminal(["Return"])
74 + end
75 +
76 +
77 + %% Jumps
78 + bb0_terminal -- then --> bb2
79 + bb0_terminal -- else --> bb3
80 + bb0_terminal -- fallthrough --> bb1
81 +
82 + bb2_terminal --> bb1
83 +
84 + bb3_terminal --> bb1
85 +
86 +```
87 +
88 ## Code
89
90 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-simple.expect.md
+18
@@ -18,6 +18,24 @@ bb0:
18 Return
19 ```
20
21 +### CFG
22 +
23 +```mermaid
24 +flowchart TB
25 + %% Basic Blocks
26 + subgraph bb0
27 + bb0_instrs["
28 + [1] Let mutate x$3 = 1
29 + [2] Let mutate y$4 = 2
30 + "]
31 + bb0_instrs --> bb0_terminal(["Return"])
32 + end
33 +
34 +
35 + %% Jumps
36 + %% empty
37 +```
38 +
39 ## Code
40
41 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-single-if.expect.md
+33
@@ -29,6 +29,39 @@ bb1:
29 Return
30 ```
31
32 +### CFG
33 +
34 +```mermaid
35 +flowchart TB
36 + %% Basic Blocks
37 + subgraph bb0
38 + bb0_instrs["
39 + [1] Let mutate x$4 = 1
40 + [2] Let mutate y$5 = 2
41 + "]
42 + bb0_instrs --> bb0_terminal(["If (read y$5)"])
43 + end
44 +
45 + subgraph bb2
46 + bb2_instrs["
47 + [3] Let mutate z$6 = Binary read x$4 + read y$5
48 + "]
49 + bb2_instrs --> bb2_terminal(["Goto"])
50 + end
51 +
52 + subgraph bb1
53 + bb1_terminal(["Return"])
54 + end
55 +
56 +
57 + %% Jumps
58 + bb0_terminal -- then --> bb2
59 + bb0_terminal -- else --> bb1
60 +
61 + bb2_terminal --> bb1
62 +
63 +```
64 +
65 ## Code
66
67 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-switch.expect.md
+62
@@ -58,6 +58,68 @@ bb1:
58 Return
59 ```
60
61 +### CFG
62 +
63 +```mermaid
64 +flowchart TB
65 + %% Basic Blocks
66 + subgraph bb0
67 + bb0_instrs["
68 + [1] Let mutate x$10 = 1
69 + [2] Const mutate $11 = 2
70 + [3] Const mutate $12 = Binary read x$10 === read $11
71 + [4] Const mutate $13 = 1
72 + [5] Const mutate $14 = Binary read x$10 === read $13
73 + "]
74 + bb0_instrs --> bb0_terminal(["Switch (read x$10)"])
75 + end
76 +
77 + subgraph bb5
78 + bb5_instrs["
79 + [6] Const mutate $15 = 1
80 + [7] Reassign mutate x$1 = Binary read x$10 + read $15
81 + "]
82 + bb5_instrs --> bb5_terminal(["Goto"])
83 + end
84 +
85 + subgraph bb3
86 + bb3_instrs["
87 + [8] Const mutate $17 = 2
88 + [9] Reassign mutate x$1 = Binary read x$10 + read $17
89 + "]
90 + bb3_instrs --> bb3_terminal(["Goto"])
91 + end
92 +
93 + subgraph bb2
94 + bb2_instrs["
95 + [10] Const mutate $19 = 3
96 + [11] Reassign mutate x$1 = Binary read x$10 + read $19
97 + "]
98 + bb2_instrs --> bb2_terminal(["Goto"])
99 + end
100 +
101 + subgraph bb1
102 + bb1_instrs["
103 + [12] Let mutate y$22 = read x$1
104 + "]
105 + bb1_instrs --> bb1_terminal(["Return"])
106 + end
107 +
108 +
109 + %% Jumps
110 + bb0_terminal -- read $14 --> bb5
111 + bb0_terminal -- read $12 --> bb3
112 + bb0_terminal -- default --> bb2
113 + bb0_terminal -- fallthrough --> bb1
114 +
115 + bb5_terminal --> bb1
116 +
117 + bb3_terminal --> bb1
118 +
119 + bb2_terminal --> bb1
120 +
121 +```
122 +
123 ## Code
124
125 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-throw.expect.md
+34
@@ -29,6 +29,40 @@ bb1:
29 Throw read x$1
30 ```
31
32 +### CFG
33 +
34 +```mermaid
35 +flowchart TB
36 + %% Basic Blocks
37 + subgraph bb0
38 + bb0_instrs["
39 + [1] Let mutate x$1 = 1
40 + [2] Const mutate $5 = 1
41 + [3] Const mutate $6 = Binary read x$1 === read $5
42 + "]
43 + bb0_instrs --> bb0_terminal(["If (read $6)"])
44 + end
45 +
46 + subgraph bb2
47 + bb2_instrs["
48 + [4] Reassign mutate x$1 = 2
49 + "]
50 + bb2_instrs --> bb2_terminal(["Goto"])
51 + end
52 +
53 + subgraph bb1
54 + bb1_terminal(["Throw read x$1"])
55 + end
56 +
57 +
58 + %% Jumps
59 + bb0_terminal -- then --> bb2
60 + bb0_terminal -- else --> bb1
61 +
62 + bb2_terminal --> bb1
63 +
64 +```
65 +
66 ## Code
67
68 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-while-no-reassign.expect.md
+45
@@ -34,6 +34,51 @@ bb2:
34 Return read x$5
35 ```
36
37 +### CFG
38 +
39 +```mermaid
40 +flowchart TB
41 + %% Basic Blocks
42 + subgraph bb0
43 + bb0_instrs["
44 + [1] Let mutate x$5 = 1
45 + "]
46 + bb0_instrs --> bb0_terminal(["While"])
47 + end
48 +
49 + subgraph bb1
50 + bb1_instrs["
51 + [2] Const mutate $6 = 10
52 + [3] Const mutate $8 = Binary read x$5 < read $6
53 + "]
54 + bb1_instrs --> bb1_terminal(["If (read $8)"])
55 + end
56 +
57 + subgraph bb3
58 + bb3_instrs["
59 + [4] Const mutate $9 = 1
60 + [5] Binary read x$5 + read $9
61 + "]
62 + bb3_instrs --> bb3_terminal(["Goto"])
63 + end
64 +
65 + subgraph bb2
66 + bb2_terminal(["Return read x$5"])
67 + end
68 +
69 +
70 + %% Jumps
71 + bb0_terminal -- test --> bb1
72 + bb0_terminal -- loop --> bb3
73 + bb0_terminal -- fallthrough --> bb2
74 +
75 + bb1_terminal -- then --> bb3
76 + bb1_terminal -- else --> bb2
77 +
78 + bb3_terminal --> bb1
79 +
80 +```
81 +
82 ## Code
83
84 ```javascript
compiler/forget/src/__tests__/fixtures/hir/ssa-while.expect.md
+45
@@ -34,6 +34,51 @@ bb2:
34 Return read x$1
35 ```
36
37 +### CFG
38 +
39 +```mermaid
40 +flowchart TB
41 + %% Basic Blocks
42 + subgraph bb0
43 + bb0_instrs["
44 + [1] Let mutate x$1 = 1
45 + "]
46 + bb0_instrs --> bb0_terminal(["While"])
47 + end
48 +
49 + subgraph bb1
50 + bb1_instrs["
51 + [2] Const mutate $6 = 10
52 + [3] Const mutate $8 = Binary read x$1 < read $6
53 + "]
54 + bb1_instrs --> bb1_terminal(["If (read $8)"])
55 + end
56 +
57 + subgraph bb3
58 + bb3_instrs["
59 + [4] Const mutate $9 = 1
60 + [5] Reassign mutate x$1 = Binary read x$1 + read $9
61 + "]
62 + bb3_instrs --> bb3_terminal(["Goto"])
63 + end
64 +
65 + subgraph bb2
66 + bb2_terminal(["Return read x$1"])
67 + end
68 +
69 +
70 + %% Jumps
71 + bb0_terminal -- test --> bb1
72 + bb0_terminal -- loop --> bb3
73 + bb0_terminal -- fallthrough --> bb2
74 +
75 + bb1_terminal -- then --> bb3
76 + bb1_terminal -- else --> bb2
77 +
78 + bb3_terminal --> bb1
79 +
80 +```
81 +
82 ## Code
83
84 ```javascript
compiler/forget/src/__tests__/fixtures/hir/switch-non-final-default.expect.md
+54
@@ -59,6 +59,60 @@ bb1:
59 Return read $22
60 ```
61
62 +### CFG
63 +
64 +```mermaid
65 +flowchart TB
66 + %% Basic Blocks
67 + subgraph bb0
68 + bb0_instrs["
69 + [1] Let mutate x$10[1:6] = Array []
70 + [2] Let mutate y$3 = undefined
71 + [3] Const mutate $12 = false
72 + [4] Const mutate $13 = true
73 + [5] Const mutate $14 = 1
74 + "]
75 + bb0_instrs --> bb0_terminal(["Switch (read props$9.p0)"])
76 + end
77 +
78 + subgraph bb6
79 + bb6_instrs["
80 + [6] Call mutate x$10.push(read props$9.p2)
81 + [7] Reassign mutate y$3 = Array []
82 + "]
83 + bb6_instrs --> bb6_terminal(["Goto"])
84 + end
85 +
86 + subgraph bb2
87 + bb2_instrs["
88 + [8] Reassign mutate y$3 = read x$10
89 + "]
90 + bb2_instrs --> bb2_terminal(["Goto"])
91 + end
92 +
93 + subgraph bb1
94 + bb1_instrs["
95 + [9] Const mutate child$19 = JSX <read Component$0 data={freeze x$10} ></read Component$0>
96 + [10] Call read y$3.push(read props$9.p4)
97 + [11] Const mutate $22 = JSX <read Component$0 data={freeze y$3} >{read child$19}</read Component$0>
98 + "]
99 + bb1_instrs --> bb1_terminal(["Return read $22"])
100 + end
101 +
102 +
103 + %% Jumps
104 + bb0_terminal -- read $14 --> bb1
105 + bb0_terminal -- read $13 --> bb6
106 + bb0_terminal -- default --> bb1
107 + bb0_terminal -- read $12 --> bb2
108 + bb0_terminal -- fallthrough --> bb1
109 +
110 + bb6_terminal --> bb1
111 +
112 + bb2_terminal --> bb1
113 +
114 +```
115 +
116 ## Code
117
118 ```javascript
compiler/forget/src/__tests__/fixtures/hir/switch-with-fallthrough.expect.md
+89
@@ -80,6 +80,95 @@ bb1:
80 Return
81 ```
82
83 +### CFG
84 +
85 +```mermaid
86 +flowchart TB
87 + %% Basic Blocks
88 + subgraph bb0
89 + bb0_instrs["
90 + [1] Let mutate y$10 = undefined
91 + [2] Const mutate $11 = 5
92 + [3] Const mutate $12 = 4
93 + [4] Const mutate $13 = 3
94 + [5] Const mutate $14 = 2
95 + [6] Const mutate $15 = 1
96 + [7] Const mutate $16 = 0
97 + "]
98 + bb0_instrs --> bb0_terminal(["Switch (read x$9)"])
99 + end
100 +
101 + subgraph bb10
102 + bb10_instrs["
103 + [8] Reassign mutate y$17 = 0
104 + "]
105 + bb10_instrs --> bb10_terminal(["Goto"])
106 + end
107 +
108 + subgraph bb9
109 + bb9_instrs["
110 + [9] Reassign mutate y$18 = 1
111 + "]
112 + bb9_instrs --> bb9_terminal(["Goto"])
113 + end
114 +
115 + subgraph bb5
116 + bb5_instrs["
117 + [10] Reassign mutate y$19 = 3
118 + "]
119 + bb5_instrs --> bb5_terminal(["Goto"])
120 + end
121 +
122 + subgraph bb4
123 + bb4_instrs["
124 + [11] Reassign mutate y$20 = 4
125 + "]
126 + bb4_instrs --> bb4_terminal(["Goto"])
127 + end
128 +
129 + subgraph bb3
130 + bb3_instrs["
131 + [12] Reassign mutate y$21 = 5
132 + "]
133 + bb3_instrs --> bb3_terminal(["Goto"])
134 + end
135 +
136 + subgraph bb2
137 + bb2_instrs["
138 + [13] Reassign mutate y$22 = 0
139 + "]
140 + bb2_instrs --> bb2_terminal(["Goto"])
141 + end
142 +
143 + subgraph bb1
144 + bb1_terminal(["Return"])
145 + end
146 +
147 +
148 + %% Jumps
149 + bb0_terminal -- read $16 --> bb10
150 + bb0_terminal -- read $15 --> bb9
151 + bb0_terminal -- read $14 --> bb1
152 + bb0_terminal -- read $13 --> bb5
153 + bb0_terminal -- read $12 --> bb4
154 + bb0_terminal -- read $11 --> bb3
155 + bb0_terminal -- default --> bb2
156 + bb0_terminal -- fallthrough --> bb1
157 +
158 + bb10_terminal --> bb9
159 +
160 + bb9_terminal --> bb1
161 +
162 + bb5_terminal --> bb1
163 +
164 + bb4_terminal --> bb3
165 +
166 + bb3_terminal --> bb2
167 +
168 + bb2_terminal --> bb1
169 +
170 +```
171 +
172 ## Code
173
174 ```javascript
compiler/forget/src/__tests__/fixtures/hir/switch.expect.md
+53
@@ -54,6 +54,59 @@ bb1:
54 Return read $23
55 ```
56
57 +### CFG
58 +
59 +```mermaid
60 +flowchart TB
61 + %% Basic Blocks
62 + subgraph bb0
63 + bb0_instrs["
64 + [1] Let mutate x$9[1:6] = Array []
65 + [2] Let mutate y$3 = undefined
66 + [3] Const mutate $11 = false
67 + [4] Const mutate $12 = true
68 + "]
69 + bb0_instrs --> bb0_terminal(["Switch (read props$8.p0)"])
70 + end
71 +
72 + subgraph bb4
73 + bb4_instrs["
74 + [5] Call mutate x$9.push(read props$8.p2)
75 + [6] Call mutate x$9.push(read props$8.p3)
76 + [7] Reassign mutate y$13 = Array []
77 + "]
78 + bb4_instrs --> bb4_terminal(["Goto"])
79 + end
80 +
81 + subgraph bb2
82 + bb2_instrs["
83 + [8] Reassign mutate y$3 = read x$9
84 + "]
85 + bb2_instrs --> bb2_terminal(["Goto"])
86 + end
87 +
88 + subgraph bb1
89 + bb1_instrs["
90 + [9] Const mutate child$19 = JSX <read Component$0 data={freeze x$9} ></read Component$0>
91 + [10] Call read y$3.push(read props$8.p4)
92 + [11] Const mutate $23 = JSX <read Component$0 data={read y$3} >{read child$19}</read Component$0>
93 + "]
94 + bb1_instrs --> bb1_terminal(["Return read $23"])
95 + end
96 +
97 +
98 + %% Jumps
99 + bb0_terminal -- read $12 --> bb4
100 + bb0_terminal -- read $11 --> bb2
101 + bb0_terminal -- default --> bb1
102 + bb0_terminal -- fallthrough --> bb1
103 +
104 + bb4_terminal --> bb2
105 +
106 + bb2_terminal --> bb1
107 +
108 +```
109 +
110 ## Code
111
112 ```javascript
compiler/forget/src/__tests__/fixtures/hir/while-break.expect.md
+28
@@ -24,6 +24,34 @@ bb2:
24 Return read b$4
25 ```
26
27 +### CFG
28 +
29 +```mermaid
30 +flowchart TB
31 + %% Basic Blocks
32 + subgraph bb0
33 + bb0_terminal(["While"])
34 + end
35 +
36 + subgraph bb1
37 + bb1_terminal(["If (read a$3)"])
38 + end
39 +
40 + subgraph bb2
41 + bb2_terminal(["Return read b$4"])
42 + end
43 +
44 +
45 + %% Jumps
46 + bb0_terminal -- test --> bb1
47 + bb0_terminal -- loop --> bb2
48 + bb0_terminal -- fallthrough --> bb2
49 +
50 + bb1_terminal -- then --> bb2
51 + bb1_terminal -- else --> bb2
52 +
53 +```
54 +
55 ## Code
56
57 ```javascript
compiler/forget/src/__tests__/fixtures/hir/while-conditional-continue.expect.md
+53
@@ -39,6 +39,59 @@ bb2:
39 Return
40 ```
41
42 +### CFG
43 +
44 +```mermaid
45 +flowchart TB
46 + %% Basic Blocks
47 + subgraph bb0
48 + bb0_terminal(["While"])
49 + end
50 +
51 + subgraph bb1
52 + bb1_terminal(["If (read a$5)"])
53 + end
54 +
55 + subgraph bb3
56 + bb3_terminal(["If (read b$6)"])
57 + end
58 +
59 + subgraph bb5
60 + bb5_terminal(["Goto"])
61 + end
62 +
63 + subgraph bb4
64 + bb4_instrs["
65 + [1] Call read c$7()
66 + "]
67 + bb4_instrs --> bb4_terminal(["Goto"])
68 + end
69 +
70 + subgraph bb2
71 + bb2_instrs["
72 + [2] Call read d$8()
73 + "]
74 + bb2_instrs --> bb2_terminal(["Return"])
75 + end
76 +
77 +
78 + %% Jumps
79 + bb0_terminal -- test --> bb1
80 + bb0_terminal -- loop --> bb3
81 + bb0_terminal -- fallthrough --> bb2
82 +
83 + bb1_terminal -- then --> bb3
84 + bb1_terminal -- else --> bb2
85 +
86 + bb3_terminal -- then --> bb5
87 + bb3_terminal -- else --> bb4
88 +
89 + bb5_terminal --> bb1
90 +
91 + bb4_terminal --> bb1
92 +
93 +```
94 +
95 ## Code
96
97 ```javascript
compiler/forget/src/__tests__/hir-test.ts
+9 -3
@@ -24,6 +24,7 @@ import { inferMutableRanges } from "../HIR/InferMutableLifetimes";
24 import inferReferenceEffects from "../HIR/InferReferenceEffects";
25 import leaveSSA from "../HIR/LeaveSSA";
26 import printHIR from "../HIR/PrintHIR";
27 +import visualizeHIRMermaid from "../HIR/VisualizeHIRMermaid";
28 import generateTestsFromFixtures from "./test-utils/generateTestsFromFixtures";
29
30 function wrapWithTripleBackticks(s: string, ext?: string) {
@@ -59,7 +60,7 @@ describe("React Forget (HIR version)", () => {
60 sourceFilename: file,
61 plugins: ["typescript", "jsx"],
62 });
62 - let items: Array<[string, string]> = [];
63 + let items: Array<[string, string, string]> = [];
64 traverse(ast, {
65 FunctionDeclaration: {
66 enter(nodePath) {
@@ -71,6 +72,7 @@ describe("React Forget (HIR version)", () => {
72 inferMutableRanges(ir);
73 leaveSSA(ir);
74 const textHIR = printHIR(ir.body);
75 + const visualization = visualizeHIRMermaid(ir);
76
77 const ast = codegen(ir);
78 const text = prettier.format(
@@ -80,7 +82,7 @@ describe("React Forget (HIR version)", () => {
82 parser: "babel-ts",
83 }
84 );
83 - items.push([textHIR, text]);
85 + items.push([textHIR, text, visualization]);
86 },
87 },
88 });
@@ -88,12 +90,16 @@ describe("React Forget (HIR version)", () => {
90 items.length > 0,
91 "Visitor failed, check that the input has a function"
92 );
91 - const outputs = items.map(([hir, text]) => {
93 + const outputs = items.map(([hir, text, visualization]) => {
94 return `
95 ## HIR
96
97 ${wrapWithTripleBackticks(hir)}
98
99 +### CFG
100 +
101 +${wrapWithTripleBackticks(visualization, "mermaid")}
102 +
103 ## Code
104
105 ${wrapWithTripleBackticks(text, "javascript")}