Infer sets of variables in each reactive scope

Adds a new pass `InferReactiveScopeVariables` which determines the sets of 
variables (by Identifier) which "construct together" and belong in the same 
reactive scope. Concretely, `Identifier` gets a new property `scope: ScopeId`, 
and this pass assigns each identifier a ScopeId value. The algorithm iterates 
over all instructions in all blocks (in a single pass) and builds up disjoint 
sets of identifiers that appear as mutable operands in the same instruction. 

The algorithm is relatively simple (especially since I had already implemented a 
union-find data structure): however looking at some examples reinforced that 
other planned todos around alias analysis are really important. We also have to 
think more about what "mutable lifetime" means in the context of SSA: currently 
variables that are reassigned (but never "mutated", eg bc they're assigned a 
value type) never appear as mutable.
This commit is contained in:
Joe Savona
2022-11-15 14:26:18 -08:00
parent e6956bd4d8
commit 4a21bb8856
61 changed files with 1223 additions and 909 deletions
+7 -7
View File
@@ -22,7 +22,7 @@ export default class DisjointSet<T> {
const first = items.shift();
invariant(first != null, "Expected set to be non-empty");
// determine an arbitrary "root" for this set: if the first
// item already has a root use that, otherwise the first item
// item already has a root then use that, otherwise the first item
// will be the new root.
let root = this.#entries.get(first);
if (root == null) {
@@ -31,19 +31,19 @@ export default class DisjointSet<T> {
}
// update remaining items (which may already be part of other sets)
for (const item of items) {
let parent = this.#entries.get(item);
if (parent == null) {
let itemParent = this.#entries.get(item);
if (itemParent == null) {
// new item, no existing set to update
this.#entries.set(item, root);
continue;
} else if (parent === root) {
} else if (itemParent === root) {
continue;
} else {
let current = item;
while (parent !== root && parent !== current) {
while (itemParent !== root) {
this.#entries.set(current, root);
current = parent;
parent = this.#entries.get(current)!;
current = itemParent;
itemParent = this.#entries.get(current)!;
}
}
}
+1
View File
@@ -56,6 +56,7 @@ class SSABuilder {
start: 0,
end: 0,
},
scope: null, // reset along w the mutable range
};
}
+10 -3
View File
@@ -277,10 +277,17 @@ export type MutableRange = {
* Represents a user-defined variable (has a name) or a temporary variable (no name).
*/
export type Identifier = {
preSsaId: IdentifierId | null; // the original `id` value prior to entering SSA form
id: IdentifierId; // unique value to distinguish a variable, since name is not guaranteed to exist or be unique
name: string | null; // null for temporaries. name is primarily used for debugging.
// the original `id` value prior to entering SSA form
preSsaId: IdentifierId | null;
// unique value to distinguish a variable, since name is not guaranteed to exist or be unique
id: IdentifierId;
// null for temporaries. name is primarily used for debugging.
name: string | null;
// The range for which this variable is mutable
mutableRange: MutableRange;
// The ID of the reactive scope which will compute this value. Multiple variables may have
// the same scope id.
scope: ScopeId | null;
};
/**
+2
View File
@@ -113,6 +113,7 @@ export default class HIRBuilder {
id,
name: null,
mutableRange: { start: 0, end: 0 },
scope: null,
};
}
@@ -125,6 +126,7 @@ export default class HIRBuilder {
id,
name: node.name,
mutableRange: { start: 0, end: 0 },
scope: null,
};
this.#bindings.set(node, identifier);
}
@@ -0,0 +1,125 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import DisjointSet from "./DisjointSet";
import {
HIRFunction,
Identifier,
Instruction,
makeScopeId,
Place,
ScopeId,
} from "./HIR";
import { eachInstructionOperand } from "./visitors";
/**
* For each mutable variable, infers a reactive scope which will construct that
* variable. Variables that co-mutate are assigned to the same reactive scope.
* This pass does *not* infer the set of instructions necessary to compute each
* variable/scope, only the set of variables that will be computed by each scope.
*
* Examples:
* ```javascript
* // Mutable arguments
* let x = {};
* let y = [];
* foo(x, y); // both args mutable, could alias each other
* y.push(x); // y is part of callee, counts as operand
*
* let z = {};
* y.push(z);
*
* // Mutable assignment
* let x = {};
* let y = [];
* x.y = y; // trivial aliasing
* ```
*
* More generally, all mutable operands (incl lvalue) of an instruction must go in the
* same scope.
*
* ## Implementation
*
* 1. Iterate over all instructions in all blocks (order does not matter, single pass),
* and create disjoint sets ({@link DisjointSet}) for each set of operands that
* mutate together per above rules.
* 2. Iterate the contents of each set, and assign a new {@link ScopeId} to each set,
* and update the `scope` property of each item in that set to that scope id.
*
* ## Other Issues Uncovered
*
* 1. Mutable lifetimes need to account for aliasing.
*
* ```javascript
* let x = {};
* let y = [];
* x.y = y; // RHS is not considered mutable here bc not further mutation
* mutate(x); // bc y is aliased here, it should still be considered mutable above
* ```
*
* 2. Mutable lifetimes need to account for SSA reassignment.
*
* ```javascript
* // y is never considered mutable bc SSA treats subsequent assignments as distinct identifiers
* let y;
* if (cond) {
* y = ...;
* } else {
* y = ...;
* }
* ```
*/
export function inferReactiveScopeVariables(fn: HIRFunction) {
// Represents the set of reactive scopes as disjoint sets of identifiers
// that mutate together.
const scopes = new DisjointSet<Identifier>();
for (const [_, block] of fn.body.blocks) {
for (const instr of block.instructions) {
const operands: Array<Identifier> = [];
if (instr.lvalue !== null) {
// invariant(
// isMutable(instr, instr.lvalue!.place),
// "Assignment always means the value is mutable:\n" +
// printMixedHIR(instr)
// );
operands.push(instr.lvalue!.place.identifier);
}
for (const operand of eachInstructionOperand(instr)) {
if (isMutable(instr, operand)) {
operands.push(operand.identifier);
}
}
if (operands.length !== 0) {
scopes.union(operands);
}
}
}
// Maps each scope (by its identifying member) to a ScopeId value
const scopeIds: Map<Identifier, ScopeId> = new Map();
// Iterate over all the identifiers in all scopes, and assign each
// identifier to its group's scope id. The first identifier in each
// group assigns the scope id for that group.
scopes.forEach((identifier, groupIdentifier) => {
let scopeId = scopeIds.get(groupIdentifier);
if (scopeId == null) {
scopeId = makeScopeId(scopeIds.size);
scopeIds.set(groupIdentifier, scopeId);
}
identifier.scope = scopeId;
});
}
// Is the operand mutable at this given instruction
function isMutable(instr: Instruction, place: Place): boolean {
return (
// TODO: should start really be exclusive?
instr.id > place.identifier.mutableRange.start &&
instr.id <= place.identifier.mutableRange.end
);
}
+3 -1
View File
@@ -296,7 +296,9 @@ export function printPlace(place: Place): string {
}
export function printIdentifier(id: Identifier): string {
return `${id.name ?? ""}\$${id.id}`;
return `${id.name ?? ""}\$${id.id}${
id.scope !== null ? `_@${id.scope}` : ""
}`;
}
export function printSourceLocation(loc: SourceLocation): string {
@@ -20,13 +20,13 @@ function g(a) {
```
bb0:
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $3 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $3
[6] Const mutate $4 = 1
[7] Reassign mutate x$1 = Binary read x$1 >>> read $4
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Reassign mutate x$1_@2 = Binary read x$1_@0 + read $2_@1
[4] Const mutate $3_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1_@2 + read $3_@3
[6] Const mutate $4_@5 = 1
[7] Reassign mutate x$1_@6 = Binary read x$1_@4 >>> read $4_@5
Return
```
@@ -37,13 +37,13 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $3 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $3
[6] Const mutate $4 = 1
[7] Reassign mutate x$1 = Binary read x$1 >>> read $4
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Reassign mutate x$1_@2 = Binary read x$1_@0 + read $2_@1
[4] Const mutate $3_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1_@2 + read $3_@3
[6] Const mutate $4_@5 = 1
[7] Reassign mutate x$1_@6 = Binary read x$1_@4 >>> read $4_@5
"]
bb0_instrs --> bb0_terminal(["Return"])
end
@@ -68,10 +68,10 @@ function f$0() {
```
bb0:
[1] Const mutate $2 = 1
[2] Reassign mutate a$1.b.c[0:4] = Binary read a$1.b.c + read $2
[3] Const mutate $3 = 2
[4] Reassign mutate a$1.b.c[0:4] = Binary read a$1.b.c * read $3
[1] Const mutate $2_@0 = 1
[2] Reassign mutate a$1_@1.b.c[0:4] = Binary read a$1_@1.b.c + read $2_@0
[3] Const mutate $3_@2 = 2
[4] Reassign mutate a$1_@1.b.c[0:4] = Binary read a$1_@1.b.c * read $3_@2
Return
```
@@ -82,10 +82,10 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate $2 = 1
[2] Reassign mutate a$1.b.c[0:4] = Binary read a$1.b.c + read $2
[3] Const mutate $3 = 2
[4] Reassign mutate a$1.b.c[0:4] = Binary read a$1.b.c * read $3
[1] Const mutate $2_@0 = 1
[2] Reassign mutate a$1_@1.b.c[0:4] = Binary read a$1_@1.b.c + read $2_@0
[3] Const mutate $3_@2 = 2
[4] Reassign mutate a$1_@1.b.c[0:4] = Binary read a$1_@1.b.c * read $3_@2
"]
bb0_instrs --> bb0_terminal(["Return"])
end
@@ -47,15 +47,15 @@ function foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = "div"
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] Call mutate foo$4(mutate b$3)
[7] Const mutate $7 = "div"
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
Return read $8
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = "div"
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] Call mutate foo$4_@0(mutate b$3_@0)
[7] Const mutate $7_@3 = "div"
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
Return read $8_@4
```
### CFG
@@ -65,16 +65,16 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = 'div'
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] Call mutate foo$4(mutate b$3)
[7] Const mutate $7 = 'div'
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = 'div'
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] Call mutate foo$4_@0(mutate b$3_@0)
[7] Const mutate $7_@3 = 'div'
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
"]
bb0_instrs --> bb0_terminal(["Return read $8"])
bb0_instrs --> bb0_terminal(["Return read $8_@4"])
end
%% Jumps
@@ -35,28 +35,28 @@ function Component(props) {
```
bb0:
[1] Const mutate items$2 = read props$1.items
[2] Const mutate maxItems$3 = read props$1.maxItems
[3] Const mutate renderedItems$4[3:14] = Array []
[4] Const mutate seen$5[4:11] = New mutate Set$6()
[5] Const mutate $9 = 0
[6] Const mutate max$7 = Call mutate Math$8.max(read $9, read maxItems$3)
[1] Const mutate items$2_@0 = read props$1.items
[2] Const mutate maxItems$3_@1 = read props$1.maxItems
[3] Const mutate renderedItems$4_@2[3:14] = Array []
[4] Const mutate seen$5_@3[4:11] = New mutate Set$6_@3()
[5] Const mutate $9_@4 = 0
[6] Const mutate max$7_@5 = Call mutate Math$8_@5.max(read $9_@4, read maxItems$3_@1)
Goto bb1
bb1:
predecessor blocks: bb0 bb5 bb10
If (read items$2) then:bb3 else:bb2
If (read items$2_@0) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[7] Const mutate $11 = null
[8] Const mutate $12 = Binary read item$10 == read $11
If (read $12) then:bb8 else:bb9
[7] Const mutate $11_@6 = null
[8] Const mutate $12_@3 = Binary read item$10_@3 == read $11_@6
If (read $12_@3) then:bb8 else:bb9
bb8:
predecessor blocks: bb3
[9] Const mutate $13 = read $12
[9] Const mutate $13_@7 = read $12_@3
Goto bb7
bb9:
predecessor blocks: bb3
[10] Const mutate $13 = Call mutate seen$5.has(mutate item$10)
[10] Const mutate $13_@3 = Call mutate seen$5_@3.has(mutate item$10_@3)
Goto bb7
bb7:
predecessor blocks: bb8 bb9
@@ -66,27 +66,27 @@ bb5:
Goto(Continue) bb1
bb4:
predecessor blocks: bb7
[11] Call mutate seen$5.add(mutate item$10)
[12] Const mutate $14 = "div"
[13] Const mutate $15 = JSX <read $14>{read item$10}</read $14>
[14] Call mutate renderedItems$4.push(read $15)
[15] Const mutate $16 = Binary read renderedItems$4.length >= read max$7
If (read $16) then:bb2 else:bb10
[11] Call mutate seen$5_@3.add(mutate item$10_@3)
[12] Const mutate $14_@8 = "div"
[13] Const mutate $15_@9 = JSX <read $14_@8>{read item$10_@3}</read $14_@8>
[14] Call mutate renderedItems$4_@2.push(read $15_@9)
[15] Const mutate $16_@10 = Binary read renderedItems$4_@2.length >= read max$7_@5
If (read $16_@10) then:bb2 else:bb10
bb10:
predecessor blocks: bb4
Goto(Continue) bb1
bb2:
predecessor blocks: bb4 bb1
[16] Const mutate count$17 = read renderedItems$4.length
[17] Const mutate $18 = "div"
[18] Const mutate $19 = "\n "
[19] Const mutate $20 = "h1"
[20] Const mutate $21 = " Items"
[21] Const mutate $22 = JSX <read $20>{freeze count$17}{read $21}</read $20>
[22] Const mutate $23 = "\n "
[23] Const mutate $24 = "\n "
[24] Const mutate $25 = JSX <read $18>{read $19}{read $22}{read $23}{freeze renderedItems$4}{read $24}</read $18>
Return read $25
[16] Const mutate count$17_@11 = read renderedItems$4_@2.length
[17] Const mutate $18_@12 = "div"
[18] Const mutate $19_@13 = "\n "
[19] Const mutate $20_@14 = "h1"
[20] Const mutate $21_@15 = " Items"
[21] Const mutate $22_@16 = JSX <read $20_@14>{freeze count$17_@11}{read $21_@15}</read $20_@14>
[22] Const mutate $23_@17 = "\n "
[23] Const mutate $24_@18 = "\n "
[24] Const mutate $25_@19 = JSX <read $18_@12>{read $19_@13}{read $22_@16}{read $23_@17}{freeze renderedItems$4_@2}{read $24_@18}</read $18_@12>
Return read $25_@19
```
### CFG
@@ -96,34 +96,34 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate items$2 = read props$1.items
[2] Const mutate maxItems$3 = read props$1.maxItems
[3] Const mutate renderedItems$4[3:14] = Array []
[4] Const mutate seen$5[4:11] = New mutate Set$6()
[5] Const mutate $9 = 0
[6] Const mutate max$7 = Call mutate Math$8.max(read $9, read maxItems$3)
[1] Const mutate items$2_@0 = read props$1.items
[2] Const mutate maxItems$3_@1 = read props$1.maxItems
[3] Const mutate renderedItems$4_@2[3:14] = Array []
[4] Const mutate seen$5_@3[4:11] = New mutate Set$6_@3()
[5] Const mutate $9_@4 = 0
[6] Const mutate max$7_@5 = Call mutate Math$8_@5.max(read $9_@4, read maxItems$3_@1)
"]
bb0_instrs --> bb0_terminal(["Goto"])
end
subgraph bb1
bb1_terminal(["If (read items$2)"])
bb1_terminal(["If (read items$2_@0)"])
end
subgraph bb3
bb3_instrs["
[7] Const mutate $11 = null
[8] Const mutate $12 = Binary read item$10 == read $11
[7] Const mutate $11_@6 = null
[8] Const mutate $12_@3 = Binary read item$10_@3 == read $11_@6
"]
bb3_instrs --> bb3_terminal(["If (read $12)"])
bb3_instrs --> bb3_terminal(["If (read $12_@3)"])
end
subgraph bb8
bb8_instrs["
[9] Const mutate $13 = read $12
[9] Const mutate $13_@7 = read $12_@3
"]
bb8_instrs --> bb8_terminal(["Goto"])
end
subgraph bb9
bb9_instrs["
[10] Const mutate $13 = Call mutate seen$5.has(mutate item$10)
[10] Const mutate $13_@3 = Call mutate seen$5_@3.has(mutate item$10_@3)
"]
bb9_instrs --> bb9_terminal(["Goto"])
end
@@ -135,30 +135,30 @@ flowchart TB
end
subgraph bb4
bb4_instrs["
[11] Call mutate seen$5.add(mutate item$10)
[12] Const mutate $14 = 'div'
[13] Const mutate $15 = JSX <read $14>{read item$10}</read $14>
[14] Call mutate renderedItems$4.push(read $15)
[15] Const mutate $16 = Binary read renderedItems$4.length >= read max$7
[11] Call mutate seen$5_@3.add(mutate item$10_@3)
[12] Const mutate $14_@8 = 'div'
[13] Const mutate $15_@9 = JSX <read $14_@8>{read item$10_@3}</read $14_@8>
[14] Call mutate renderedItems$4_@2.push(read $15_@9)
[15] Const mutate $16_@10 = Binary read renderedItems$4_@2.length >= read max$7_@5
"]
bb4_instrs --> bb4_terminal(["If (read $16)"])
bb4_instrs --> bb4_terminal(["If (read $16_@10)"])
end
subgraph bb10
bb10_terminal(["Goto"])
end
subgraph bb2
bb2_instrs["
[16] Const mutate count$17 = read renderedItems$4.length
[17] Const mutate $18 = 'div'
[18] Const mutate $19 = '\n '
[19] Const mutate $20 = 'h1'
[20] Const mutate $21 = ' Items'
[21] Const mutate $22 = JSX <read $20>{freeze count$17}{read $21}</read $20>
[22] Const mutate $23 = '\n '
[23] Const mutate $24 = '\n '
[24] Const mutate $25 = JSX <read $18>{read $19}{read $22}{read $23}{freeze renderedItems$4}{read $24}</read $18>
[16] Const mutate count$17_@11 = read renderedItems$4_@2.length
[17] Const mutate $18_@12 = 'div'
[18] Const mutate $19_@13 = '\n '
[19] Const mutate $20_@14 = 'h1'
[20] Const mutate $21_@15 = ' Items'
[21] Const mutate $22_@16 = JSX <read $20_@14>{freeze count$17_@11}{read $21_@15}</read $20_@14>
[22] Const mutate $23_@17 = '\n '
[23] Const mutate $24_@18 = '\n '
[24] Const mutate $25_@19 = JSX <read $18_@12>{read $19_@13}{read $22_@16}{read $23_@17}{freeze renderedItems$4_@2}{read $24_@18}</read $18_@12>
"]
bb2_instrs --> bb2_terminal(["Return read $25"])
bb2_instrs --> bb2_terminal(["Return read $25_@19"])
end
%% Jumps
@@ -78,17 +78,17 @@ function Component(props) {
```
bb0:
[1] Const mutate a_DEBUG$2[1:4] = Array []
[2] Call mutate a_DEBUG$2.push(read props$1.a)
[1] Const mutate a_DEBUG$2_@0[1:4] = Array []
[2] Call mutate a_DEBUG$2_@0.push(read props$1.a)
If (read props$1.b) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Const mutate $3 = null
Return read $3
[3] Const mutate $3_@1 = null
Return read $3_@1
bb1:
predecessor blocks: bb0
[4] Call mutate a_DEBUG$2.push(read props$1.d)
Return freeze a_DEBUG$2
[4] Call mutate a_DEBUG$2_@0.push(read props$1.d)
Return freeze a_DEBUG$2_@0
```
### CFG
@@ -98,22 +98,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a_DEBUG$2[1:4] = Array []
[2] Call mutate a_DEBUG$2.push(read props$1.a)
[1] Const mutate a_DEBUG$2_@0[1:4] = Array []
[2] Call mutate a_DEBUG$2_@0.push(read props$1.a)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.b)"])
end
subgraph bb2
bb2_instrs["
[3] Const mutate $3 = null
[3] Const mutate $3_@1 = null
"]
bb2_instrs --> bb2_terminal(["Return read $3"])
bb2_instrs --> bb2_terminal(["Return read $3_@1"])
end
subgraph bb1
bb1_instrs["
[4] Call mutate a_DEBUG$2.push(read props$1.d)
[4] Call mutate a_DEBUG$2_@0.push(read props$1.d)
"]
bb1_instrs --> bb1_terminal(["Return freeze a_DEBUG$2"])
bb1_instrs --> bb1_terminal(["Return freeze a_DEBUG$2_@0"])
end
%% Jumps
@@ -141,17 +141,17 @@ function Component$0(props$1) {
```
bb0:
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
If (read props$1.b) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate a$2.push(read props$1.c)
[3] Call mutate a$2_@0.push(read props$1.c)
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[4] Call mutate a$2.push(read props$1.d)
Return freeze a$2
[4] Call mutate a$2_@0.push(read props$1.d)
Return freeze a$2_@0
```
### CFG
@@ -161,22 +161,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.b)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate a$2.push(read props$1.c)
[3] Call mutate a$2_@0.push(read props$1.c)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[4] Call mutate a$2.push(read props$1.d)
[4] Call mutate a$2_@0.push(read props$1.d)
"]
bb1_instrs --> bb1_terminal(["Return freeze a$2"])
bb1_instrs --> bb1_terminal(["Return freeze a$2_@0"])
end
%% Jumps
@@ -205,18 +205,18 @@ function Component$0(props$1) {
```
bb0:
[1] Const mutate a$2[1:5] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:5] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
If (read props$1.b) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate a$2.push(read props$1.c)
[4] Const mutate $3 = null
Return read $3
[3] Call mutate a$2_@0.push(read props$1.c)
[4] Const mutate $3_@1 = null
Return read $3_@1
bb1:
predecessor blocks: bb0
[5] Call mutate a$2.push(read props$1.d)
Return freeze a$2
[5] Call mutate a$2_@0.push(read props$1.d)
Return freeze a$2_@0
```
### CFG
@@ -226,23 +226,23 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:5] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:5] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.b)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate a$2.push(read props$1.c)
[4] Const mutate $3 = null
[3] Call mutate a$2_@0.push(read props$1.c)
[4] Const mutate $3_@1 = null
"]
bb2_instrs --> bb2_terminal(["Return read $3"])
bb2_instrs --> bb2_terminal(["Return read $3_@1"])
end
subgraph bb1
bb1_instrs["
[5] Call mutate a$2.push(read props$1.d)
[5] Call mutate a$2_@0.push(read props$1.d)
"]
bb1_instrs --> bb1_terminal(["Return freeze a$2"])
bb1_instrs --> bb1_terminal(["Return freeze a$2_@0"])
end
%% Jumps
@@ -271,17 +271,17 @@ function Component$0(props$1) {
```
bb0:
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
If (read props$1.b) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate a$2.push(read props$1.c)
Return freeze a$2
[3] Call mutate a$2_@0.push(read props$1.c)
Return freeze a$2_@0
bb1:
predecessor blocks: bb0
[4] Call mutate a$2.push(read props$1.d)
Return freeze a$2
[4] Call mutate a$2_@0.push(read props$1.d)
Return freeze a$2_@0
```
### CFG
@@ -291,22 +291,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.b)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate a$2.push(read props$1.c)
[3] Call mutate a$2_@0.push(read props$1.c)
"]
bb2_instrs --> bb2_terminal(["Return freeze a$2"])
bb2_instrs --> bb2_terminal(["Return freeze a$2_@0"])
end
subgraph bb1
bb1_instrs["
[4] Call mutate a$2.push(read props$1.d)
[4] Call mutate a$2_@0.push(read props$1.d)
"]
bb1_instrs --> bb1_terminal(["Return freeze a$2"])
bb1_instrs --> bb1_terminal(["Return freeze a$2_@0"])
end
%% Jumps
@@ -335,17 +335,17 @@ function Component$0(props$1) {
```
bb0:
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
If (read props$1.b) then:bb1 else:bb2
bb2:
predecessor blocks: bb0
[3] Call mutate a$2.push(read props$1.c)
[3] Call mutate a$2_@0.push(read props$1.c)
Goto bb1
bb1:
predecessor blocks: bb0 bb2
[4] Call mutate a$2.push(read props$1.d)
Return freeze a$2
[4] Call mutate a$2_@0.push(read props$1.d)
Return freeze a$2_@0
```
### CFG
@@ -355,22 +355,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:4] = Array []
[2] Call mutate a$2.push(read props$1.a)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Call mutate a$2_@0.push(read props$1.a)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.b)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate a$2.push(read props$1.c)
[3] Call mutate a$2_@0.push(read props$1.c)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[4] Call mutate a$2.push(read props$1.d)
[4] Call mutate a$2_@0.push(read props$1.d)
"]
bb1_instrs --> bb1_terminal(["Return freeze a$2"])
bb1_instrs --> bb1_terminal(["Return freeze a$2_@0"])
end
%% Jumps
@@ -67,24 +67,24 @@ function mayMutate() {}
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:4] = Array []
If (read b$3) then:bb2 else:bb1
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@1[2:4] = Array []
If (read b$3_@1) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate a$2.push(read props$1.p0)
[3] Call mutate a$2_@0.push(read props$1.p0)
Goto bb1
bb1:
predecessor blocks: bb2 bb0
If (read props$1.p1) then:bb4 else:bb3
bb4:
predecessor blocks: bb1
[4] Call mutate b$3.push(read props$1.p2)
[4] Call mutate b$3_@1.push(read props$1.p2)
Goto bb3
bb3:
predecessor blocks: bb4 bb1
[5] Const mutate $5 = JSX <read Foo$4 a={freeze a$2} b={freeze b$3} ></read Foo$4>
Return read $5
[5] Const mutate $5_@2 = JSX <read Foo$4 a={freeze a$2_@0} b={freeze b$3_@1} ></read Foo$4>
Return read $5_@2
```
### CFG
@@ -94,14 +94,14 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:4] = Array []
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@1[2:4] = Array []
"]
bb0_instrs --> bb0_terminal(["If (read b$3)"])
bb0_instrs --> bb0_terminal(["If (read b$3_@1)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate a$2.push(read props$1.p0)
[3] Call mutate a$2_@0.push(read props$1.p0)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -110,15 +110,15 @@ flowchart TB
end
subgraph bb4
bb4_instrs["
[4] Call mutate b$3.push(read props$1.p2)
[4] Call mutate b$3_@1.push(read props$1.p2)
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[5] Const mutate $5 = JSX <read Foo$4 a={freeze a$2} b={freeze b$3} ></read Foo$4>
[5] Const mutate $5_@2 = JSX <read Foo$4 a={freeze a$2_@0} b={freeze b$3_@1} ></read Foo$4>
"]
bb3_instrs --> bb3_terminal(["Return read $5"])
bb3_instrs --> bb3_terminal(["Return read $5_@2"])
end
%% Jumps
@@ -153,25 +153,25 @@ function Component$0(props$1) {
```
bb0:
[1] Const mutate a$2[1:4] = Array []
[2] Const mutate b$3[2:5] = Array []
[3] Const mutate $5 = Call mutate mayMutate$4(mutate b$3)
If (read $5) then:bb2 else:bb1
[1] Const mutate a$2_@0[1:4] = Array []
[2] Const mutate b$3_@1[2:5] = Array []
[3] Const mutate $5_@1 = Call mutate mayMutate$4_@1(mutate b$3_@1)
If (read $5_@1) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[4] Call mutate a$2.push(read props$1.p0)
[4] Call mutate a$2_@0.push(read props$1.p0)
Goto bb1
bb1:
predecessor blocks: bb2 bb0
If (read props$1.p1) then:bb4 else:bb3
bb4:
predecessor blocks: bb1
[5] Call mutate b$3.push(read props$1.p2)
[5] Call mutate b$3_@1.push(read props$1.p2)
Goto bb3
bb3:
predecessor blocks: bb4 bb1
[6] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$3} ></read Foo$6>
Return read $7
[6] Const mutate $7_@2 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$3_@1} ></read Foo$6>
Return read $7_@2
```
### CFG
@@ -181,15 +181,15 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:4] = Array []
[2] Const mutate b$3[2:5] = Array []
[3] Const mutate $5 = Call mutate mayMutate$4(mutate b$3)
[1] Const mutate a$2_@0[1:4] = Array []
[2] Const mutate b$3_@1[2:5] = Array []
[3] Const mutate $5_@1 = Call mutate mayMutate$4_@1(mutate b$3_@1)
"]
bb0_instrs --> bb0_terminal(["If (read $5)"])
bb0_instrs --> bb0_terminal(["If (read $5_@1)"])
end
subgraph bb2
bb2_instrs["
[4] Call mutate a$2.push(read props$1.p0)
[4] Call mutate a$2_@0.push(read props$1.p0)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -198,15 +198,15 @@ flowchart TB
end
subgraph bb4
bb4_instrs["
[5] Call mutate b$3.push(read props$1.p2)
[5] Call mutate b$3_@1.push(read props$1.p2)
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[6] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$3} ></read Foo$6>
[6] Const mutate $7_@2 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$3_@1} ></read Foo$6>
"]
bb3_instrs --> bb3_terminal(["Return read $7"])
bb3_instrs --> bb3_terminal(["Return read $7_@2"])
end
%% Jumps
@@ -47,15 +47,15 @@ function Foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] New mutate Foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = "div"
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] New mutate Foo$4(mutate b$3)
[7] Const mutate $7 = "div"
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
Return read $8
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] New mutate Foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = "div"
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] New mutate Foo$4_@0(mutate b$3_@0)
[7] Const mutate $7_@3 = "div"
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
Return read $8_@4
```
### CFG
@@ -65,16 +65,16 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] New mutate Foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = 'div'
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] New mutate Foo$4(mutate b$3)
[7] Const mutate $7 = 'div'
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] New mutate Foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = 'div'
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] New mutate Foo$4_@0(mutate b$3_@0)
[7] Const mutate $7_@3 = 'div'
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
"]
bb0_instrs --> bb0_terminal(["Return read $8"])
bb0_instrs --> bb0_terminal(["Return read $8_@4"])
end
%% Jumps
@@ -18,10 +18,10 @@ function foo(x) {}
```
bb0:
[1] Const mutate a$1 = Array []
[2] Const mutate b$2 = read a$1
[3] Call read useFreeze$3(freeze a$1)
[4] Call mutate foo$4(read b$2)
[1] Const mutate a$1_@0 = Array []
[2] Const mutate b$2_@1 = read a$1_@0
[3] Call read useFreeze$3(freeze a$1_@0)
[4] Call mutate foo$4_@2(read b$2_@1)
Return
```
@@ -32,10 +32,10 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$1 = Array []
[2] Const mutate b$2 = read a$1
[3] Call read useFreeze$3(freeze a$1)
[4] Call mutate foo$4(read b$2)
[1] Const mutate a$1_@0 = Array []
[2] Const mutate b$2_@1 = read a$1_@0
[3] Call read useFreeze$3(freeze a$1_@0)
[4] Call mutate foo$4_@2(read b$2_@1)
"]
bb0_instrs --> bb0_terminal(["Return"])
end
@@ -79,14 +79,14 @@ function foo$0() {
```
bb0:
[1] Const mutate x$2 = Array []
[2] Const mutate y$3 = Call read useFreeze$4(freeze x$2)
[3] Call mutate foo$5(read y$3, read x$2)
[4] Const mutate $6 = "\n "
[5] Const mutate $7 = "\n "
[6] Const mutate $8 = "\n "
[7] Const mutate $9 = JSX <read Component$0>{read $6}{read x$2}{read $7}{read y$3}{read $8}</read Component$0>
Return read $9
[1] Const mutate x$2_@0 = Array []
[2] Const mutate y$3_@1 = Call read useFreeze$4(freeze x$2_@0)
[3] Call mutate foo$5_@2(read y$3_@1, read x$2_@0)
[4] Const mutate $6_@3 = "\n "
[5] Const mutate $7_@4 = "\n "
[6] Const mutate $8_@5 = "\n "
[7] Const mutate $9_@6 = JSX <read Component$0>{read $6_@3}{read x$2_@0}{read $7_@4}{read y$3_@1}{read $8_@5}</read Component$0>
Return read $9_@6
```
### CFG
@@ -96,15 +96,15 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate x$2 = Array []
[2] Const mutate y$3 = Call read useFreeze$4(freeze x$2)
[3] Call mutate foo$5(read y$3, read x$2)
[4] Const mutate $6 = '\n '
[5] Const mutate $7 = '\n '
[6] Const mutate $8 = '\n '
[7] Const mutate $9 = JSX <read Component$0>{read $6}{read x$2}{read $7}{read y$3}{read $8}</read Component$0>
[1] Const mutate x$2_@0 = Array []
[2] Const mutate y$3_@1 = Call read useFreeze$4(freeze x$2_@0)
[3] Call mutate foo$5_@2(read y$3_@1, read x$2_@0)
[4] Const mutate $6_@3 = '\n '
[5] Const mutate $7_@4 = '\n '
[6] Const mutate $8_@5 = '\n '
[7] Const mutate $9_@6 = JSX <read Component$0>{read $6_@3}{read x$2_@0}{read $7_@4}{read y$3_@1}{read $8_@5}</read Component$0>
"]
bb0_instrs --> bb0_terminal(["Return read $9"])
bb0_instrs --> bb0_terminal(["Return read $9_@6"])
end
%% Jumps
@@ -19,11 +19,11 @@ function call(x) {}
```
bb0:
[1] Const mutate a$1 = Array []
[2] Call read useFreeze$2(freeze a$1)
[3] Call read useFreeze$2(read a$1)
[4] Call mutate call$3(read a$1)
Return read a$1
[1] Const mutate a$1_@0 = Array []
[2] Call read useFreeze$2(freeze a$1_@0)
[3] Call read useFreeze$2(read a$1_@0)
[4] Call mutate call$3_@1(read a$1_@0)
Return read a$1_@0
```
### CFG
@@ -33,12 +33,12 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$1 = Array []
[2] Call read useFreeze$2(freeze a$1)
[3] Call read useFreeze$2(read a$1)
[4] Call mutate call$3(read a$1)
[1] Const mutate a$1_@0 = Array []
[2] Call read useFreeze$2(freeze a$1_@0)
[3] Call read useFreeze$2(read a$1_@0)
[4] Call mutate call$3_@1(read a$1_@0)
"]
bb0_instrs --> bb0_terminal(["Return read a$1"])
bb0_instrs --> bb0_terminal(["Return read a$1_@0"])
end
%% Jumps
@@ -26,23 +26,23 @@ function call(x) {}
```
bb0:
[1] Const mutate cond$2 = read props$1.cond
[2] Const mutate x$3 = read props$1.x
[3] Let mutate a$4 = undefined
If (read cond$2) then:bb2 else:bb3
[1] Const mutate cond$2_@0 = read props$1.cond
[2] Const mutate x$3_@1 = read props$1.x
[3] Let mutate a$4_@2 = undefined
If (read cond$2_@0) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[4] Reassign mutate a$4 = read x$3
[4] Reassign mutate a$4_@3 = read x$3_@1
Goto bb1
bb3:
predecessor blocks: bb0
[5] Reassign mutate a$4 = Array []
[5] Reassign mutate a$4_@4 = Array []
Goto bb1
bb1:
predecessor blocks: bb2 bb3
[6] Call read useFreeze$5(freeze a$4)
[7] Call read useFreeze$5(read a$4)
[8] Call mutate call$6(read a$4)
[8] Call mutate call$6_@5(read a$4)
Return read a$4
```
@@ -53,21 +53,21 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate cond$2 = read props$1.cond
[2] Const mutate x$3 = read props$1.x
[3] Let mutate a$4 = undefined
[1] Const mutate cond$2_@0 = read props$1.cond
[2] Const mutate x$3_@1 = read props$1.x
[3] Let mutate a$4_@2 = undefined
"]
bb0_instrs --> bb0_terminal(["If (read cond$2)"])
bb0_instrs --> bb0_terminal(["If (read cond$2_@0)"])
end
subgraph bb2
bb2_instrs["
[4] Reassign mutate a$4 = read x$3
[4] Reassign mutate a$4_@3 = read x$3_@1
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[5] Reassign mutate a$4 = Array []
[5] Reassign mutate a$4_@4 = Array []
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -75,7 +75,7 @@ flowchart TB
bb1_instrs["
[6] Call read useFreeze$5(freeze a$4)
[7] Call read useFreeze$5(read a$4)
[8] Call mutate call$6(read a$4)
[8] Call mutate call$6_@5(read a$4)
"]
bb1_instrs --> bb1_terminal(["Return read a$4"])
end
@@ -149,18 +149,18 @@ function Foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:4] = Call mutate compute$3(read props$1.b)
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:4] = Call mutate compute$3_@0(read props$1.b)
If (read props$1.c) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate mutate$5(mutate a$2)
[4] Call mutate mutate$5(mutate b$4)
[3] Call mutate mutate$5_@0(mutate a$2_@0)
[4] Call mutate mutate$5_@0(mutate b$4_@0)
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[5] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
Return read $7
[5] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
Return read $7_@1
```
### CFG
@@ -170,23 +170,23 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:4] = Call mutate compute$3(read props$1.b)
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:4] = Call mutate compute$3_@0(read props$1.b)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.c)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate mutate$5(mutate a$2)
[4] Call mutate mutate$5(mutate b$4)
[3] Call mutate mutate$5_@0(mutate a$2_@0)
[4] Call mutate mutate$5_@0(mutate b$4_@0)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[5] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
[5] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
"]
bb1_instrs --> bb1_terminal(["Return read $7"])
bb1_instrs --> bb1_terminal(["Return read $7_@1"])
end
%% Jumps
@@ -28,10 +28,10 @@ function Foo() {}
```
bb0:
[1] Const mutate a$2 = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4 = Call mutate compute$3(read props$1.b)
[3] Const mutate $6 = JSX <read Foo$5 a={freeze a$2} b={freeze b$4} ></read Foo$5>
Return read $6
[1] Const mutate a$2_@0 = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0 = Call mutate compute$3_@0(read props$1.b)
[3] Const mutate $6_@1 = JSX <read Foo$5 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$5>
Return read $6_@1
```
### CFG
@@ -41,11 +41,11 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2 = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4 = Call mutate compute$3(read props$1.b)
[3] Const mutate $6 = JSX <read Foo$5 a={freeze a$2} b={freeze b$4} ></read Foo$5>
[1] Const mutate a$2_@0 = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0 = Call mutate compute$3_@0(read props$1.b)
[3] Const mutate $6_@1 = JSX <read Foo$5 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$5>
"]
bb0_instrs --> bb0_terminal(["Return read $6"])
bb0_instrs --> bb0_terminal(["Return read $6_@1"])
end
%% Jumps
@@ -115,17 +115,17 @@ function Foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:3] = Call mutate compute$3(read props$1.b)
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:3] = Call mutate compute$3_@0(read props$1.b)
If (read props$1.c) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Call mutate foo$5(mutate a$2, mutate b$4)
[3] Call mutate foo$5_@0(mutate a$2_@0, mutate b$4_@0)
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[4] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
Return read $7
[4] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
Return read $7_@1
```
### CFG
@@ -135,22 +135,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:3] = Call mutate compute$3(read props$1.b)
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:3] = Call mutate compute$3_@0(read props$1.b)
"]
bb0_instrs --> bb0_terminal(["If (read props$1.c)"])
end
subgraph bb2
bb2_instrs["
[3] Call mutate foo$5(mutate a$2, mutate b$4)
[3] Call mutate foo$5_@0(mutate a$2_@0, mutate b$4_@0)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[4] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
[4] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
"]
bb1_instrs --> bb1_terminal(["Return read $7"])
bb1_instrs --> bb1_terminal(["Return read $7_@1"])
end
%% Jumps
@@ -28,11 +28,11 @@ function Foo() {}
```
bb0:
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:3] = Call mutate compute$3(read props$1.b)
[3] Call mutate foo$5(mutate a$2, mutate b$4)
[4] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
Return read $7
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:3] = Call mutate compute$3_@0(read props$1.b)
[3] Call mutate foo$5_@0(mutate a$2_@0, mutate b$4_@0)
[4] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
Return read $7_@1
```
### CFG
@@ -42,12 +42,12 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Call mutate compute$3(read props$1.a)
[2] Const mutate b$4[2:3] = Call mutate compute$3(read props$1.b)
[3] Call mutate foo$5(mutate a$2, mutate b$4)
[4] Const mutate $7 = JSX <read Foo$6 a={freeze a$2} b={freeze b$4} ></read Foo$6>
[1] Const mutate a$2_@0[1:3] = Call mutate compute$3_@0(read props$1.a)
[2] Const mutate b$4_@0[2:3] = Call mutate compute$3_@0(read props$1.b)
[3] Call mutate foo$5_@0(mutate a$2_@0, mutate b$4_@0)
[4] Const mutate $7_@1 = JSX <read Foo$6 a={freeze a$2_@0} b={freeze b$4_@0} ></read Foo$6>
"]
bb0_instrs --> bb0_terminal(["Return read $7"])
bb0_instrs --> bb0_terminal(["Return read $7_@1"])
end
%% Jumps
@@ -19,18 +19,18 @@ function Foo(props) {
```
bb0:
[1] Const mutate $2 = "\n Hello "
[2] Const mutate $3 = " "
[3] Const mutate $4 = "\n "
[4] Const mutate $5 = "div"
[5] Const mutate $6 = "\n "
[6] Const mutate $7 = "Text"
[7] Const mutate $8 = JsxFragment [read $7]
[8] Const mutate $9 = "\n "
[9] Const mutate $10 = JSX <read $5>{read $6}{read $8}{read $9}</read $5>
[10] Const mutate $11 = "\n "
[11] Const mutate $12 = JsxFragment [read $2, read props$1.greeting, read $3, read $4, read $10, read $11]
Return read $12
[1] Const mutate $2_@0 = "\n Hello "
[2] Const mutate $3_@1 = " "
[3] Const mutate $4_@2 = "\n "
[4] Const mutate $5_@3 = "div"
[5] Const mutate $6_@4 = "\n "
[6] Const mutate $7_@5 = "Text"
[7] Const mutate $8_@6 = JsxFragment [read $7_@5]
[8] Const mutate $9_@7 = "\n "
[9] Const mutate $10_@8 = JSX <read $5_@3>{read $6_@4}{read $8_@6}{read $9_@7}</read $5_@3>
[10] Const mutate $11_@9 = "\n "
[11] Const mutate $12_@10 = JsxFragment [read $2_@0, read props$1.greeting, read $3_@1, read $4_@2, read $10_@8, read $11_@9]
Return read $12_@10
```
### CFG
@@ -40,19 +40,19 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate $2 = '\n Hello '
[2] Const mutate $3 = ' '
[3] Const mutate $4 = '\n '
[4] Const mutate $5 = 'div'
[5] Const mutate $6 = '\n '
[6] Const mutate $7 = 'Text'
[7] Const mutate $8 = JsxFragment [read $7]
[8] Const mutate $9 = '\n '
[9] Const mutate $10 = JSX <read $5>{read $6}{read $8}{read $9}</read $5>
[10] Const mutate $11 = '\n '
[11] Const mutate $12 = JsxFragment [read $2, read props$1.greeting, read $3, read $4, read $10, read $11]
[1] Const mutate $2_@0 = '\n Hello '
[2] Const mutate $3_@1 = ' '
[3] Const mutate $4_@2 = '\n '
[4] Const mutate $5_@3 = 'div'
[5] Const mutate $6_@4 = '\n '
[6] Const mutate $7_@5 = 'Text'
[7] Const mutate $8_@6 = JsxFragment [read $7_@5]
[8] Const mutate $9_@7 = '\n '
[9] Const mutate $10_@8 = JSX <read $5_@3>{read $6_@4}{read $8_@6}{read $9_@7}</read $5_@3>
[10] Const mutate $11_@9 = '\n '
[11] Const mutate $12_@10 = JsxFragment [read $2_@0, read props$1.greeting, read $3_@1, read $4_@2, read $10_@8, read $11_@9]
"]
bb0_instrs --> bb0_terminal(["Return read $12"])
bb0_instrs --> bb0_terminal(["Return read $12_@10"])
end
%% Jumps
@@ -23,15 +23,15 @@ function g() {}
```
bb0:
[1] Const mutate $2 = Call mutate f$1()
If (read $2) then:bb2 else:bb3
[1] Const mutate $2_@0 = Call mutate f$1_@0()
If (read $2_@0) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[2] Const mutate $3 = Call mutate g$4()
[2] Const mutate $3_@1 = Call mutate g$4_@1()
Goto bb1
bb3:
predecessor blocks: bb0
[3] Const mutate $3 = read $2
[3] Const mutate $3_@2 = read $2_@0
Goto bb1
bb1:
predecessor blocks: bb2 bb3
@@ -45,19 +45,19 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate $2 = Call mutate f$1()
[1] Const mutate $2_@0 = Call mutate f$1_@0()
"]
bb0_instrs --> bb0_terminal(["If (read $2)"])
bb0_instrs --> bb0_terminal(["If (read $2_@0)"])
end
subgraph bb2
bb2_instrs["
[2] Const mutate $3 = Call mutate g$4()
[2] Const mutate $3_@1 = Call mutate g$4_@1()
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[3] Const mutate $3 = read $2
[3] Const mutate $3_@2 = read $2_@0
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -89,15 +89,15 @@ function And$0() {
```
bb0:
[1] Const mutate $2 = Call mutate f$1()
If (read $2) then:bb2 else:bb3
[1] Const mutate $2_@0 = Call mutate f$1_@0()
If (read $2_@0) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[2] Const mutate $3 = read $2
[2] Const mutate $3_@1 = read $2_@0
Goto bb1
bb3:
predecessor blocks: bb0
[3] Const mutate $3 = Call mutate g$4()
[3] Const mutate $3_@2 = Call mutate g$4_@2()
Goto bb1
bb1:
predecessor blocks: bb2 bb3
@@ -111,19 +111,19 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate $2 = Call mutate f$1()
[1] Const mutate $2_@0 = Call mutate f$1_@0()
"]
bb0_instrs --> bb0_terminal(["If (read $2)"])
bb0_instrs --> bb0_terminal(["If (read $2_@0)"])
end
subgraph bb2
bb2_instrs["
[2] Const mutate $3 = read $2
[2] Const mutate $3_@1 = read $2_@0
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[3] Const mutate $3 = Call mutate g$4()
[3] Const mutate $3_@2 = Call mutate g$4_@2()
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -155,17 +155,17 @@ function Or$0() {
```
bb0:
[1] Const mutate $3 = Call mutate f$2()
[2] Const mutate $4 = null
[3] Const mutate $5 = Binary read $3 != read $4
If (read $5) then:bb2 else:bb3
[1] Const mutate $3_@0 = Call mutate f$2_@0()
[2] Const mutate $4_@1 = null
[3] Const mutate $5_@2 = Binary read $3_@0 != read $4_@1
If (read $5_@2) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[4] Const mutate $6 = read $3
[4] Const mutate $6_@3 = read $3_@0
Goto bb1
bb3:
predecessor blocks: bb0
[5] Const mutate $6 = Call mutate g$7()
[5] Const mutate $6_@4 = Call mutate g$7_@4()
Goto bb1
bb1:
predecessor blocks: bb2 bb3
@@ -179,21 +179,21 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate $3 = Call mutate f$2()
[2] Const mutate $4 = null
[3] Const mutate $5 = Binary read $3 != read $4
[1] Const mutate $3_@0 = Call mutate f$2_@0()
[2] Const mutate $4_@1 = null
[3] Const mutate $5_@2 = Binary read $3_@0 != read $4_@1
"]
bb0_instrs --> bb0_terminal(["If (read $5)"])
bb0_instrs --> bb0_terminal(["If (read $5_@2)"])
end
subgraph bb2
bb2_instrs["
[4] Const mutate $6 = read $3
[4] Const mutate $6_@3 = read $3_@0
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[5] Const mutate $6 = Call mutate g$7()
[5] Const mutate $6_@4 = Call mutate g$7_@4()
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -99,25 +99,25 @@ function cond$0(x$1) {
```
bb0:
[1] Let mutate a$2 = Object { }
[2] Let mutate b$3 = Object { }
[3] Let mutate c$4 = Object { }
[4] Let mutate d$5 = Object { }
[1] Let mutate a$2_@0 = Object { }
[2] Let mutate b$3_@1 = Object { }
[3] Let mutate c$4_@2 = Object { }
[4] Let mutate d$5_@3 = Object { }
While test=bb1 loop=bb3 fallthrough=bb2
bb1:
predecessor blocks: bb0 bb4
[5] Const mutate $10 = true
If (read $10) then:bb3 else:bb2
[5] Const mutate $10_@4 = true
If (read $10_@4) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[6] Let mutate z$6 = read a$2
[7] Reassign mutate a$2[7:12] = read b$3
[8] Reassign mutate b$3[8:11] = read c$4
[9] Reassign mutate c$4 = read d$5
[10] Reassign mutate d$5 = read z$6
[11] Call mutate mutate$7(mutate a$2, mutate b$3)
[12] Const mutate $9 = Call mutate cond$8(mutate a$2)
If (read $9) then:bb2 else:bb4
[6] Let mutate z$6_@5 = read a$2
[7] Reassign mutate a$2_@6[7:12] = read b$3
[8] Reassign mutate b$3_@6[8:11] = read c$4
[9] Reassign mutate c$4_@7 = read d$5
[10] Reassign mutate d$5_@8 = read z$6_@5
[11] Call mutate mutate$7_@6(mutate a$2_@6, mutate b$3_@6)
[12] Const mutate $9_@6 = Call mutate cond$8_@6(mutate a$2_@6)
If (read $9_@6) then:bb2 else:bb4
bb4:
predecessor blocks: bb3
Goto(Continue) bb1
@@ -132,11 +132,11 @@ bb9:
If (read c$4) then:bb11 else:bb11
bb11:
predecessor blocks: bb9
If (read d$5) then:bb13 else:bb13
If (read d$5_@6) then:bb13 else:bb13
bb13:
predecessor blocks: bb11
[13] Const mutate $11 = null
[14] Call mutate mutate$7(mutate d$5, read $11)
[13] Const mutate $11_@9 = null
[14] Call mutate mutate$7_@6(mutate d$5_@6, read $11_@9)
Return
```
@@ -147,30 +147,30 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate a$2 = Object { }
[2] Let mutate b$3 = Object { }
[3] Let mutate c$4 = Object { }
[4] Let mutate d$5 = Object { }
[1] Let mutate a$2_@0 = Object { }
[2] Let mutate b$3_@1 = Object { }
[3] Let mutate c$4_@2 = Object { }
[4] Let mutate d$5_@3 = Object { }
"]
bb0_instrs --> bb0_terminal(["While"])
end
subgraph bb1
bb1_instrs["
[5] Const mutate $10 = true
[5] Const mutate $10_@4 = true
"]
bb1_instrs --> bb1_terminal(["If (read $10)"])
bb1_instrs --> bb1_terminal(["If (read $10_@4)"])
end
subgraph bb3
bb3_instrs["
[6] Let mutate z$6 = read a$2
[7] Reassign mutate a$2[7:12] = read b$3
[8] Reassign mutate b$3[8:11] = read c$4
[9] Reassign mutate c$4 = read d$5
[10] Reassign mutate d$5 = read z$6
[11] Call mutate mutate$7(mutate a$2, mutate b$3)
[12] Const mutate $9 = Call mutate cond$8(mutate a$2)
[6] Let mutate z$6_@5 = read a$2
[7] Reassign mutate a$2_@6[7:12] = read b$3
[8] Reassign mutate b$3_@6[8:11] = read c$4
[9] Reassign mutate c$4_@7 = read d$5
[10] Reassign mutate d$5_@8 = read z$6_@5
[11] Call mutate mutate$7_@6(mutate a$2_@6, mutate b$3_@6)
[12] Const mutate $9_@6 = Call mutate cond$8_@6(mutate a$2_@6)
"]
bb3_instrs --> bb3_terminal(["If (read $9)"])
bb3_instrs --> bb3_terminal(["If (read $9_@6)"])
end
subgraph bb4
bb4_terminal(["Goto"])
@@ -185,12 +185,12 @@ flowchart TB
bb9_terminal(["If (read c$4)"])
end
subgraph bb11
bb11_terminal(["If (read d$5)"])
bb11_terminal(["If (read d$5_@6)"])
end
subgraph bb13
bb13_instrs["
[13] Const mutate $11 = null
[14] Call mutate mutate$7(mutate d$5, read $11)
[13] Const mutate $11_@9 = null
[14] Call mutate mutate$7_@6(mutate d$5_@6, read $11_@9)
"]
bb13_instrs --> bb13_terminal(["Return"])
end
@@ -67,30 +67,30 @@ function mutate$0(x$1, y$2) {
```
bb0:
[1] Const mutate a$2 = Object { }
[2] Const mutate b$3 = Array [read a$2]
[3] Const mutate c$4 = Object { }
[4] Const mutate d$5[4:7] = Object { c: read c$4 }
[5] Const mutate x$6[5:9] = Object { }
[6] Reassign mutate x$6.b[5:9] = read b$3
[7] Const mutate y$7 = Call mutate mutate$8(mutate x$6, mutate d$5)
If (read a$2) then:bb1 else:bb1
[1] Const mutate a$2_@0 = Object { }
[2] Const mutate b$3_@1 = Array [read a$2_@0]
[3] Const mutate c$4_@2 = Object { }
[4] Const mutate d$5_@3[4:7] = Object { c: read c$4_@2 }
[5] Const mutate x$6_@3[5:9] = Object { }
[6] Reassign mutate x$6_@3.b[5:9] = read b$3_@1
[7] Const mutate y$7_@3 = Call mutate mutate$8_@3(mutate x$6_@3, mutate d$5_@3)
If (read a$2_@0) then:bb1 else:bb1
bb1:
predecessor blocks: bb0
If (read b$3) then:bb3 else:bb3
If (read b$3_@1) then:bb3 else:bb3
bb3:
predecessor blocks: bb1
If (read c$4) then:bb5 else:bb5
If (read c$4_@2) then:bb5 else:bb5
bb5:
predecessor blocks: bb3
If (read d$5) then:bb7 else:bb7
If (read d$5_@3) then:bb7 else:bb7
bb7:
predecessor blocks: bb5
If (read y$7) then:bb9 else:bb9
If (read y$7_@3) then:bb9 else:bb9
bb9:
predecessor blocks: bb7
[8] Const mutate $9 = null
[9] Call mutate mutate$8(mutate x$6, read $9)
[8] Const mutate $9_@4 = null
[9] Call mutate mutate$8_@3(mutate x$6_@3, read $9_@4)
Return
```
@@ -101,32 +101,32 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2 = Object { }
[2] Const mutate b$3 = Array [read a$2]
[3] Const mutate c$4 = Object { }
[4] Const mutate d$5[4:7] = Object { c: read c$4 }
[5] Const mutate x$6[5:9] = Object { }
[6] Reassign mutate x$6.b[5:9] = read b$3
[7] Const mutate y$7 = Call mutate mutate$8(mutate x$6, mutate d$5)
[1] Const mutate a$2_@0 = Object { }
[2] Const mutate b$3_@1 = Array [read a$2_@0]
[3] Const mutate c$4_@2 = Object { }
[4] Const mutate d$5_@3[4:7] = Object { c: read c$4_@2 }
[5] Const mutate x$6_@3[5:9] = Object { }
[6] Reassign mutate x$6_@3.b[5:9] = read b$3_@1
[7] Const mutate y$7_@3 = Call mutate mutate$8_@3(mutate x$6_@3, mutate d$5_@3)
"]
bb0_instrs --> bb0_terminal(["If (read a$2)"])
bb0_instrs --> bb0_terminal(["If (read a$2_@0)"])
end
subgraph bb1
bb1_terminal(["If (read b$3)"])
bb1_terminal(["If (read b$3_@1)"])
end
subgraph bb3
bb3_terminal(["If (read c$4)"])
bb3_terminal(["If (read c$4_@2)"])
end
subgraph bb5
bb5_terminal(["If (read d$5)"])
bb5_terminal(["If (read d$5_@3)"])
end
subgraph bb7
bb7_terminal(["If (read y$7)"])
bb7_terminal(["If (read y$7_@3)"])
end
subgraph bb9
bb9_instrs["
[8] Const mutate $9 = null
[9] Call mutate mutate$8(mutate x$6, read $9)
[8] Const mutate $9_@4 = null
[9] Call mutate mutate$8_@3(mutate x$6_@3, read $9_@4)
"]
bb9_instrs --> bb9_terminal(["Return"])
end
@@ -94,39 +94,39 @@ function cond$0() {
```
bb0:
[1] Let mutate a$2[1:7] = Object { }
[2] Let mutate b$3[2:6] = Object { }
[3] Let mutate c$4 = Object { }
[4] Let mutate d$5[4:9] = Object { }
[1] Let mutate a$2_@0[1:7] = Object { }
[2] Let mutate b$3_@0[2:6] = Object { }
[3] Let mutate c$4_@1 = Object { }
[4] Let mutate d$5_@0[4:9] = Object { }
While test=bb1 loop=bb3 fallthrough=bb2
bb1:
predecessor blocks: bb0 bb4
[5] Const mutate $9 = true
If (read $9) then:bb3 else:bb2
[5] Const mutate $9_@2 = true
If (read $9_@2) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[6] Call mutate mutate$6(mutate a$2, mutate b$3)
[7] Const mutate $8 = Call mutate cond$7(mutate a$2)
If (read $8) then:bb2 else:bb4
[6] Call mutate mutate$6_@0(mutate a$2_@0, mutate b$3_@0)
[7] Const mutate $8_@0 = Call mutate cond$7_@0(mutate a$2_@0)
If (read $8_@0) then:bb2 else:bb4
bb4:
predecessor blocks: bb3
Goto(Continue) bb1
bb2:
predecessor blocks: bb3 bb1
If (read a$2) then:bb7 else:bb7
If (read a$2_@0) then:bb7 else:bb7
bb7:
predecessor blocks: bb2
If (read b$3) then:bb9 else:bb9
If (read b$3_@0) then:bb9 else:bb9
bb9:
predecessor blocks: bb7
If (read c$4) then:bb11 else:bb11
If (read c$4_@1) then:bb11 else:bb11
bb11:
predecessor blocks: bb9
If (read d$5) then:bb13 else:bb13
If (read d$5_@0) then:bb13 else:bb13
bb13:
predecessor blocks: bb11
[8] Const mutate $10 = null
[9] Call mutate mutate$6(mutate d$5, read $10)
[8] Const mutate $10_@3 = null
[9] Call mutate mutate$6_@0(mutate d$5_@0, read $10_@3)
Return
```
@@ -137,45 +137,45 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate a$2[1:7] = Object { }
[2] Let mutate b$3[2:6] = Object { }
[3] Let mutate c$4 = Object { }
[4] Let mutate d$5[4:9] = Object { }
[1] Let mutate a$2_@0[1:7] = Object { }
[2] Let mutate b$3_@0[2:6] = Object { }
[3] Let mutate c$4_@1 = Object { }
[4] Let mutate d$5_@0[4:9] = Object { }
"]
bb0_instrs --> bb0_terminal(["While"])
end
subgraph bb1
bb1_instrs["
[5] Const mutate $9 = true
[5] Const mutate $9_@2 = true
"]
bb1_instrs --> bb1_terminal(["If (read $9)"])
bb1_instrs --> bb1_terminal(["If (read $9_@2)"])
end
subgraph bb3
bb3_instrs["
[6] Call mutate mutate$6(mutate a$2, mutate b$3)
[7] Const mutate $8 = Call mutate cond$7(mutate a$2)
[6] Call mutate mutate$6_@0(mutate a$2_@0, mutate b$3_@0)
[7] Const mutate $8_@0 = Call mutate cond$7_@0(mutate a$2_@0)
"]
bb3_instrs --> bb3_terminal(["If (read $8)"])
bb3_instrs --> bb3_terminal(["If (read $8_@0)"])
end
subgraph bb4
bb4_terminal(["Goto"])
end
subgraph bb2
bb2_terminal(["If (read a$2)"])
bb2_terminal(["If (read a$2_@0)"])
end
subgraph bb7
bb7_terminal(["If (read b$3)"])
bb7_terminal(["If (read b$3_@0)"])
end
subgraph bb9
bb9_terminal(["If (read c$4)"])
bb9_terminal(["If (read c$4_@1)"])
end
subgraph bb11
bb11_terminal(["If (read d$5)"])
bb11_terminal(["If (read d$5_@0)"])
end
subgraph bb13
bb13_instrs["
[8] Const mutate $10 = null
[9] Call mutate mutate$6(mutate d$5, read $10)
[8] Const mutate $10_@3 = null
[9] Call mutate mutate$6_@0(mutate d$5_@0, read $10_@3)
"]
bb13_instrs --> bb13_terminal(["Return"])
end
@@ -17,13 +17,13 @@ function Component(props) {
```
bb0:
[1] Const mutate x$2[1:5] = Object { }
[2] Const mutate y$3 = Array []
[3] Reassign mutate x$2.y[1:5] = read y$3
[4] Const mutate child$4 = JSX <read Component$0 data={freeze y$3} ></read Component$0>
[5] Call mutate x$2.y.push(read props$1.p0)
[6] Const mutate $5 = JSX <read Component$0 data={freeze x$2} >{read child$4}</read Component$0>
Return read $5
[1] Const mutate x$2_@0[1:5] = Object { }
[2] Const mutate y$3_@1 = Array []
[3] Reassign mutate x$2_@0.y[1:5] = read y$3_@1
[4] Const mutate child$4_@2 = JSX <read Component$0 data={freeze y$3_@1} ></read Component$0>
[5] Call mutate x$2_@0.y.push(read props$1.p0)
[6] Const mutate $5_@3 = JSX <read Component$0 data={freeze x$2_@0} >{read child$4_@2}</read Component$0>
Return read $5_@3
```
### CFG
@@ -33,14 +33,14 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate x$2[1:5] = Object { }
[2] Const mutate y$3 = Array []
[3] Reassign mutate x$2.y[1:5] = read y$3
[4] Const mutate child$4 = JSX <read Component$0 data={freeze y$3} ></read Component$0>
[5] Call mutate x$2.y.push(read props$1.p0)
[6] Const mutate $5 = JSX <read Component$0 data={freeze x$2} >{read child$4}</read Component$0>
[1] Const mutate x$2_@0[1:5] = Object { }
[2] Const mutate y$3_@1 = Array []
[3] Reassign mutate x$2_@0.y[1:5] = read y$3_@1
[4] Const mutate child$4_@2 = JSX <read Component$0 data={freeze y$3_@1} ></read Component$0>
[5] Call mutate x$2_@0.y.push(read props$1.p0)
[6] Const mutate $5_@3 = JSX <read Component$0 data={freeze x$2_@0} >{read child$4_@2}</read Component$0>
"]
bb0_instrs --> bb0_terminal(["Return read $5"])
bb0_instrs --> bb0_terminal(["Return read $5_@3"])
end
%% Jumps
@@ -0,0 +1,62 @@
## Input
```javascript
function foo() {
let x = {};
let y = [];
let z = {};
y.push(z);
x.y = y;
return x;
}
```
## HIR
```
bb0:
[1] Let mutate x$1_@0[1:5] = Object { }
[2] Let mutate y$2_@1[2:4] = Array []
[3] Let mutate z$3_@1[3:4] = Object { }
[4] Call mutate y$2_@1.push(mutate z$3_@1)
[5] Reassign mutate x$1_@0.y[1:5] = read y$2_@1
Return freeze x$1_@0
```
### CFG
```mermaid
flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1_@0[1:5] = Object { }
[2] Let mutate y$2_@1[2:4] = Array []
[3] Let mutate z$3_@1[3:4] = Object { }
[4] Call mutate y$2_@1.push(mutate z$3_@1)
[5] Reassign mutate x$1_@0.y[1:5] = read y$2_@1
"]
bb0_instrs --> bb0_terminal(["Return freeze x$1_@0"])
end
%% Jumps
%% empty
```
## Code
```javascript
function foo$0() {
let x$1 = {};
let y$2 = [];
let z$3 = {};
y$2.push(z$3);
x$1.y = y$2;
return x$1;
}
```
@@ -0,0 +1,9 @@
function foo() {
let x = {};
let y = [];
let z = {};
y.push(z);
x.y = y;
return x;
}
@@ -0,0 +1,94 @@
## Input
```javascript
function f(a, b) {
let x = []; // <- x starts being mutable here.
if (a.length === 1) {
if (b) {
x.push(b); // <- x stops being mutable here.
}
}
return <div>{x}</div>;
}
```
## HIR
```
bb0:
[1] Let mutate x$3_@0[1:4] = Array []
[2] Const mutate $4_@1 = 1
[3] Const mutate $5_@2 = Binary read a$1.length === read $4_@1
If (read $5_@2) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
If (read b$2) then:bb4 else:bb1
bb4:
predecessor blocks: bb2
[4] Call mutate x$3_@0.push(read b$2)
Goto bb1
bb1:
predecessor blocks: bb4 bb2 bb0
[5] Const mutate $6_@3 = "div"
[6] Const mutate $7_@4 = JSX <read $6_@3>{freeze x$3_@0}</read $6_@3>
Return read $7_@4
```
### CFG
```mermaid
flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$3_@0[1:4] = Array []
[2] Const mutate $4_@1 = 1
[3] Const mutate $5_@2 = Binary read a$1.length === read $4_@1
"]
bb0_instrs --> bb0_terminal(["If (read $5_@2)"])
end
subgraph bb2
bb2_terminal(["If (read b$2)"])
end
subgraph bb4
bb4_instrs["
[4] Call mutate x$3_@0.push(read b$2)
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[5] Const mutate $6_@3 = 'div'
[6] Const mutate $7_@4 = JSX <read $6_@3>{freeze x$3_@0}</read $6_@3>
"]
bb1_instrs --> bb1_terminal(["Return read $7_@4"])
end
%% Jumps
bb0_terminal -- then --> bb2
bb0_terminal -- else --> bb1
bb2_terminal -- then --> bb4
bb2_terminal -- else --> bb1
bb4_terminal --> bb1
```
## Code
```javascript
function f$0(a$1, b$2) {
let x$3 = [];
bb1: if (a$1.length === 1) {
if (b$2) {
x$3.push(b$2);
}
}
return <div>{x$3}</div>;
}
```
@@ -0,0 +1,10 @@
function f(a, b) {
let x = []; // <- x starts being mutable here.
if (a.length === 1) {
if (b) {
x.push(b); // <- x stops being mutable here.
}
}
return <div>{x}</div>;
}
@@ -23,20 +23,20 @@ function Component(props) {
```
bb0:
[1] Let mutate x$2[1:2] = Array []
[2] Call mutate x$2.push(read props$1.p0)
[3] Let mutate y$3 = read x$2
[1] Let mutate x$2_@0[1:2] = Array []
[2] Call mutate x$2_@0.push(read props$1.p0)
[3] Let mutate y$3_@1 = read x$2_@0
If (read props$1.p1) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[4] Reassign mutate x$2 = Array []
[4] Reassign mutate x$2_@2 = Array []
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[5] Let mutate _$4 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call read y$3.push(read props$1.p2)
[7] Const mutate $5 = JSX <read Component$0 x={read x$2} y={read y$3} ></read Component$0>
Return read $5
[5] Let mutate _$4_@3 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call read y$3_@1.push(read props$1.p2)
[7] Const mutate $5_@4 = JSX <read Component$0 x={read x$2} y={read y$3_@1} ></read Component$0>
Return read $5_@4
```
### CFG
@@ -46,25 +46,25 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$2[1:2] = Array []
[2] Call mutate x$2.push(read props$1.p0)
[3] Let mutate y$3 = read x$2
[1] Let mutate x$2_@0[1:2] = Array []
[2] Call mutate x$2_@0.push(read props$1.p0)
[3] Let mutate y$3_@1 = read x$2_@0
"]
bb0_instrs --> bb0_terminal(["If (read props$1.p1)"])
end
subgraph bb2
bb2_instrs["
[4] Reassign mutate x$2 = Array []
[4] Reassign mutate x$2_@2 = Array []
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[5] Let mutate _$4 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call read y$3.push(read props$1.p2)
[7] Const mutate $5 = JSX <read Component$0 x={read x$2} y={read y$3} ></read Component$0>
[5] Let mutate _$4_@3 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call read y$3_@1.push(read props$1.p2)
[7] Const mutate $5_@4 = JSX <read Component$0 x={read x$2} y={read y$3_@1} ></read Component$0>
"]
bb1_instrs --> bb1_terminal(["Return read $5"])
bb1_instrs --> bb1_terminal(["Return read $5_@4"])
end
%% Jumps
@@ -21,14 +21,14 @@ function Component(props) {
```
bb0:
[1] Let mutate x$2[1:2] = Array []
[2] Call mutate x$2.push(read props$1.p0)
[3] Let mutate y$3[3:6] = read x$2
[4] Reassign mutate x$2 = Array []
[5] Let mutate _$4 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call mutate y$3.push(read props$1.p1)
[7] Const mutate $5 = JSX <read Component$0 x={read x$2} y={freeze y$3} ></read Component$0>
Return read $5
[1] Let mutate x$2_@0[1:2] = Array []
[2] Call mutate x$2_@0.push(read props$1.p0)
[3] Let mutate y$3_@1[3:6] = read x$2_@0
[4] Reassign mutate x$2_@2 = Array []
[5] Let mutate _$4_@3 = JSX <read Component$0 x={freeze x$2_@2} ></read Component$0>
[6] Call mutate y$3_@1.push(read props$1.p1)
[7] Const mutate $5_@4 = JSX <read Component$0 x={read x$2_@2} y={freeze y$3_@1} ></read Component$0>
Return read $5_@4
```
### CFG
@@ -38,15 +38,15 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$2[1:2] = Array []
[2] Call mutate x$2.push(read props$1.p0)
[3] Let mutate y$3[3:6] = read x$2
[4] Reassign mutate x$2 = Array []
[5] Let mutate _$4 = JSX <read Component$0 x={freeze x$2} ></read Component$0>
[6] Call mutate y$3.push(read props$1.p1)
[7] Const mutate $5 = JSX <read Component$0 x={read x$2} y={freeze y$3} ></read Component$0>
[1] Let mutate x$2_@0[1:2] = Array []
[2] Call mutate x$2_@0.push(read props$1.p0)
[3] Let mutate y$3_@1[3:6] = read x$2_@0
[4] Reassign mutate x$2_@2 = Array []
[5] Let mutate _$4_@3 = JSX <read Component$0 x={freeze x$2_@2} ></read Component$0>
[6] Call mutate y$3_@1.push(read props$1.p1)
[7] Const mutate $5_@4 = JSX <read Component$0 x={read x$2_@2} y={freeze y$3_@1} ></read Component$0>
"]
bb0_instrs --> bb0_terminal(["Return read $5"])
bb0_instrs --> bb0_terminal(["Return read $5_@4"])
end
%% Jumps
@@ -36,40 +36,40 @@ function Component(props) {
```
bb0:
[1] Let mutate x$2 = undefined
[1] Let mutate x$2_@0 = undefined
If (read props$1.cond) then:bb2 else:bb10
bb2:
predecessor blocks: bb0
[2] Const mutate $3 = 2
[3] Const mutate $4 = 1
[4] Const mutate $5 = 0
[2] Const mutate $3_@1 = 2
[3] Const mutate $4_@2 = 1
[4] Const mutate $5_@3 = 0
Switch (read props$1.test)
Case read $5: bb8
Case read $4: bb6
Case read $3: bb4
Case read $5_@3: bb8
Case read $4_@2: bb6
Case read $3_@1: bb4
Default: bb4
bb8:
predecessor blocks: bb2
[5] Reassign mutate x$2 = read props$1.v0
[5] Reassign mutate x$2_@4 = read props$1.v0
Goto bb1
bb6:
predecessor blocks: bb2
[6] Reassign mutate x$2 = read props$1.v1
[6] Reassign mutate x$2_@5 = read props$1.v1
Goto bb1
bb4:
predecessor blocks: bb2
[7] Reassign mutate x$2 = read props$1.v2
[7] Reassign mutate x$2_@6 = read props$1.v2
Goto bb1
bb10:
predecessor blocks: bb0
If (read props$1.cond2) then:bb12 else:bb13
bb12:
predecessor blocks: bb10
[8] Reassign mutate x$2 = read props$1.b
[8] Reassign mutate x$2_@7 = read props$1.b
Goto bb1
bb13:
predecessor blocks: bb10
[9] Reassign mutate x$2 = read props$1.c
[9] Reassign mutate x$2_@8 = read props$1.c
Goto bb1
bb1:
predecessor blocks: bb8 bb6 bb4 bb12 bb13
@@ -84,33 +84,33 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$2 = undefined
[1] Let mutate x$2_@0 = undefined
"]
bb0_instrs --> bb0_terminal(["If (read props$1.cond)"])
end
subgraph bb2
bb2_instrs["
[2] Const mutate $3 = 2
[3] Const mutate $4 = 1
[4] Const mutate $5 = 0
[2] Const mutate $3_@1 = 2
[3] Const mutate $4_@2 = 1
[4] Const mutate $5_@3 = 0
"]
bb2_instrs --> bb2_terminal(["Switch (read props$1.test)"])
end
subgraph bb8
bb8_instrs["
[5] Reassign mutate x$2 = read props$1.v0
[5] Reassign mutate x$2_@4 = read props$1.v0
"]
bb8_instrs --> bb8_terminal(["Goto"])
end
subgraph bb6
bb6_instrs["
[6] Reassign mutate x$2 = read props$1.v1
[6] Reassign mutate x$2_@5 = read props$1.v1
"]
bb6_instrs --> bb6_terminal(["Goto"])
end
subgraph bb4
bb4_instrs["
[7] Reassign mutate x$2 = read props$1.v2
[7] Reassign mutate x$2_@6 = read props$1.v2
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
@@ -119,13 +119,13 @@ flowchart TB
end
subgraph bb12
bb12_instrs["
[8] Reassign mutate x$2 = read props$1.b
[8] Reassign mutate x$2_@7 = read props$1.b
"]
bb12_instrs --> bb12_terminal(["Goto"])
end
subgraph bb13
bb13_instrs["
[9] Reassign mutate x$2 = read props$1.c
[9] Reassign mutate x$2_@8 = read props$1.c
"]
bb13_instrs --> bb13_terminal(["Goto"])
end
@@ -140,9 +140,9 @@ flowchart TB
bb0_terminal -- then --> bb2
bb0_terminal -- else --> bb10
bb0_terminal -- fallthrough --> bb1
bb2_terminal -- read $5 --> bb8
bb2_terminal -- read $4 --> bb6
bb2_terminal -- read $3 --> bb4
bb2_terminal -- read $5_@3 --> bb8
bb2_terminal -- read $4_@2 --> bb6
bb2_terminal -- read $3_@1 --> bb4
bb2_terminal -- default --> bb4
bb2_terminal -- fallthrough --> bb1
bb8_terminal --> bb1
@@ -18,15 +18,15 @@ bb0:
If (read x$1) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[1] Const mutate $3 = false
[2] Const mutate $4 = Call read foo$0(read $3, read y$2)
Return freeze $4
[1] Const mutate $3_@0 = false
[2] Const mutate $4_@1 = Call read foo$0(read $3_@0, read y$2)
Return freeze $4_@1
bb1:
predecessor blocks: bb0
[3] Const mutate $5 = 10
[4] Const mutate $6 = Binary read y$2 * read $5
[5] Const mutate $7 = Array [read $6]
Return freeze $7
[3] Const mutate $5_@2 = 10
[4] Const mutate $6_@3 = Binary read y$2 * read $5_@2
[5] Const mutate $7_@4 = Array [read $6_@3]
Return freeze $7_@4
```
### CFG
@@ -39,18 +39,18 @@ flowchart TB
end
subgraph bb2
bb2_instrs["
[1] Const mutate $3 = false
[2] Const mutate $4 = Call read foo$0(read $3, read y$2)
[1] Const mutate $3_@0 = false
[2] Const mutate $4_@1 = Call read foo$0(read $3_@0, read y$2)
"]
bb2_instrs --> bb2_terminal(["Return freeze $4"])
bb2_instrs --> bb2_terminal(["Return freeze $4_@1"])
end
subgraph bb1
bb1_instrs["
[3] Const mutate $5 = 10
[4] Const mutate $6 = Binary read y$2 * read $5
[5] Const mutate $7 = Array [read $6]
[3] Const mutate $5_@2 = 10
[4] Const mutate $6_@3 = Binary read y$2 * read $5_@2
[5] Const mutate $7_@4 = Array [read $6_@3]
"]
bb1_instrs --> bb1_terminal(["Return freeze $7"])
bb1_instrs --> bb1_terminal(["Return freeze $7_@4"])
end
%% Jumps
@@ -15,10 +15,10 @@ function Component(props) {
```
bb0:
[1] Const mutate a$2 = 1
[2] Const mutate b$3 = 2
[3] Const mutate x$4 = Array [read a$2, read b$3]
Return freeze x$4
[1] Const mutate a$2_@0 = 1
[2] Const mutate b$3_@1 = 2
[3] Const mutate x$4_@2 = Array [read a$2_@0, read b$3_@1]
Return freeze x$4_@2
```
### CFG
@@ -28,11 +28,11 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2 = 1
[2] Const mutate b$3 = 2
[3] Const mutate x$4 = Array [read a$2, read b$3]
[1] Const mutate a$2_@0 = 1
[2] Const mutate b$3_@1 = 2
[3] Const mutate x$4_@2 = Array [read a$2_@0, read b$3_@1]
"]
bb0_instrs --> bb0_terminal(["Return freeze x$4"])
bb0_instrs --> bb0_terminal(["Return freeze x$4_@2"])
end
%% Jumps
@@ -50,22 +50,22 @@ function foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:7] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $7 = Call mutate foo$4()
If (read $7) then:bb2 else:bb1
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:7] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $7_@0 = Call mutate foo$4_@0()
If (read $7_@0) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[5] Const mutate $6 = "div"
[6] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[5] Const mutate $6_@1 = "div"
[6] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[7] Call mutate foo$4(read a$2, mutate b$3)
[8] Const mutate $8 = "div"
[9] Const mutate $9 = JSX <read $8 a={freeze a$2} b={freeze b$3} ></read $8>
Return read $9
[7] Call mutate foo$4_@0(read a$2_@0, mutate b$3_@0)
[8] Const mutate $8_@3 = "div"
[9] Const mutate $9_@4 = JSX <read $8_@3 a={freeze a$2_@0} b={freeze b$3_@0} ></read $8_@3>
Return read $9_@4
```
### CFG
@@ -75,27 +75,27 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:7] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $7 = Call mutate foo$4()
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:7] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $7_@0 = Call mutate foo$4_@0()
"]
bb0_instrs --> bb0_terminal(["If (read $7)"])
bb0_instrs --> bb0_terminal(["If (read $7_@0)"])
end
subgraph bb2
bb2_instrs["
[5] Const mutate $6 = 'div'
[6] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[5] Const mutate $6_@1 = 'div'
[6] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[7] Call mutate foo$4(read a$2, mutate b$3)
[8] Const mutate $8 = 'div'
[9] Const mutate $9 = JSX <read $8 a={freeze a$2} b={freeze b$3} ></read $8>
[7] Call mutate foo$4_@0(read a$2_@0, mutate b$3_@0)
[8] Const mutate $8_@3 = 'div'
[9] Const mutate $9_@4 = JSX <read $8_@3 a={freeze a$2_@0} b={freeze b$3_@0} ></read $8_@3>
"]
bb1_instrs --> bb1_terminal(["Return read $9"])
bb1_instrs --> bb1_terminal(["Return read $9_@4"])
end
%% Jumps
@@ -47,15 +47,15 @@ function foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = "div"
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] Call mutate foo$4(read a$2, mutate b$3)
[7] Const mutate $7 = "div"
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
Return read $8
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = "div"
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] Call mutate foo$4_@0(read a$2_@0, mutate b$3_@0)
[7] Const mutate $7_@3 = "div"
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
Return read $8_@4
```
### CFG
@@ -65,16 +65,16 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:6] = Object { }
[3] Call mutate foo$4(mutate a$2, mutate b$3)
[4] Const mutate $6 = 'div'
[5] Let mutate _$5 = JSX <read $6 a={freeze a$2} ></read $6>
[6] Call mutate foo$4(read a$2, mutate b$3)
[7] Const mutate $7 = 'div'
[8] Const mutate $8 = JSX <read $7 a={read a$2} b={freeze b$3} ></read $7>
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:6] = Object { }
[3] Call mutate foo$4_@0(mutate a$2_@0, mutate b$3_@0)
[4] Const mutate $6_@1 = 'div'
[5] Let mutate _$5_@2 = JSX <read $6_@1 a={freeze a$2_@0} ></read $6_@1>
[6] Call mutate foo$4_@0(read a$2_@0, mutate b$3_@0)
[7] Const mutate $7_@3 = 'div'
[8] Const mutate $8_@4 = JSX <read $7_@3 a={read a$2_@0} b={freeze b$3_@0} ></read $7_@3>
"]
bb0_instrs --> bb0_terminal(["Return read $8"])
bb0_instrs --> bb0_terminal(["Return read $8_@4"])
end
%% Jumps
@@ -21,27 +21,27 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 2
[4] Const mutate $4 = Binary read y$2 === read $3
If (read $4) then:bb2 else:bb1
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 2
[4] Const mutate $4_@3 = Binary read y$2_@1 === read $3_@2
If (read $4_@3) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[5] Reassign mutate x$1 = 3
[5] Reassign mutate x$1_@4 = 3
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[6] Const mutate $5 = 3
[7] Const mutate $6 = Binary read y$2 === read $5
If (read $6) then:bb4 else:bb3
[6] Const mutate $5_@5 = 3
[7] Const mutate $6_@6 = Binary read y$2_@1 === read $5_@5
If (read $6_@6) then:bb4 else:bb3
bb4:
predecessor blocks: bb1
[8] Reassign mutate x$1 = 5
[8] Reassign mutate x$1_@7 = 5
Goto bb3
bb3:
predecessor blocks: bb4 bb1
[9] Reassign mutate y$2 = read x$1
[9] Reassign mutate y$2_@8 = read x$1
Return
```
@@ -52,35 +52,35 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 2
[4] Const mutate $4 = Binary read y$2 === read $3
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 2
[4] Const mutate $4_@3 = Binary read y$2_@1 === read $3_@2
"]
bb0_instrs --> bb0_terminal(["If (read $4)"])
bb0_instrs --> bb0_terminal(["If (read $4_@3)"])
end
subgraph bb2
bb2_instrs["
[5] Reassign mutate x$1 = 3
[5] Reassign mutate x$1_@4 = 3
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[6] Const mutate $5 = 3
[7] Const mutate $6 = Binary read y$2 === read $5
[6] Const mutate $5_@5 = 3
[7] Const mutate $6_@6 = Binary read y$2_@1 === read $5_@5
"]
bb1_instrs --> bb1_terminal(["If (read $6)"])
bb1_instrs --> bb1_terminal(["If (read $6_@6)"])
end
subgraph bb4
bb4_instrs["
[8] Reassign mutate x$1 = 5
[8] Reassign mutate x$1_@7 = 5
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[9] Reassign mutate y$2 = read x$1
[9] Reassign mutate y$2_@8 = read x$1
"]
bb3_instrs --> bb3_terminal(["Return"])
end
@@ -18,18 +18,18 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 2
[4] Const mutate $4 = Binary read y$2 === read $3
If (read $4) then:bb2 else:bb1
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 2
[4] Const mutate $4_@3 = Binary read y$2_@1 === read $3_@2
If (read $4_@3) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[5] Reassign mutate x$1 = 3
[5] Reassign mutate x$1_@4 = 3
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[6] Reassign mutate y$2 = read x$1
[6] Reassign mutate y$2_@5 = read x$1
Return
```
@@ -40,22 +40,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 2
[4] Const mutate $4 = Binary read y$2 === read $3
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 2
[4] Const mutate $4_@3 = Binary read y$2_@1 === read $3_@2
"]
bb0_instrs --> bb0_terminal(["If (read $4)"])
bb0_instrs --> bb0_terminal(["If (read $4_@3)"])
end
subgraph bb2
bb2_instrs["
[5] Reassign mutate x$1 = 3
[5] Reassign mutate x$1_@4 = 3
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[6] Reassign mutate y$2 = read x$1
[6] Reassign mutate y$2_@5 = read x$1
"]
bb1_instrs --> bb1_terminal(["Return"])
end
@@ -19,25 +19,25 @@ function foo(cond) {
```
bb0:
[1] Let mutate items$2 = Array []
[1] Let mutate items$2_@0 = Array []
Goto bb1
bb1:
predecessor blocks: bb0 bb4
If (read items$2) then:bb3 else:bb2
If (read items$2_@0) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[2] Let mutate y$3 = 0
[2] Let mutate y$3_@1 = 0
If (read cond$1) then:bb5 else:bb4
bb5:
predecessor blocks: bb3
[3] Reassign mutate y$3 = 1
[3] Reassign mutate y$3_@2 = 1
Goto bb4
bb4:
predecessor blocks: bb5 bb3
Goto(Continue) bb1
bb2:
predecessor blocks: bb1
Return freeze items$2
Return freeze items$2_@0
```
### CFG
@@ -47,22 +47,22 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate items$2 = Array []
[1] Let mutate items$2_@0 = Array []
"]
bb0_instrs --> bb0_terminal(["Goto"])
end
subgraph bb1
bb1_terminal(["If (read items$2)"])
bb1_terminal(["If (read items$2_@0)"])
end
subgraph bb3
bb3_instrs["
[2] Let mutate y$3 = 0
[2] Let mutate y$3_@1 = 0
"]
bb3_instrs --> bb3_terminal(["If (read cond$1)"])
end
subgraph bb5
bb5_instrs["
[3] Reassign mutate y$3 = 1
[3] Reassign mutate y$3_@2 = 1
"]
bb5_instrs --> bb5_terminal(["Goto"])
end
@@ -70,7 +70,7 @@ flowchart TB
bb4_terminal(["Goto"])
end
subgraph bb2
bb2_terminal(["Return freeze items$2"])
bb2_terminal(["Return freeze items$2_@0"])
end
%% Jumps
@@ -16,17 +16,17 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 0
[1] Let mutate x$1_@0 = 0
Goto bb1
bb1:
predecessor blocks: bb0 bb4
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
If (read $4) then:bb4 else:bb2
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1 < read $3_@1
If (read $4_@2) then:bb4 else:bb2
bb4:
predecessor blocks: bb1
[4] Const mutate $2 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1 + read $2_@3
Goto(Continue) bb1
bb2:
predecessor blocks: bb1
@@ -40,21 +40,21 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 0
[1] Let mutate x$1_@0 = 0
"]
bb0_instrs --> bb0_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1 < read $3_@1
"]
bb1_instrs --> bb1_terminal(["If (read $4)"])
bb1_instrs --> bb1_terminal(["If (read $4_@2)"])
end
subgraph bb4
bb4_instrs["
[4] Const mutate $2 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1 + read $2_@3
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
@@ -19,16 +19,16 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
If (read y$2) then:bb2 else:bb3
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
If (read y$2_@1) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[3] Let mutate z$3 = Binary read x$1 + read y$2
[3] Let mutate z$3_@2 = Binary read x$1_@0 + read y$2_@1
Goto bb1
bb3:
predecessor blocks: bb0
[4] Let mutate z$4 = read x$1
[4] Let mutate z$4_@3 = read x$1_@0
Goto bb1
bb1:
predecessor blocks: bb2 bb3
@@ -42,20 +42,20 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
"]
bb0_instrs --> bb0_terminal(["If (read y$2)"])
bb0_instrs --> bb0_terminal(["If (read y$2_@1)"])
end
subgraph bb2
bb2_instrs["
[3] Let mutate z$3 = Binary read x$1 + read y$2
[3] Let mutate z$3_@2 = Binary read x$1_@0 + read y$2_@1
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[4] Let mutate z$4 = read x$1
[4] Let mutate z$4_@3 = read x$1_@0
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -21,7 +21,7 @@ function foo(a, b, c) {
```
bb0:
[1] Let mutate x$4 = 0
[1] Let mutate x$4_@0 = 0
While test=bb1 loop=bb3 fallthrough=bb2
bb1:
predecessor blocks: bb0 bb5
@@ -40,8 +40,8 @@ bb7:
If (read c$3) then:bb9 else:bb8
bb9:
predecessor blocks: bb7
[2] Const mutate $5 = 1
[3] Binary read x$4 + read $5
[2] Const mutate $5_@1 = 1
[3] Binary read x$4_@0 + read $5_@1
Goto(Continue) bb7
bb8:
predecessor blocks: bb7
@@ -51,7 +51,7 @@ bb5:
Goto(Continue) bb1
bb2:
predecessor blocks: bb1
Return read x$4
Return read x$4_@0
```
### CFG
@@ -61,7 +61,7 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$4 = 0
[1] Let mutate x$4_@0 = 0
"]
bb0_instrs --> bb0_terminal(["While"])
end
@@ -82,8 +82,8 @@ flowchart TB
end
subgraph bb9
bb9_instrs["
[2] Const mutate $5 = 1
[3] Binary read x$4 + read $5
[2] Const mutate $5_@1 = 1
[3] Binary read x$4_@0 + read $5_@1
"]
bb9_instrs --> bb9_terminal(["Goto"])
end
@@ -94,7 +94,7 @@ flowchart TB
bb5_terminal(["Goto"])
end
subgraph bb2
bb2_terminal(["Return read x$4"])
bb2_terminal(["Return read x$4_@0"])
end
%% Jumps
@@ -45,10 +45,10 @@ function Foo$0() {
```
bb0:
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:3] = Object { }
[3] Let mutate c$4 = New mutate Foo$5(mutate a$2, mutate b$3)
Return freeze c$4
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:3] = Object { }
[3] Let mutate c$4_@0 = New mutate Foo$5_@0(mutate a$2_@0, mutate b$3_@0)
Return freeze c$4_@0
```
### CFG
@@ -58,11 +58,11 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2[1:3] = Array []
[2] Const mutate b$3[2:3] = Object { }
[3] Let mutate c$4 = New mutate Foo$5(mutate a$2, mutate b$3)
[1] Const mutate a$2_@0[1:3] = Array []
[2] Const mutate b$3_@0[2:3] = Object { }
[3] Let mutate c$4_@0 = New mutate Foo$5_@0(mutate a$2_@0, mutate b$3_@0)
"]
bb0_instrs --> bb0_terminal(["Return freeze c$4"])
bb0_instrs --> bb0_terminal(["Return freeze c$4_@0"])
end
%% Jumps
@@ -22,23 +22,23 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 1
[4] Const mutate $4 = Binary read x$1 > read $3
If (read $4) then:bb2 else:bb3
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 1
[4] Const mutate $4_@3 = Binary read x$1_@0 > read $3_@2
If (read $4_@3) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[5] Reassign mutate x$1 = 2
[5] Reassign mutate x$1_@4 = 2
Goto bb1
bb3:
predecessor blocks: bb0
[6] Reassign mutate y$2 = 3
[6] Reassign mutate y$2_@5 = 3
Goto bb1
bb1:
predecessor blocks: bb2 bb3
[7] Let mutate t$5 = Object { x: read x$1, y: read y$2 }
Return freeze t$5
[7] Let mutate t$5_@6 = Object { x: read x$1, y: read y$2 }
Return freeze t$5_@6
```
### CFG
@@ -48,30 +48,30 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[3] Const mutate $3 = 1
[4] Const mutate $4 = Binary read x$1 > read $3
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
[3] Const mutate $3_@2 = 1
[4] Const mutate $4_@3 = Binary read x$1_@0 > read $3_@2
"]
bb0_instrs --> bb0_terminal(["If (read $4)"])
bb0_instrs --> bb0_terminal(["If (read $4_@3)"])
end
subgraph bb2
bb2_instrs["
[5] Reassign mutate x$1 = 2
[5] Reassign mutate x$1_@4 = 2
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[6] Reassign mutate y$2 = 3
[6] Reassign mutate y$2_@5 = 3
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[7] Let mutate t$5 = Object { x: read x$1, y: read y$2 }
[7] Let mutate t$5_@6 = Object { x: read x$1, y: read y$2 }
"]
bb1_instrs --> bb1_terminal(["Return freeze t$5"])
bb1_instrs --> bb1_terminal(["Return freeze t$5_@6"])
end
%% Jumps
@@ -15,10 +15,10 @@ function Component(props) {
```
bb0:
[1] Const mutate a$2 = 1
[2] Const mutate b$3 = 2
[3] Const mutate x$4 = Object { a: read a$2, b: read b$3 }
Return freeze x$4
[1] Const mutate a$2_@0 = 1
[2] Const mutate b$3_@1 = 2
[3] Const mutate x$4_@2 = Object { a: read a$2_@0, b: read b$3_@1 }
Return freeze x$4_@2
```
### CFG
@@ -28,11 +28,11 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate a$2 = 1
[2] Const mutate b$3 = 2
[3] Const mutate x$4 = Object { a: read a$2, b: read b$3 }
[1] Const mutate a$2_@0 = 1
[2] Const mutate b$3_@1 = 2
[3] Const mutate x$4_@2 = Object { a: read a$2_@0, b: read b$3_@1 }
"]
bb0_instrs --> bb0_terminal(["Return freeze x$4"])
bb0_instrs --> bb0_terminal(["Return freeze x$4_@2"])
end
%% Jumps
@@ -15,11 +15,11 @@ function foo() {
```
bb0:
[1] Const mutate x$1 = Array []
[2] Const mutate y$2[2:4] = Object { x: read x$1 }
[3] Const mutate $3[3:4] = Array []
[4] Call mutate y$2.x.push(mutate $3)
Return freeze y$2
[1] Const mutate x$1_@0 = Array []
[2] Const mutate y$2_@1[2:4] = Object { x: read x$1_@0 }
[3] Const mutate $3_@1[3:4] = Array []
[4] Call mutate y$2_@1.x.push(mutate $3_@1)
Return freeze y$2_@1
```
### CFG
@@ -29,12 +29,12 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate x$1 = Array []
[2] Const mutate y$2[2:4] = Object { x: read x$1 }
[3] Const mutate $3[3:4] = Array []
[4] Call mutate y$2.x.push(mutate $3)
[1] Const mutate x$1_@0 = Array []
[2] Const mutate y$2_@1[2:4] = Object { x: read x$1_@0 }
[3] Const mutate $3_@1[3:4] = Array []
[4] Call mutate y$2_@1.x.push(mutate $3_@1)
"]
bb0_instrs --> bb0_terminal(["Return freeze y$2"])
bb0_instrs --> bb0_terminal(["Return freeze y$2_@1"])
end
%% Jumps
@@ -15,10 +15,10 @@ function foo() {
```
bb0:
[1] Const mutate x$1 = Array []
[2] Const mutate y$2[2:3] = Object { }
[3] Reassign mutate y$2.x[2:3] = read x$1
Return freeze y$2
[1] Const mutate x$1_@0 = Array []
[2] Const mutate y$2_@1[2:3] = Object { }
[3] Reassign mutate y$2_@1.x[2:3] = read x$1_@0
Return freeze y$2_@1
```
### CFG
@@ -28,11 +28,11 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Const mutate x$1 = Array []
[2] Const mutate y$2[2:3] = Object { }
[3] Reassign mutate y$2.x[2:3] = read x$1
[1] Const mutate x$1_@0 = Array []
[2] Const mutate y$2_@1[2:3] = Object { }
[3] Reassign mutate y$2_@1.x[2:3] = read x$1_@0
"]
bb0_instrs --> bb0_terminal(["Return freeze y$2"])
bb0_instrs --> bb0_terminal(["Return freeze y$2_@1"])
end
%% Jumps
@@ -17,13 +17,13 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read x$1 === read $2
If (read $3) then:bb2 else:bb1
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read x$1_@0 === read $2_@1
If (read $3_@2) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[4] Reassign mutate x$1 = 2
[4] Reassign mutate x$1_@3 = 2
Goto bb1
bb1:
predecessor blocks: bb2 bb0
@@ -37,15 +37,15 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read x$1 === read $2
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read x$1_@0 === read $2_@1
"]
bb0_instrs --> bb0_terminal(["If (read $3)"])
bb0_instrs --> bb0_terminal(["If (read $3_@2)"])
end
subgraph bb2
bb2_instrs["
[4] Reassign mutate x$1 = 2
[4] Reassign mutate x$1_@3 = 2
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -49,20 +49,20 @@ function log$0() {
```
bb0:
[1] Let mutate str$2 = ""
[1] Let mutate str$2_@0 = ""
If (read cond$1) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[2] Let mutate str$3 = "other test"
[3] Call mutate log$4(read str$3)
[2] Let mutate str$3_@1 = "other test"
[3] Call mutate log$4_@2(read str$3_@1)
Goto bb1
bb3:
predecessor blocks: bb0
[4] Reassign mutate str$2 = "fallthrough test"
[4] Reassign mutate str$2_@3 = "fallthrough test"
Goto bb1
bb1:
predecessor blocks: bb2 bb3
[5] Call mutate log$4(read str$2)
[5] Call mutate log$4_@2(read str$2)
Return
```
@@ -73,26 +73,26 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate str$2 = ''
[1] Let mutate str$2_@0 = ''
"]
bb0_instrs --> bb0_terminal(["If (read cond$1)"])
end
subgraph bb2
bb2_instrs["
[2] Let mutate str$3 = 'other test'
[3] Call mutate log$4(read str$3)
[2] Let mutate str$3_@1 = 'other test'
[3] Call mutate log$4_@2(read str$3_@1)
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[4] Reassign mutate str$2 = 'fallthrough test'
[4] Reassign mutate str$2_@3 = 'fallthrough test'
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[5] Call mutate log$4(read str$2)
[5] Call mutate log$4_@2(read str$2)
"]
bb1_instrs --> bb1_terminal(["Return"])
end
@@ -20,21 +20,21 @@ function foo() {
```
bb0:
[1] Let mutate y$1 = 2
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read y$1 > read $2
If (read $3) then:bb2 else:bb3
[1] Let mutate y$1_@0 = 2
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read y$1_@0 > read $2_@1
If (read $3_@2) then:bb2 else:bb3
bb2:
predecessor blocks: bb0
[4] Reassign mutate y$1 = 1
[4] Reassign mutate y$1_@3 = 1
Goto bb1
bb3:
predecessor blocks: bb0
[5] Reassign mutate y$1 = 2
[5] Reassign mutate y$1_@4 = 2
Goto bb1
bb1:
predecessor blocks: bb2 bb3
[6] Let mutate x$4 = read y$1
[6] Let mutate x$4_@5 = read y$1
Return
```
@@ -45,27 +45,27 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate y$1 = 2
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read y$1 > read $2
[1] Let mutate y$1_@0 = 2
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read y$1_@0 > read $2_@1
"]
bb0_instrs --> bb0_terminal(["If (read $3)"])
bb0_instrs --> bb0_terminal(["If (read $3_@2)"])
end
subgraph bb2
bb2_instrs["
[4] Reassign mutate y$1 = 1
[4] Reassign mutate y$1_@3 = 1
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[5] Reassign mutate y$1 = 2
[5] Reassign mutate y$1_@4 = 2
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[6] Let mutate x$4 = read y$1
[6] Let mutate x$4_@5 = read y$1
"]
bb1_instrs --> bb1_terminal(["Return"])
end
@@ -13,8 +13,8 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
Return
```
@@ -25,8 +25,8 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
"]
bb0_instrs --> bb0_terminal(["Return"])
end
@@ -17,12 +17,12 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
If (read y$2) then:bb2 else:bb1
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
If (read y$2_@1) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[3] Let mutate z$3 = Binary read x$1 + read y$2
[3] Let mutate z$3_@2 = Binary read x$1_@0 + read y$2_@1
Goto bb1
bb1:
predecessor blocks: bb2 bb0
@@ -36,14 +36,14 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Let mutate y$2 = 2
[1] Let mutate x$1_@0 = 1
[2] Let mutate y$2_@1 = 2
"]
bb0_instrs --> bb0_terminal(["If (read y$2)"])
bb0_instrs --> bb0_terminal(["If (read y$2_@1)"])
end
subgraph bb2
bb2_instrs["
[3] Let mutate z$3 = Binary read x$1 + read y$2
[3] Let mutate z$3_@2 = Binary read x$1_@0 + read y$2_@1
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -28,33 +28,33 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Const mutate $4 = 2
[3] Const mutate $5 = Binary read x$1 === read $4
[4] Const mutate $7 = 1
[5] Const mutate $8 = Binary read x$1 === read $7
Switch (read x$1)
Case read $8: bb5
Case read $5: bb3
[1] Let mutate x$1_@0 = 1
[2] Const mutate $4_@1 = 2
[3] Const mutate $5_@2 = Binary read x$1_@0 === read $4_@1
[4] Const mutate $7_@3 = 1
[5] Const mutate $8_@4 = Binary read x$1_@0 === read $7_@3
Switch (read x$1_@0)
Case read $8_@4: bb5
Case read $5_@2: bb3
Default: bb2
bb5:
predecessor blocks: bb0
[6] Const mutate $6 = 1
[7] Reassign mutate x$1 = Binary read x$1 + read $6
[6] Const mutate $6_@5 = 1
[7] Reassign mutate x$1_@6 = Binary read x$1_@0 + read $6_@5
Goto bb1
bb3:
predecessor blocks: bb0
[8] Const mutate $3 = 2
[9] Reassign mutate x$1 = Binary read x$1 + read $3
[8] Const mutate $3_@7 = 2
[9] Reassign mutate x$1_@8 = Binary read x$1_@0 + read $3_@7
Goto bb1
bb2:
predecessor blocks: bb0
[10] Const mutate $2 = 3
[11] Reassign mutate x$1 = Binary read x$1 + read $2
[10] Const mutate $2_@9 = 3
[11] Reassign mutate x$1_@10 = Binary read x$1_@0 + read $2_@9
Goto bb1
bb1:
predecessor blocks: bb5 bb3 bb2
[12] Let mutate y$9 = read x$1
[12] Let mutate y$9_@11 = read x$1
Return
```
@@ -65,45 +65,45 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Const mutate $4 = 2
[3] Const mutate $5 = Binary read x$1 === read $4
[4] Const mutate $7 = 1
[5] Const mutate $8 = Binary read x$1 === read $7
[1] Let mutate x$1_@0 = 1
[2] Const mutate $4_@1 = 2
[3] Const mutate $5_@2 = Binary read x$1_@0 === read $4_@1
[4] Const mutate $7_@3 = 1
[5] Const mutate $8_@4 = Binary read x$1_@0 === read $7_@3
"]
bb0_instrs --> bb0_terminal(["Switch (read x$1)"])
bb0_instrs --> bb0_terminal(["Switch (read x$1_@0)"])
end
subgraph bb5
bb5_instrs["
[6] Const mutate $6 = 1
[7] Reassign mutate x$1 = Binary read x$1 + read $6
[6] Const mutate $6_@5 = 1
[7] Reassign mutate x$1_@6 = Binary read x$1_@0 + read $6_@5
"]
bb5_instrs --> bb5_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[8] Const mutate $3 = 2
[9] Reassign mutate x$1 = Binary read x$1 + read $3
[8] Const mutate $3_@7 = 2
[9] Reassign mutate x$1_@8 = Binary read x$1_@0 + read $3_@7
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb2
bb2_instrs["
[10] Const mutate $2 = 3
[11] Reassign mutate x$1 = Binary read x$1 + read $2
[10] Const mutate $2_@9 = 3
[11] Reassign mutate x$1_@10 = Binary read x$1_@0 + read $2_@9
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[12] Let mutate y$9 = read x$1
[12] Let mutate y$9_@11 = read x$1
"]
bb1_instrs --> bb1_terminal(["Return"])
end
%% Jumps
bb0_terminal -- read $8 --> bb5
bb0_terminal -- read $5 --> bb3
bb0_terminal -- read $8_@4 --> bb5
bb0_terminal -- read $5_@2 --> bb3
bb0_terminal -- default --> bb2
bb0_terminal -- fallthrough --> bb1
bb5_terminal --> bb1
@@ -16,13 +16,13 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read x$1 === read $2
If (read $3) then:bb2 else:bb1
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read x$1_@0 === read $2_@1
If (read $3_@2) then:bb2 else:bb1
bb2:
predecessor blocks: bb0
[4] Reassign mutate x$1 = 2
[4] Reassign mutate x$1_@3 = 2
Goto bb1
bb1:
predecessor blocks: bb2 bb0
@@ -36,15 +36,15 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[2] Const mutate $2 = 1
[3] Const mutate $3 = Binary read x$1 === read $2
[1] Let mutate x$1_@0 = 1
[2] Const mutate $2_@1 = 1
[3] Const mutate $3_@2 = Binary read x$1_@0 === read $2_@1
"]
bb0_instrs --> bb0_terminal(["If (read $3)"])
bb0_instrs --> bb0_terminal(["If (read $3_@2)"])
end
subgraph bb2
bb2_instrs["
[4] Reassign mutate x$1 = 2
[4] Reassign mutate x$1_@3 = 2
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -17,21 +17,21 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[1] Let mutate x$1_@0 = 1
While test=bb1 loop=bb3 fallthrough=bb2
bb1:
predecessor blocks: bb0 bb3
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
If (read $4) then:bb3 else:bb2
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1_@0 < read $3_@1
If (read $4_@2) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[4] Const mutate $2 = 1
[5] Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Binary read x$1_@0 + read $2_@3
Goto(Continue) bb1
bb2:
predecessor blocks: bb1
Return read x$1
Return read x$1_@0
```
### CFG
@@ -41,26 +41,26 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[1] Let mutate x$1_@0 = 1
"]
bb0_instrs --> bb0_terminal(["While"])
end
subgraph bb1
bb1_instrs["
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1_@0 < read $3_@1
"]
bb1_instrs --> bb1_terminal(["If (read $4)"])
bb1_instrs --> bb1_terminal(["If (read $4_@2)"])
end
subgraph bb3
bb3_instrs["
[4] Const mutate $2 = 1
[5] Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Binary read x$1_@0 + read $2_@3
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb2
bb2_terminal(["Return read x$1"])
bb2_terminal(["Return read x$1_@0"])
end
%% Jumps
@@ -17,17 +17,17 @@ function foo() {
```
bb0:
[1] Let mutate x$1 = 1
[1] Let mutate x$1_@0 = 1
While test=bb1 loop=bb3 fallthrough=bb2
bb1:
predecessor blocks: bb0 bb3
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
If (read $4) then:bb3 else:bb2
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1 < read $3_@1
If (read $4_@2) then:bb3 else:bb2
bb3:
predecessor blocks: bb1
[4] Const mutate $2 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1 + read $2_@3
Goto(Continue) bb1
bb2:
predecessor blocks: bb1
@@ -41,21 +41,21 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$1 = 1
[1] Let mutate x$1_@0 = 1
"]
bb0_instrs --> bb0_terminal(["While"])
end
subgraph bb1
bb1_instrs["
[2] Const mutate $3 = 10
[3] Const mutate $4 = Binary read x$1 < read $3
[2] Const mutate $3_@1 = 10
[3] Const mutate $4_@2 = Binary read x$1 < read $3_@1
"]
bb1_instrs --> bb1_terminal(["If (read $4)"])
bb1_instrs --> bb1_terminal(["If (read $4_@2)"])
end
subgraph bb3
bb3_instrs["
[4] Const mutate $2 = 1
[5] Reassign mutate x$1 = Binary read x$1 + read $2
[4] Const mutate $2_@3 = 1
[5] Reassign mutate x$1_@4 = Binary read x$1 + read $2_@3
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
@@ -32,31 +32,31 @@ function Component(props) {
```
bb0:
[1] Let mutate x$2[1:6] = Array []
[2] Let mutate y$3 = undefined
[3] Const mutate $4 = false
[4] Const mutate $5 = true
[5] Const mutate $6 = 1
[1] Let mutate x$2_@0[1:6] = Array []
[2] Let mutate y$3_@1 = undefined
[3] Const mutate $4_@2 = false
[4] Const mutate $5_@3 = true
[5] Const mutate $6_@4 = 1
Switch (read props$1.p0)
Case read $6: bb1
Case read $5: bb6
Case read $6_@4: bb1
Case read $5_@3: bb6
Default: bb1
Case read $4: bb2
Case read $4_@2: bb2
bb6:
predecessor blocks: bb0
[6] Call mutate x$2.push(read props$1.p2)
[7] Reassign mutate y$3 = Array []
[6] Call mutate x$2_@0.push(read props$1.p2)
[7] Reassign mutate y$3_@5 = Array []
Goto bb1
bb2:
predecessor blocks: bb0
[8] Reassign mutate y$3 = read x$2
[8] Reassign mutate y$3_@6 = read x$2_@0
Goto bb1
bb1:
predecessor blocks: bb0 bb6 bb2
[9] Const mutate child$7 = JSX <read Component$0 data={freeze x$2} ></read Component$0>
[9] Const mutate child$7_@7 = JSX <read Component$0 data={freeze x$2_@0} ></read Component$0>
[10] Call read y$3.push(read props$1.p4)
[11] Const mutate $8 = JSX <read Component$0 data={freeze y$3} >{read child$7}</read Component$0>
Return read $8
[11] Const mutate $8_@8 = JSX <read Component$0 data={freeze y$3} >{read child$7_@7}</read Component$0>
Return read $8_@8
```
### CFG
@@ -66,41 +66,41 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$2[1:6] = Array []
[2] Let mutate y$3 = undefined
[3] Const mutate $4 = false
[4] Const mutate $5 = true
[5] Const mutate $6 = 1
[1] Let mutate x$2_@0[1:6] = Array []
[2] Let mutate y$3_@1 = undefined
[3] Const mutate $4_@2 = false
[4] Const mutate $5_@3 = true
[5] Const mutate $6_@4 = 1
"]
bb0_instrs --> bb0_terminal(["Switch (read props$1.p0)"])
end
subgraph bb6
bb6_instrs["
[6] Call mutate x$2.push(read props$1.p2)
[7] Reassign mutate y$3 = Array []
[6] Call mutate x$2_@0.push(read props$1.p2)
[7] Reassign mutate y$3_@5 = Array []
"]
bb6_instrs --> bb6_terminal(["Goto"])
end
subgraph bb2
bb2_instrs["
[8] Reassign mutate y$3 = read x$2
[8] Reassign mutate y$3_@6 = read x$2_@0
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[9] Const mutate child$7 = JSX <read Component$0 data={freeze x$2} ></read Component$0>
[9] Const mutate child$7_@7 = JSX <read Component$0 data={freeze x$2_@0} ></read Component$0>
[10] Call read y$3.push(read props$1.p4)
[11] Const mutate $8 = JSX <read Component$0 data={freeze y$3} >{read child$7}</read Component$0>
[11] Const mutate $8_@8 = JSX <read Component$0 data={freeze y$3} >{read child$7_@7}</read Component$0>
"]
bb1_instrs --> bb1_terminal(["Return read $8"])
bb1_instrs --> bb1_terminal(["Return read $8_@8"])
end
%% Jumps
bb0_terminal -- read $6 --> bb1
bb0_terminal -- read $5 --> bb6
bb0_terminal -- read $6_@4 --> bb1
bb0_terminal -- read $5_@3 --> bb6
bb0_terminal -- default --> bb1
bb0_terminal -- read $4 --> bb2
bb0_terminal -- read $4_@2 --> bb2
bb0_terminal -- fallthrough --> bb1
bb6_terminal --> bb1
bb2_terminal --> bb1
@@ -36,44 +36,44 @@ function foo(x) {
```
bb0:
[1] Let mutate y$2 = undefined
[2] Const mutate $3 = 5
[3] Const mutate $4 = 4
[4] Const mutate $5 = 3
[5] Const mutate $6 = 2
[6] Const mutate $7 = 1
[7] Const mutate $8 = 0
[1] Let mutate y$2_@0 = undefined
[2] Const mutate $3_@1 = 5
[3] Const mutate $4_@2 = 4
[4] Const mutate $5_@3 = 3
[5] Const mutate $6_@4 = 2
[6] Const mutate $7_@5 = 1
[7] Const mutate $8_@6 = 0
Switch (read x$1)
Case read $8: bb10
Case read $7: bb9
Case read $6: bb1
Case read $5: bb5
Case read $4: bb4
Case read $3: bb3
Case read $8_@6: bb10
Case read $7_@5: bb9
Case read $6_@4: bb1
Case read $5_@3: bb5
Case read $4_@2: bb4
Case read $3_@1: bb3
Default: bb2
bb10:
predecessor blocks: bb0
[8] Reassign mutate y$2 = 0
[8] Reassign mutate y$2_@7 = 0
Goto bb9
bb9:
predecessor blocks: bb10 bb0
[9] Reassign mutate y$2 = 1
[9] Reassign mutate y$2_@8 = 1
Goto bb1
bb5:
predecessor blocks: bb0
[10] Reassign mutate y$2 = 3
[10] Reassign mutate y$2_@9 = 3
Goto bb1
bb4:
predecessor blocks: bb0
[11] Reassign mutate y$2 = 4
[11] Reassign mutate y$2_@10 = 4
Goto bb3
bb3:
predecessor blocks: bb4 bb0
[12] Reassign mutate y$2 = 5
[12] Reassign mutate y$2_@11 = 5
Goto bb2
bb2:
predecessor blocks: bb3 bb0
[13] Reassign mutate y$2 = 0
[13] Reassign mutate y$2_@12 = 0
Goto bb1
bb1:
predecessor blocks: bb9 bb0 bb5 bb2
@@ -87,49 +87,49 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate y$2 = undefined
[2] Const mutate $3 = 5
[3] Const mutate $4 = 4
[4] Const mutate $5 = 3
[5] Const mutate $6 = 2
[6] Const mutate $7 = 1
[7] Const mutate $8 = 0
[1] Let mutate y$2_@0 = undefined
[2] Const mutate $3_@1 = 5
[3] Const mutate $4_@2 = 4
[4] Const mutate $5_@3 = 3
[5] Const mutate $6_@4 = 2
[6] Const mutate $7_@5 = 1
[7] Const mutate $8_@6 = 0
"]
bb0_instrs --> bb0_terminal(["Switch (read x$1)"])
end
subgraph bb10
bb10_instrs["
[8] Reassign mutate y$2 = 0
[8] Reassign mutate y$2_@7 = 0
"]
bb10_instrs --> bb10_terminal(["Goto"])
end
subgraph bb9
bb9_instrs["
[9] Reassign mutate y$2 = 1
[9] Reassign mutate y$2_@8 = 1
"]
bb9_instrs --> bb9_terminal(["Goto"])
end
subgraph bb5
bb5_instrs["
[10] Reassign mutate y$2 = 3
[10] Reassign mutate y$2_@9 = 3
"]
bb5_instrs --> bb5_terminal(["Goto"])
end
subgraph bb4
bb4_instrs["
[11] Reassign mutate y$2 = 4
[11] Reassign mutate y$2_@10 = 4
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb3
bb3_instrs["
[12] Reassign mutate y$2 = 5
[12] Reassign mutate y$2_@11 = 5
"]
bb3_instrs --> bb3_terminal(["Goto"])
end
subgraph bb2
bb2_instrs["
[13] Reassign mutate y$2 = 0
[13] Reassign mutate y$2_@12 = 0
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
@@ -138,12 +138,12 @@ flowchart TB
end
%% Jumps
bb0_terminal -- read $8 --> bb10
bb0_terminal -- read $7 --> bb9
bb0_terminal -- read $6 --> bb1
bb0_terminal -- read $5 --> bb5
bb0_terminal -- read $4 --> bb4
bb0_terminal -- read $3 --> bb3
bb0_terminal -- read $8_@6 --> bb10
bb0_terminal -- read $7_@5 --> bb9
bb0_terminal -- read $6_@4 --> bb1
bb0_terminal -- read $5_@3 --> bb5
bb0_terminal -- read $4_@2 --> bb4
bb0_terminal -- read $3_@1 --> bb3
bb0_terminal -- default --> bb2
bb0_terminal -- fallthrough --> bb1
bb10_terminal --> bb9
@@ -28,30 +28,30 @@ function Component(props) {
```
bb0:
[1] Let mutate x$2[1:6] = Array []
[2] Let mutate y$3 = undefined
[3] Const mutate $4 = false
[4] Const mutate $5 = true
[1] Let mutate x$2_@0[1:6] = Array []
[2] Let mutate y$3_@1 = undefined
[3] Const mutate $4_@2 = false
[4] Const mutate $5_@3 = true
Switch (read props$1.p0)
Case read $5: bb4
Case read $4: bb2
Case read $5_@3: bb4
Case read $4_@2: bb2
Default: bb1
bb4:
predecessor blocks: bb0
[5] Call mutate x$2.push(read props$1.p2)
[6] Call mutate x$2.push(read props$1.p3)
[7] Reassign mutate y$3 = Array []
[5] Call mutate x$2_@0.push(read props$1.p2)
[6] Call mutate x$2_@0.push(read props$1.p3)
[7] Reassign mutate y$3_@4 = Array []
Goto bb2
bb2:
predecessor blocks: bb4 bb0
[8] Reassign mutate y$3 = read x$2
[8] Reassign mutate y$3_@5 = read x$2_@0
Goto bb1
bb1:
predecessor blocks: bb2 bb0
[9] Const mutate child$6 = JSX <read Component$0 data={freeze x$2} ></read Component$0>
[9] Const mutate child$6_@6 = JSX <read Component$0 data={freeze x$2_@0} ></read Component$0>
[10] Call read y$3.push(read props$1.p4)
[11] Const mutate $7 = JSX <read Component$0 data={read y$3} >{read child$6}</read Component$0>
Return read $7
[11] Const mutate $7_@7 = JSX <read Component$0 data={read y$3} >{read child$6_@6}</read Component$0>
Return read $7_@7
```
### CFG
@@ -61,39 +61,39 @@ flowchart TB
%% Basic Blocks
subgraph bb0
bb0_instrs["
[1] Let mutate x$2[1:6] = Array []
[2] Let mutate y$3 = undefined
[3] Const mutate $4 = false
[4] Const mutate $5 = true
[1] Let mutate x$2_@0[1:6] = Array []
[2] Let mutate y$3_@1 = undefined
[3] Const mutate $4_@2 = false
[4] Const mutate $5_@3 = true
"]
bb0_instrs --> bb0_terminal(["Switch (read props$1.p0)"])
end
subgraph bb4
bb4_instrs["
[5] Call mutate x$2.push(read props$1.p2)
[6] Call mutate x$2.push(read props$1.p3)
[7] Reassign mutate y$3 = Array []
[5] Call mutate x$2_@0.push(read props$1.p2)
[6] Call mutate x$2_@0.push(read props$1.p3)
[7] Reassign mutate y$3_@4 = Array []
"]
bb4_instrs --> bb4_terminal(["Goto"])
end
subgraph bb2
bb2_instrs["
[8] Reassign mutate y$3 = read x$2
[8] Reassign mutate y$3_@5 = read x$2_@0
"]
bb2_instrs --> bb2_terminal(["Goto"])
end
subgraph bb1
bb1_instrs["
[9] Const mutate child$6 = JSX <read Component$0 data={freeze x$2} ></read Component$0>
[9] Const mutate child$6_@6 = JSX <read Component$0 data={freeze x$2_@0} ></read Component$0>
[10] Call read y$3.push(read props$1.p4)
[11] Const mutate $7 = JSX <read Component$0 data={read y$3} >{read child$6}</read Component$0>
[11] Const mutate $7_@7 = JSX <read Component$0 data={read y$3} >{read child$6_@6}</read Component$0>
"]
bb1_instrs --> bb1_terminal(["Return read $7"])
bb1_instrs --> bb1_terminal(["Return read $7_@7"])
end
%% Jumps
bb0_terminal -- read $5 --> bb4
bb0_terminal -- read $4 --> bb2
bb0_terminal -- read $5_@3 --> bb4
bb0_terminal -- read $4_@2 --> bb2
bb0_terminal -- default --> bb1
bb0_terminal -- fallthrough --> bb1
bb4_terminal --> bb2
@@ -21,6 +21,7 @@ import enterSSA from "../HIR/EnterSSA";
import { HIRFunction } from "../HIR/HIR";
import { Environment } from "../HIR/HIRBuilder";
import { inferMutableRanges } from "../HIR/InferMutableLifetimes";
import { inferReactiveScopeVariables } from "../HIR/InferReactiveScopeVariables";
import inferReferenceEffects from "../HIR/InferReferenceEffects";
import leaveSSA from "../HIR/LeaveSSA";
import printHIR from "../HIR/PrintHIR";
@@ -70,6 +71,7 @@ describe("React Forget (HIR version)", () => {
eliminateRedundantPhi(ir);
inferReferenceEffects(ir);
inferMutableRanges(ir);
inferReactiveScopeVariables(ir);
leaveSSA(ir);
const textHIR = printHIR(ir.body);
const visualization = visualizeHIRMermaid(ir);