redscript-mc 1.2.30 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/build-test.md +10 -0
- package/.claude/commands/deploy-demo.md +12 -0
- package/.claude/commands/stage-status.md +13 -0
- package/.claude/settings.json +12 -0
- package/.github/workflows/ci.yml +1 -0
- package/CLAUDE.md +231 -0
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/lowering/index.js +5 -3
- package/dist/src/__tests__/cli.test.d.ts +1 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/src/__tests__/codegen.test.d.ts +1 -0
- package/dist/src/__tests__/codegen.test.js +152 -0
- package/dist/src/__tests__/compile-all.test.d.ts +10 -0
- package/dist/src/__tests__/compile-all.test.js +108 -0
- package/dist/src/__tests__/dce.test.d.ts +1 -0
- package/dist/src/__tests__/dce.test.js +102 -0
- package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
- package/dist/src/__tests__/diagnostics.test.js +177 -0
- package/dist/src/__tests__/e2e.test.d.ts +6 -0
- package/dist/src/__tests__/e2e.test.js +1789 -0
- package/dist/src/__tests__/entity-types.test.d.ts +1 -0
- package/dist/src/__tests__/entity-types.test.js +203 -0
- package/dist/src/__tests__/formatter.test.d.ts +1 -0
- package/dist/src/__tests__/formatter.test.js +40 -0
- package/dist/src/__tests__/lexer.test.d.ts +1 -0
- package/dist/src/__tests__/lexer.test.js +343 -0
- package/dist/src/__tests__/lowering.test.d.ts +1 -0
- package/dist/src/__tests__/lowering.test.js +1015 -0
- package/dist/src/__tests__/macro.test.d.ts +8 -0
- package/dist/src/__tests__/macro.test.js +306 -0
- package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
- package/dist/src/__tests__/mc-integration.test.js +817 -0
- package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
- package/dist/src/__tests__/mc-syntax.test.js +124 -0
- package/dist/src/__tests__/nbt.test.d.ts +1 -0
- package/dist/src/__tests__/nbt.test.js +82 -0
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
- package/dist/src/__tests__/optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer.test.js +149 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/parser.test.js +807 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.js +27 -0
- package/dist/src/__tests__/runtime.test.d.ts +1 -0
- package/dist/src/__tests__/runtime.test.js +289 -0
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
- package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-math.test.js +351 -0
- package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-vec.test.js +263 -0
- package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/structure-optimizer.test.js +33 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/src/__tests__/typechecker.test.js +552 -0
- package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
- package/dist/src/__tests__/var-allocator.test.js +69 -0
- package/dist/src/ast/types.d.ts +515 -0
- package/dist/src/ast/types.js +9 -0
- package/dist/src/builtins/metadata.d.ts +36 -0
- package/dist/src/builtins/metadata.js +1014 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.js +443 -0
- package/dist/src/codegen/cmdblock/index.d.ts +26 -0
- package/dist/src/codegen/cmdblock/index.js +45 -0
- package/dist/src/codegen/mcfunction/index.d.ts +40 -0
- package/dist/src/codegen/mcfunction/index.js +606 -0
- package/dist/src/codegen/structure/index.d.ts +24 -0
- package/dist/src/codegen/structure/index.js +279 -0
- package/dist/src/codegen/var-allocator.d.ts +45 -0
- package/dist/src/codegen/var-allocator.js +104 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/src/diagnostics/index.d.ts +44 -0
- package/dist/src/diagnostics/index.js +140 -0
- package/dist/src/events/types.d.ts +35 -0
- package/dist/src/events/types.js +59 -0
- package/dist/src/formatter/index.d.ts +1 -0
- package/dist/src/formatter/index.js +26 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.js +45 -0
- package/dist/src/ir/builder.d.ts +33 -0
- package/dist/src/ir/builder.js +99 -0
- package/dist/src/ir/types.d.ts +132 -0
- package/dist/src/ir/types.js +15 -0
- package/dist/src/lexer/index.d.ts +37 -0
- package/dist/src/lexer/index.js +569 -0
- package/dist/src/lowering/index.d.ts +188 -0
- package/dist/src/lowering/index.js +3405 -0
- package/dist/src/mc-test/client.d.ts +128 -0
- package/dist/src/mc-test/client.js +174 -0
- package/dist/src/mc-test/runner.d.ts +28 -0
- package/dist/src/mc-test/runner.js +151 -0
- package/dist/src/mc-test/setup.d.ts +11 -0
- package/dist/src/mc-test/setup.js +98 -0
- package/dist/src/mc-validator/index.d.ts +17 -0
- package/dist/src/mc-validator/index.js +322 -0
- package/dist/src/nbt/index.d.ts +86 -0
- package/dist/src/nbt/index.js +250 -0
- package/dist/src/optimizer/commands.d.ts +38 -0
- package/dist/src/optimizer/commands.js +451 -0
- package/dist/src/optimizer/dce.d.ts +34 -0
- package/dist/src/optimizer/dce.js +639 -0
- package/dist/src/optimizer/passes.d.ts +34 -0
- package/dist/src/optimizer/passes.js +243 -0
- package/dist/src/optimizer/structure.d.ts +9 -0
- package/dist/src/optimizer/structure.js +356 -0
- package/dist/src/parser/index.d.ts +93 -0
- package/dist/src/parser/index.js +1687 -0
- package/dist/src/repl.d.ts +16 -0
- package/dist/src/repl.js +165 -0
- package/dist/src/runtime/index.d.ts +107 -0
- package/dist/src/runtime/index.js +1409 -0
- package/dist/src/typechecker/index.d.ts +61 -0
- package/dist/src/typechecker/index.js +1034 -0
- package/dist/src/types/entity-hierarchy.d.ts +29 -0
- package/dist/src/types/entity-hierarchy.js +107 -0
- package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src2/__tests__/e2e/basic.test.js +140 -0
- package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src2/__tests__/e2e/macros.test.js +182 -0
- package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
- package/dist/src2/__tests__/hir/desugar.test.js +234 -0
- package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/lower.test.js +559 -0
- package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/types.test.js +185 -0
- package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/verify.test.js +221 -0
- package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/verify.test.js +223 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src2/emit/compile.d.ts +19 -0
- package/dist/src2/emit/compile.js +80 -0
- package/dist/src2/emit/index.d.ts +17 -0
- package/dist/src2/emit/index.js +172 -0
- package/dist/src2/hir/lower.d.ts +15 -0
- package/dist/src2/hir/lower.js +378 -0
- package/dist/src2/hir/types.d.ts +373 -0
- package/dist/src2/hir/types.js +16 -0
- package/dist/src2/lir/lower.d.ts +15 -0
- package/dist/src2/lir/lower.js +453 -0
- package/dist/src2/lir/types.d.ts +136 -0
- package/dist/src2/lir/types.js +11 -0
- package/dist/src2/lir/verify.d.ts +14 -0
- package/dist/src2/lir/verify.js +113 -0
- package/dist/src2/mir/lower.d.ts +9 -0
- package/dist/src2/mir/lower.js +1030 -0
- package/dist/src2/mir/macro.d.ts +22 -0
- package/dist/src2/mir/macro.js +168 -0
- package/dist/src2/mir/types.d.ts +183 -0
- package/dist/src2/mir/types.js +11 -0
- package/dist/src2/mir/verify.d.ts +16 -0
- package/dist/src2/mir/verify.js +216 -0
- package/dist/src2/optimizer/block_merge.d.ts +12 -0
- package/dist/src2/optimizer/block_merge.js +84 -0
- package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src2/optimizer/branch_simplify.js +28 -0
- package/dist/src2/optimizer/constant_fold.d.ts +10 -0
- package/dist/src2/optimizer/constant_fold.js +85 -0
- package/dist/src2/optimizer/copy_prop.d.ts +9 -0
- package/dist/src2/optimizer/copy_prop.js +113 -0
- package/dist/src2/optimizer/dce.d.ts +8 -0
- package/dist/src2/optimizer/dce.js +155 -0
- package/dist/src2/optimizer/pipeline.d.ts +10 -0
- package/dist/src2/optimizer/pipeline.js +42 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/compiler-pipeline-redesign.md +2243 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/jest.config.js +1 -1
- package/package.json +6 -5
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +59 -38
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/ast/types.ts +6 -1
- package/src/cli.ts +29 -156
- package/src/compile.ts +6 -162
- package/src/index.ts +14 -178
- package/src/mc-test/runner.ts +4 -3
- package/src/parser/index.ts +1 -1
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src2/__tests__/e2e/basic.test.ts +154 -0
- package/src2/__tests__/e2e/macros.test.ts +199 -0
- package/src2/__tests__/e2e/migrate.test.ts +3008 -0
- package/src2/__tests__/hir/desugar.test.ts +263 -0
- package/src2/__tests__/lir/lower.test.ts +619 -0
- package/src2/__tests__/lir/types.test.ts +207 -0
- package/src2/__tests__/lir/verify.test.ts +249 -0
- package/src2/__tests__/mir/arithmetic.test.ts +156 -0
- package/src2/__tests__/mir/control-flow.test.ts +242 -0
- package/src2/__tests__/mir/verify.test.ts +254 -0
- package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src2/__tests__/optimizer/dce.test.ts +83 -0
- package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src2/emit/compile.ts +99 -0
- package/src2/emit/index.ts +222 -0
- package/src2/hir/lower.ts +428 -0
- package/src2/hir/types.ts +216 -0
- package/src2/lir/lower.ts +556 -0
- package/src2/lir/types.ts +109 -0
- package/src2/lir/verify.ts +129 -0
- package/src2/mir/lower.ts +1160 -0
- package/src2/mir/macro.ts +167 -0
- package/src2/mir/types.ts +106 -0
- package/src2/mir/verify.ts +218 -0
- package/src2/optimizer/block_merge.ts +93 -0
- package/src2/optimizer/branch_simplify.ts +27 -0
- package/src2/optimizer/constant_fold.ts +88 -0
- package/src2/optimizer/copy_prop.ts +106 -0
- package/src2/optimizer/dce.ts +133 -0
- package/src2/optimizer/pipeline.ts +44 -0
- package/tsconfig.json +2 -2
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3876
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/dce.ts +0 -679
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Block Merging — MIR optimization pass.
|
|
4
|
+
*
|
|
5
|
+
* Merges a block B into its sole predecessor A when:
|
|
6
|
+
* - A ends with an unconditional jump to B
|
|
7
|
+
* - B has exactly one predecessor (A)
|
|
8
|
+
* - B is not the entry block
|
|
9
|
+
*
|
|
10
|
+
* The merged block keeps A's id and combines A's instrs + B's instrs + B's terminator.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.blockMerge = blockMerge;
|
|
14
|
+
function blockMerge(fn) {
|
|
15
|
+
let blocks = fn.blocks;
|
|
16
|
+
// Iterate until no more merges possible
|
|
17
|
+
let changed = true;
|
|
18
|
+
while (changed) {
|
|
19
|
+
changed = false;
|
|
20
|
+
const blockMap = new Map(blocks.map(b => [b.id, b]));
|
|
21
|
+
const predCounts = computePredCounts(blocks);
|
|
22
|
+
const newBlocks = [];
|
|
23
|
+
const removed = new Set();
|
|
24
|
+
for (const block of blocks) {
|
|
25
|
+
if (removed.has(block.id))
|
|
26
|
+
continue;
|
|
27
|
+
// Check: does this block jump unconditionally to a single-pred successor?
|
|
28
|
+
if (block.term.kind === 'jump') {
|
|
29
|
+
const targetId = block.term.target;
|
|
30
|
+
const target = blockMap.get(targetId);
|
|
31
|
+
if (target && targetId !== fn.entry && predCounts.get(targetId) === 1) {
|
|
32
|
+
// Merge target into this block
|
|
33
|
+
const merged = {
|
|
34
|
+
id: block.id,
|
|
35
|
+
instrs: [...block.instrs, ...target.instrs],
|
|
36
|
+
term: target.term,
|
|
37
|
+
preds: block.preds,
|
|
38
|
+
};
|
|
39
|
+
newBlocks.push(merged);
|
|
40
|
+
removed.add(targetId);
|
|
41
|
+
changed = true;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
newBlocks.push(block);
|
|
46
|
+
}
|
|
47
|
+
blocks = newBlocks;
|
|
48
|
+
}
|
|
49
|
+
// Recompute preds after merging
|
|
50
|
+
blocks = recomputePreds(blocks);
|
|
51
|
+
return { ...fn, blocks };
|
|
52
|
+
}
|
|
53
|
+
function computePredCounts(blocks) {
|
|
54
|
+
const counts = new Map();
|
|
55
|
+
for (const b of blocks)
|
|
56
|
+
counts.set(b.id, 0);
|
|
57
|
+
for (const block of blocks) {
|
|
58
|
+
for (const target of getTermTargets(block.term)) {
|
|
59
|
+
counts.set(target, (counts.get(target) ?? 0) + 1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return counts;
|
|
63
|
+
}
|
|
64
|
+
function recomputePreds(blocks) {
|
|
65
|
+
const predMap = new Map();
|
|
66
|
+
for (const b of blocks)
|
|
67
|
+
predMap.set(b.id, []);
|
|
68
|
+
for (const block of blocks) {
|
|
69
|
+
for (const target of getTermTargets(block.term)) {
|
|
70
|
+
const preds = predMap.get(target);
|
|
71
|
+
if (preds)
|
|
72
|
+
preds.push(block.id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return blocks.map(b => ({ ...b, preds: predMap.get(b.id) ?? [] }));
|
|
76
|
+
}
|
|
77
|
+
function getTermTargets(term) {
|
|
78
|
+
switch (term.kind) {
|
|
79
|
+
case 'jump': return [term.target];
|
|
80
|
+
case 'branch': return [term.then, term.else];
|
|
81
|
+
default: return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=block_merge.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch Simplification — MIR optimization pass.
|
|
3
|
+
*
|
|
4
|
+
* Replaces `branch(const, then, else)` with an unconditional `jump`:
|
|
5
|
+
* - branch(nonzero, then, else) → jump(then)
|
|
6
|
+
* - branch(0, then, else) → jump(else)
|
|
7
|
+
*/
|
|
8
|
+
import type { MIRFunction } from '../mir/types';
|
|
9
|
+
export declare function branchSimplify(fn: MIRFunction): MIRFunction;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Branch Simplification — MIR optimization pass.
|
|
4
|
+
*
|
|
5
|
+
* Replaces `branch(const, then, else)` with an unconditional `jump`:
|
|
6
|
+
* - branch(nonzero, then, else) → jump(then)
|
|
7
|
+
* - branch(0, then, else) → jump(else)
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.branchSimplify = branchSimplify;
|
|
11
|
+
function branchSimplify(fn) {
|
|
12
|
+
return {
|
|
13
|
+
...fn,
|
|
14
|
+
blocks: fn.blocks.map(simplifyBlock),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function simplifyBlock(block) {
|
|
18
|
+
if (block.term.kind !== 'branch')
|
|
19
|
+
return block;
|
|
20
|
+
if (block.term.cond.kind !== 'const')
|
|
21
|
+
return block;
|
|
22
|
+
const target = block.term.cond.value !== 0 ? block.term.then : block.term.else;
|
|
23
|
+
return {
|
|
24
|
+
...block,
|
|
25
|
+
term: { kind: 'jump', target },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=branch_simplify.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant Folding — MIR optimization pass.
|
|
3
|
+
*
|
|
4
|
+
* Folds instructions where all operands are constants:
|
|
5
|
+
* - Arithmetic: add(3, 4) → 7, neg(5) → -5
|
|
6
|
+
* - Comparison: cmp(lt, 3, 4) → 1
|
|
7
|
+
* - Boolean: and(1, 0) → 0, not(0) → 1
|
|
8
|
+
*/
|
|
9
|
+
import type { MIRFunction } from '../mir/types';
|
|
10
|
+
export declare function constantFold(fn: MIRFunction): MIRFunction;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Constant Folding — MIR optimization pass.
|
|
4
|
+
*
|
|
5
|
+
* Folds instructions where all operands are constants:
|
|
6
|
+
* - Arithmetic: add(3, 4) → 7, neg(5) → -5
|
|
7
|
+
* - Comparison: cmp(lt, 3, 4) → 1
|
|
8
|
+
* - Boolean: and(1, 0) → 0, not(0) → 1
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.constantFold = constantFold;
|
|
12
|
+
function constantFold(fn) {
|
|
13
|
+
return {
|
|
14
|
+
...fn,
|
|
15
|
+
blocks: fn.blocks.map(foldBlock),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function foldBlock(block) {
|
|
19
|
+
const instrs = [];
|
|
20
|
+
for (const instr of block.instrs) {
|
|
21
|
+
const folded = tryFold(instr);
|
|
22
|
+
instrs.push(folded ?? instr);
|
|
23
|
+
}
|
|
24
|
+
return { ...block, instrs };
|
|
25
|
+
}
|
|
26
|
+
function isConst(op) {
|
|
27
|
+
return op.kind === 'const';
|
|
28
|
+
}
|
|
29
|
+
function tryFold(instr) {
|
|
30
|
+
switch (instr.kind) {
|
|
31
|
+
case 'add':
|
|
32
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
33
|
+
return { kind: 'const', dst: instr.dst, value: instr.a.value + instr.b.value };
|
|
34
|
+
break;
|
|
35
|
+
case 'sub':
|
|
36
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
37
|
+
return { kind: 'const', dst: instr.dst, value: instr.a.value - instr.b.value };
|
|
38
|
+
break;
|
|
39
|
+
case 'mul':
|
|
40
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
41
|
+
return { kind: 'const', dst: instr.dst, value: instr.a.value * instr.b.value };
|
|
42
|
+
break;
|
|
43
|
+
case 'div':
|
|
44
|
+
if (isConst(instr.a) && isConst(instr.b) && instr.b.value !== 0)
|
|
45
|
+
return { kind: 'const', dst: instr.dst, value: Math.trunc(instr.a.value / instr.b.value) };
|
|
46
|
+
break;
|
|
47
|
+
case 'mod':
|
|
48
|
+
if (isConst(instr.a) && isConst(instr.b) && instr.b.value !== 0)
|
|
49
|
+
return { kind: 'const', dst: instr.dst, value: instr.a.value % instr.b.value };
|
|
50
|
+
break;
|
|
51
|
+
case 'neg':
|
|
52
|
+
if (isConst(instr.src))
|
|
53
|
+
return { kind: 'const', dst: instr.dst, value: -instr.src.value };
|
|
54
|
+
break;
|
|
55
|
+
case 'not':
|
|
56
|
+
if (isConst(instr.src))
|
|
57
|
+
return { kind: 'const', dst: instr.dst, value: instr.src.value === 0 ? 1 : 0 };
|
|
58
|
+
break;
|
|
59
|
+
case 'and':
|
|
60
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
61
|
+
return { kind: 'const', dst: instr.dst, value: (instr.a.value !== 0 && instr.b.value !== 0) ? 1 : 0 };
|
|
62
|
+
break;
|
|
63
|
+
case 'or':
|
|
64
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
65
|
+
return { kind: 'const', dst: instr.dst, value: (instr.a.value !== 0 || instr.b.value !== 0) ? 1 : 0 };
|
|
66
|
+
break;
|
|
67
|
+
case 'cmp':
|
|
68
|
+
if (isConst(instr.a) && isConst(instr.b))
|
|
69
|
+
return { kind: 'const', dst: instr.dst, value: evalCmp(instr.op, instr.a.value, instr.b.value) };
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function evalCmp(op, a, b) {
|
|
75
|
+
switch (op) {
|
|
76
|
+
case 'eq': return a === b ? 1 : 0;
|
|
77
|
+
case 'ne': return a !== b ? 1 : 0;
|
|
78
|
+
case 'lt': return a < b ? 1 : 0;
|
|
79
|
+
case 'le': return a <= b ? 1 : 0;
|
|
80
|
+
case 'gt': return a > b ? 1 : 0;
|
|
81
|
+
case 'ge': return a >= b ? 1 : 0;
|
|
82
|
+
default: return 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=constant_fold.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy Propagation — MIR optimization pass.
|
|
3
|
+
*
|
|
4
|
+
* Within each block, tracks `copy dst, src` and `const dst, value` instructions
|
|
5
|
+
* and replaces subsequent uses of `dst` with the known operand.
|
|
6
|
+
* Invalidates mappings when a temp is redefined (written to).
|
|
7
|
+
*/
|
|
8
|
+
import type { MIRFunction } from '../mir/types';
|
|
9
|
+
export declare function copyProp(fn: MIRFunction): MIRFunction;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copy Propagation — MIR optimization pass.
|
|
4
|
+
*
|
|
5
|
+
* Within each block, tracks `copy dst, src` and `const dst, value` instructions
|
|
6
|
+
* and replaces subsequent uses of `dst` with the known operand.
|
|
7
|
+
* Invalidates mappings when a temp is redefined (written to).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.copyProp = copyProp;
|
|
11
|
+
function copyProp(fn) {
|
|
12
|
+
return {
|
|
13
|
+
...fn,
|
|
14
|
+
blocks: fn.blocks.map(propBlock),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function propBlock(block) {
|
|
18
|
+
// Map from temp → the operand it was copied from
|
|
19
|
+
const copies = new Map();
|
|
20
|
+
const instrs = [];
|
|
21
|
+
for (const instr of block.instrs) {
|
|
22
|
+
// Rewrite uses first
|
|
23
|
+
const rewritten = rewriteUses(instr, copies);
|
|
24
|
+
// Invalidate any mapping whose source was just redefined
|
|
25
|
+
const dst = getDst(rewritten);
|
|
26
|
+
if (dst) {
|
|
27
|
+
// Remove any mapping that points TO this dst (as a temp source)
|
|
28
|
+
for (const [k, v] of copies) {
|
|
29
|
+
if (v.kind === 'temp' && v.name === dst) {
|
|
30
|
+
copies.delete(k);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Remove dst's own previous mapping (will be re-added below if applicable)
|
|
34
|
+
copies.delete(dst);
|
|
35
|
+
}
|
|
36
|
+
// Track new propagatable definitions
|
|
37
|
+
if (rewritten.kind === 'const') {
|
|
38
|
+
// const dst, value → record dst → const operand
|
|
39
|
+
copies.set(rewritten.dst, { kind: 'const', value: rewritten.value });
|
|
40
|
+
}
|
|
41
|
+
else if (rewritten.kind === 'copy') {
|
|
42
|
+
// copy dst, src → record dst → src (temp or const)
|
|
43
|
+
copies.set(rewritten.dst, rewritten.src);
|
|
44
|
+
}
|
|
45
|
+
instrs.push(rewritten);
|
|
46
|
+
}
|
|
47
|
+
// Also rewrite terminator uses
|
|
48
|
+
const term = rewriteUses(block.term, copies);
|
|
49
|
+
return { ...block, instrs, term };
|
|
50
|
+
}
|
|
51
|
+
function resolve(op, copies) {
|
|
52
|
+
if (op.kind === 'temp') {
|
|
53
|
+
const replacement = copies.get(op.name);
|
|
54
|
+
if (replacement)
|
|
55
|
+
return replacement;
|
|
56
|
+
}
|
|
57
|
+
return op;
|
|
58
|
+
}
|
|
59
|
+
function rewriteUses(instr, copies) {
|
|
60
|
+
switch (instr.kind) {
|
|
61
|
+
case 'copy':
|
|
62
|
+
return { ...instr, src: resolve(instr.src, copies) };
|
|
63
|
+
case 'neg':
|
|
64
|
+
case 'not':
|
|
65
|
+
return { ...instr, src: resolve(instr.src, copies) };
|
|
66
|
+
case 'add':
|
|
67
|
+
case 'sub':
|
|
68
|
+
case 'mul':
|
|
69
|
+
case 'div':
|
|
70
|
+
case 'mod':
|
|
71
|
+
case 'and':
|
|
72
|
+
case 'or':
|
|
73
|
+
return { ...instr, a: resolve(instr.a, copies), b: resolve(instr.b, copies) };
|
|
74
|
+
case 'cmp':
|
|
75
|
+
return { ...instr, a: resolve(instr.a, copies), b: resolve(instr.b, copies) };
|
|
76
|
+
case 'nbt_write':
|
|
77
|
+
return { ...instr, src: resolve(instr.src, copies) };
|
|
78
|
+
case 'call':
|
|
79
|
+
return { ...instr, args: instr.args.map(a => resolve(a, copies)) };
|
|
80
|
+
case 'call_macro':
|
|
81
|
+
return { ...instr, args: instr.args.map(a => ({ ...a, value: resolve(a.value, copies) })) };
|
|
82
|
+
case 'branch':
|
|
83
|
+
return { ...instr, cond: resolve(instr.cond, copies) };
|
|
84
|
+
case 'return':
|
|
85
|
+
return { ...instr, value: instr.value ? resolve(instr.value, copies) : null };
|
|
86
|
+
default:
|
|
87
|
+
return instr;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function getDst(instr) {
|
|
91
|
+
switch (instr.kind) {
|
|
92
|
+
case 'const':
|
|
93
|
+
case 'copy':
|
|
94
|
+
case 'add':
|
|
95
|
+
case 'sub':
|
|
96
|
+
case 'mul':
|
|
97
|
+
case 'div':
|
|
98
|
+
case 'mod':
|
|
99
|
+
case 'neg':
|
|
100
|
+
case 'cmp':
|
|
101
|
+
case 'and':
|
|
102
|
+
case 'or':
|
|
103
|
+
case 'not':
|
|
104
|
+
case 'nbt_read':
|
|
105
|
+
return instr.dst;
|
|
106
|
+
case 'call':
|
|
107
|
+
case 'call_macro':
|
|
108
|
+
return instr.dst;
|
|
109
|
+
default:
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=copy_prop.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Code Elimination — MIR optimization pass.
|
|
3
|
+
*
|
|
4
|
+
* 1. Removes definitions of temps that are never used anywhere in the function.
|
|
5
|
+
* 2. Removes unreachable blocks (no predecessors and not the entry block).
|
|
6
|
+
*/
|
|
7
|
+
import type { MIRFunction } from '../mir/types';
|
|
8
|
+
export declare function dce(fn: MIRFunction): MIRFunction;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dead Code Elimination — MIR optimization pass.
|
|
4
|
+
*
|
|
5
|
+
* 1. Removes definitions of temps that are never used anywhere in the function.
|
|
6
|
+
* 2. Removes unreachable blocks (no predecessors and not the entry block).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.dce = dce;
|
|
10
|
+
function dce(fn) {
|
|
11
|
+
// Phase 1: Remove unreachable blocks
|
|
12
|
+
let blocks = removeUnreachable(fn);
|
|
13
|
+
// Phase 2: Remove unused temp definitions
|
|
14
|
+
blocks = removeDeadDefs(fn.params, blocks);
|
|
15
|
+
// Phase 3: Recompute preds after block removal
|
|
16
|
+
blocks = recomputePreds(blocks);
|
|
17
|
+
return { ...fn, blocks };
|
|
18
|
+
}
|
|
19
|
+
function removeUnreachable(fn) {
|
|
20
|
+
const reachable = new Set();
|
|
21
|
+
const queue = [fn.entry];
|
|
22
|
+
const blockMap = new Map(fn.blocks.map(b => [b.id, b]));
|
|
23
|
+
while (queue.length > 0) {
|
|
24
|
+
const id = queue.shift();
|
|
25
|
+
if (reachable.has(id))
|
|
26
|
+
continue;
|
|
27
|
+
reachable.add(id);
|
|
28
|
+
const block = blockMap.get(id);
|
|
29
|
+
if (block) {
|
|
30
|
+
for (const target of getTermTargets(block.term)) {
|
|
31
|
+
if (!reachable.has(target))
|
|
32
|
+
queue.push(target);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return fn.blocks.filter(b => reachable.has(b.id));
|
|
37
|
+
}
|
|
38
|
+
function removeDeadDefs(params, blocks) {
|
|
39
|
+
// Collect all used temps across the entire function
|
|
40
|
+
const used = new Set();
|
|
41
|
+
for (const block of blocks) {
|
|
42
|
+
for (const instr of block.instrs) {
|
|
43
|
+
for (const t of getUsedTemps(instr))
|
|
44
|
+
used.add(t);
|
|
45
|
+
}
|
|
46
|
+
for (const t of getUsedTemps(block.term))
|
|
47
|
+
used.add(t);
|
|
48
|
+
}
|
|
49
|
+
// Remove instructions whose dst is never used, unless they have side effects
|
|
50
|
+
return blocks.map(block => ({
|
|
51
|
+
...block,
|
|
52
|
+
instrs: block.instrs.filter(instr => {
|
|
53
|
+
const dst = getDst(instr);
|
|
54
|
+
if (dst === null)
|
|
55
|
+
return true; // no dst → keep (side-effectful)
|
|
56
|
+
if (hasSideEffects(instr))
|
|
57
|
+
return true;
|
|
58
|
+
return used.has(dst);
|
|
59
|
+
}),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
function recomputePreds(blocks) {
|
|
63
|
+
const predMap = new Map();
|
|
64
|
+
for (const b of blocks)
|
|
65
|
+
predMap.set(b.id, []);
|
|
66
|
+
for (const block of blocks) {
|
|
67
|
+
for (const target of getTermTargets(block.term)) {
|
|
68
|
+
const preds = predMap.get(target);
|
|
69
|
+
if (preds)
|
|
70
|
+
preds.push(block.id);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return blocks.map(b => ({ ...b, preds: predMap.get(b.id) ?? [] }));
|
|
74
|
+
}
|
|
75
|
+
function hasSideEffects(instr) {
|
|
76
|
+
if (instr.kind === 'call' || instr.kind === 'call_macro' ||
|
|
77
|
+
instr.kind === 'call_context' || instr.kind === 'nbt_write')
|
|
78
|
+
return true;
|
|
79
|
+
// Return field temps (__rf_) write to global return slots — not dead even if unused locally
|
|
80
|
+
const dst = getDst(instr);
|
|
81
|
+
if (dst && dst.startsWith('__rf_'))
|
|
82
|
+
return true;
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
function getTermTargets(term) {
|
|
86
|
+
switch (term.kind) {
|
|
87
|
+
case 'jump': return [term.target];
|
|
88
|
+
case 'branch': return [term.then, term.else];
|
|
89
|
+
default: return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function getDst(instr) {
|
|
93
|
+
switch (instr.kind) {
|
|
94
|
+
case 'const':
|
|
95
|
+
case 'copy':
|
|
96
|
+
case 'add':
|
|
97
|
+
case 'sub':
|
|
98
|
+
case 'mul':
|
|
99
|
+
case 'div':
|
|
100
|
+
case 'mod':
|
|
101
|
+
case 'neg':
|
|
102
|
+
case 'cmp':
|
|
103
|
+
case 'and':
|
|
104
|
+
case 'or':
|
|
105
|
+
case 'not':
|
|
106
|
+
case 'nbt_read':
|
|
107
|
+
return instr.dst;
|
|
108
|
+
case 'call':
|
|
109
|
+
case 'call_macro':
|
|
110
|
+
return instr.dst;
|
|
111
|
+
default:
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function getUsedTemps(instr) {
|
|
116
|
+
const temps = [];
|
|
117
|
+
const addOp = (op) => { if (op.kind === 'temp')
|
|
118
|
+
temps.push(op.name); };
|
|
119
|
+
switch (instr.kind) {
|
|
120
|
+
case 'copy':
|
|
121
|
+
case 'neg':
|
|
122
|
+
case 'not':
|
|
123
|
+
addOp(instr.src);
|
|
124
|
+
break;
|
|
125
|
+
case 'add':
|
|
126
|
+
case 'sub':
|
|
127
|
+
case 'mul':
|
|
128
|
+
case 'div':
|
|
129
|
+
case 'mod':
|
|
130
|
+
case 'cmp':
|
|
131
|
+
case 'and':
|
|
132
|
+
case 'or':
|
|
133
|
+
addOp(instr.a);
|
|
134
|
+
addOp(instr.b);
|
|
135
|
+
break;
|
|
136
|
+
case 'nbt_write':
|
|
137
|
+
addOp(instr.src);
|
|
138
|
+
break;
|
|
139
|
+
case 'call':
|
|
140
|
+
instr.args.forEach(addOp);
|
|
141
|
+
break;
|
|
142
|
+
case 'call_macro':
|
|
143
|
+
instr.args.forEach(a => addOp(a.value));
|
|
144
|
+
break;
|
|
145
|
+
case 'branch':
|
|
146
|
+
addOp(instr.cond);
|
|
147
|
+
break;
|
|
148
|
+
case 'return':
|
|
149
|
+
if (instr.value)
|
|
150
|
+
addOp(instr.value);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
return temps;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=dce.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIR Optimization Pipeline — runs all passes to a fixpoint.
|
|
3
|
+
*
|
|
4
|
+
* Each pass is a function MIRFunction → MIRFunction.
|
|
5
|
+
* The pipeline iterates until no pass changes the function (fixpoint).
|
|
6
|
+
*/
|
|
7
|
+
import type { MIRFunction, MIRModule } from '../mir/types';
|
|
8
|
+
export type Pass = (fn: MIRFunction) => MIRFunction;
|
|
9
|
+
export declare function optimizeFunction(fn: MIRFunction, passes?: Pass[]): MIRFunction;
|
|
10
|
+
export declare function optimizeModule(mod: MIRModule, passes?: Pass[]): MIRModule;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MIR Optimization Pipeline — runs all passes to a fixpoint.
|
|
4
|
+
*
|
|
5
|
+
* Each pass is a function MIRFunction → MIRFunction.
|
|
6
|
+
* The pipeline iterates until no pass changes the function (fixpoint).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.optimizeFunction = optimizeFunction;
|
|
10
|
+
exports.optimizeModule = optimizeModule;
|
|
11
|
+
const constant_fold_1 = require("./constant_fold");
|
|
12
|
+
const copy_prop_1 = require("./copy_prop");
|
|
13
|
+
const dce_1 = require("./dce");
|
|
14
|
+
const block_merge_1 = require("./block_merge");
|
|
15
|
+
const branch_simplify_1 = require("./branch_simplify");
|
|
16
|
+
const defaultPasses = [
|
|
17
|
+
constant_fold_1.constantFold,
|
|
18
|
+
copy_prop_1.copyProp,
|
|
19
|
+
branch_simplify_1.branchSimplify,
|
|
20
|
+
dce_1.dce,
|
|
21
|
+
block_merge_1.blockMerge,
|
|
22
|
+
];
|
|
23
|
+
const MAX_ITERATIONS = 20;
|
|
24
|
+
function optimizeFunction(fn, passes = defaultPasses) {
|
|
25
|
+
let current = fn;
|
|
26
|
+
for (let i = 0; i < MAX_ITERATIONS; i++) {
|
|
27
|
+
const before = JSON.stringify(current);
|
|
28
|
+
for (const pass of passes) {
|
|
29
|
+
current = pass(current);
|
|
30
|
+
}
|
|
31
|
+
if (JSON.stringify(current) === before)
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
return current;
|
|
35
|
+
}
|
|
36
|
+
function optimizeModule(mod, passes) {
|
|
37
|
+
return {
|
|
38
|
+
...mod,
|
|
39
|
+
functions: mod.functions.map(fn => optimizeFunction(fn, passes)),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/cli.ts","../src/compile.ts","../src/index.ts","../src/repl.ts","../src/__tests__/cli.test.ts","../src/__tests__/codegen.test.ts","../src/__tests__/compile-all.test.ts","../src/__tests__/dce.test.ts","../src/__tests__/diagnostics.test.ts","../src/__tests__/e2e.test.ts","../src/__tests__/entity-types.test.ts","../src/__tests__/formatter.test.ts","../src/__tests__/lexer.test.ts","../src/__tests__/lowering.test.ts","../src/__tests__/macro.test.ts","../src/__tests__/mc-integration.test.ts","../src/__tests__/mc-syntax.test.ts","../src/__tests__/nbt.test.ts","../src/__tests__/optimizer-advanced.test.ts","../src/__tests__/optimizer.test.ts","../src/__tests__/parser.test.ts","../src/__tests__/repl.test.ts","../src/__tests__/runtime.test.ts","../src/__tests__/stdlib-advanced.test.ts","../src/__tests__/stdlib-bigint.test.ts","../src/__tests__/stdlib-math.test.ts","../src/__tests__/stdlib-vec.test.ts","../src/__tests__/structure-optimizer.test.ts","../src/__tests__/typechecker.test.ts","../src/__tests__/var-allocator.test.ts","../src/ast/types.ts","../src/builtins/metadata.ts","../src/codegen/var-allocator.ts","../src/codegen/cmdblock/index.ts","../src/codegen/mcfunction/index.ts","../src/codegen/structure/index.ts","../src/diagnostics/index.ts","../src/events/types.ts","../src/formatter/index.ts","../src/ir/builder.ts","../src/ir/types.ts","../src/lexer/index.ts","../src/lowering/index.ts","../src/mc-test/client.ts","../src/mc-test/runner.ts","../src/mc-test/setup.ts","../src/mc-validator/index.ts","../src/nbt/index.ts","../src/optimizer/commands.ts","../src/optimizer/dce.ts","../src/optimizer/passes.ts","../src/optimizer/structure.ts","../src/parser/index.ts","../src/runtime/index.ts","../src/typechecker/index.ts","../src/types/entity-hierarchy.ts","../src2/__tests__/e2e/basic.test.ts","../src2/__tests__/e2e/macros.test.ts","../src2/__tests__/e2e/migrate.test.ts","../src2/__tests__/hir/desugar.test.ts","../src2/__tests__/lir/lower.test.ts","../src2/__tests__/lir/types.test.ts","../src2/__tests__/lir/verify.test.ts","../src2/__tests__/mir/arithmetic.test.ts","../src2/__tests__/mir/control-flow.test.ts","../src2/__tests__/mir/verify.test.ts","../src2/__tests__/optimizer/block_merge.test.ts","../src2/__tests__/optimizer/branch_simplify.test.ts","../src2/__tests__/optimizer/constant_fold.test.ts","../src2/__tests__/optimizer/copy_prop.test.ts","../src2/__tests__/optimizer/dce.test.ts","../src2/__tests__/optimizer/pipeline.test.ts","../src2/emit/compile.ts","../src2/emit/index.ts","../src2/hir/lower.ts","../src2/hir/types.ts","../src2/lir/lower.ts","../src2/lir/types.ts","../src2/lir/verify.ts","../src2/mir/lower.ts","../src2/mir/macro.ts","../src2/mir/types.ts","../src2/mir/verify.ts","../src2/optimizer/block_merge.ts","../src2/optimizer/branch_simplify.ts","../src2/optimizer/constant_fold.ts","../src2/optimizer/copy_prop.ts","../src2/optimizer/dce.ts","../src2/optimizer/pipeline.ts"],"version":"5.9.3"}
|