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.
Files changed (269) hide show
  1. package/.claude/commands/build-test.md +10 -0
  2. package/.claude/commands/deploy-demo.md +12 -0
  3. package/.claude/commands/stage-status.md +13 -0
  4. package/.claude/settings.json +12 -0
  5. package/.github/workflows/ci.yml +1 -0
  6. package/CLAUDE.md +231 -0
  7. package/demo.gif +0 -0
  8. package/dist/cli.js +2 -554
  9. package/dist/compile.js +2 -266
  10. package/dist/index.js +2 -159
  11. package/dist/lowering/index.js +5 -3
  12. package/dist/src/__tests__/cli.test.d.ts +1 -0
  13. package/dist/src/__tests__/cli.test.js +104 -0
  14. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  15. package/dist/src/__tests__/codegen.test.js +152 -0
  16. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  17. package/dist/src/__tests__/compile-all.test.js +108 -0
  18. package/dist/src/__tests__/dce.test.d.ts +1 -0
  19. package/dist/src/__tests__/dce.test.js +102 -0
  20. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  21. package/dist/src/__tests__/diagnostics.test.js +177 -0
  22. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  23. package/dist/src/__tests__/e2e.test.js +1789 -0
  24. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  25. package/dist/src/__tests__/entity-types.test.js +203 -0
  26. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  27. package/dist/src/__tests__/formatter.test.js +40 -0
  28. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  29. package/dist/src/__tests__/lexer.test.js +343 -0
  30. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  31. package/dist/src/__tests__/lowering.test.js +1015 -0
  32. package/dist/src/__tests__/macro.test.d.ts +8 -0
  33. package/dist/src/__tests__/macro.test.js +306 -0
  34. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  35. package/dist/src/__tests__/mc-integration.test.js +817 -0
  36. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  37. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  38. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  39. package/dist/src/__tests__/nbt.test.js +82 -0
  40. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  41. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  42. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  43. package/dist/src/__tests__/optimizer.test.js +149 -0
  44. package/dist/src/__tests__/parser.test.d.ts +1 -0
  45. package/dist/src/__tests__/parser.test.js +807 -0
  46. package/dist/src/__tests__/repl.test.d.ts +1 -0
  47. package/dist/src/__tests__/repl.test.js +27 -0
  48. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  49. package/dist/src/__tests__/runtime.test.js +289 -0
  50. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  51. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  52. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  53. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  54. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  55. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  56. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  57. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  58. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  59. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  60. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  61. package/dist/src/__tests__/typechecker.test.js +552 -0
  62. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  63. package/dist/src/__tests__/var-allocator.test.js +69 -0
  64. package/dist/src/ast/types.d.ts +515 -0
  65. package/dist/src/ast/types.js +9 -0
  66. package/dist/src/builtins/metadata.d.ts +36 -0
  67. package/dist/src/builtins/metadata.js +1014 -0
  68. package/dist/src/cli.d.ts +11 -0
  69. package/dist/src/cli.js +443 -0
  70. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  71. package/dist/src/codegen/cmdblock/index.js +45 -0
  72. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  73. package/dist/src/codegen/mcfunction/index.js +606 -0
  74. package/dist/src/codegen/structure/index.d.ts +24 -0
  75. package/dist/src/codegen/structure/index.js +279 -0
  76. package/dist/src/codegen/var-allocator.d.ts +45 -0
  77. package/dist/src/codegen/var-allocator.js +104 -0
  78. package/dist/src/compile.d.ts +37 -0
  79. package/dist/src/compile.js +165 -0
  80. package/dist/src/diagnostics/index.d.ts +44 -0
  81. package/dist/src/diagnostics/index.js +140 -0
  82. package/dist/src/events/types.d.ts +35 -0
  83. package/dist/src/events/types.js +59 -0
  84. package/dist/src/formatter/index.d.ts +1 -0
  85. package/dist/src/formatter/index.js +26 -0
  86. package/dist/src/index.d.ts +22 -0
  87. package/dist/src/index.js +45 -0
  88. package/dist/src/ir/builder.d.ts +33 -0
  89. package/dist/src/ir/builder.js +99 -0
  90. package/dist/src/ir/types.d.ts +132 -0
  91. package/dist/src/ir/types.js +15 -0
  92. package/dist/src/lexer/index.d.ts +37 -0
  93. package/dist/src/lexer/index.js +569 -0
  94. package/dist/src/lowering/index.d.ts +188 -0
  95. package/dist/src/lowering/index.js +3405 -0
  96. package/dist/src/mc-test/client.d.ts +128 -0
  97. package/dist/src/mc-test/client.js +174 -0
  98. package/dist/src/mc-test/runner.d.ts +28 -0
  99. package/dist/src/mc-test/runner.js +151 -0
  100. package/dist/src/mc-test/setup.d.ts +11 -0
  101. package/dist/src/mc-test/setup.js +98 -0
  102. package/dist/src/mc-validator/index.d.ts +17 -0
  103. package/dist/src/mc-validator/index.js +322 -0
  104. package/dist/src/nbt/index.d.ts +86 -0
  105. package/dist/src/nbt/index.js +250 -0
  106. package/dist/src/optimizer/commands.d.ts +38 -0
  107. package/dist/src/optimizer/commands.js +451 -0
  108. package/dist/src/optimizer/dce.d.ts +34 -0
  109. package/dist/src/optimizer/dce.js +639 -0
  110. package/dist/src/optimizer/passes.d.ts +34 -0
  111. package/dist/src/optimizer/passes.js +243 -0
  112. package/dist/src/optimizer/structure.d.ts +9 -0
  113. package/dist/src/optimizer/structure.js +356 -0
  114. package/dist/src/parser/index.d.ts +93 -0
  115. package/dist/src/parser/index.js +1687 -0
  116. package/dist/src/repl.d.ts +16 -0
  117. package/dist/src/repl.js +165 -0
  118. package/dist/src/runtime/index.d.ts +107 -0
  119. package/dist/src/runtime/index.js +1409 -0
  120. package/dist/src/typechecker/index.d.ts +61 -0
  121. package/dist/src/typechecker/index.js +1034 -0
  122. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  123. package/dist/src/types/entity-hierarchy.js +107 -0
  124. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  125. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  126. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  127. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  128. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  129. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  130. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  131. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  132. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  133. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  134. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  135. package/dist/src2/__tests__/lir/types.test.js +185 -0
  136. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  137. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  138. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  139. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  140. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  141. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  142. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  143. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  144. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  145. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  146. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  147. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  148. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  149. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  150. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  151. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  152. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  153. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  154. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  155. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  156. package/dist/src2/emit/compile.d.ts +19 -0
  157. package/dist/src2/emit/compile.js +80 -0
  158. package/dist/src2/emit/index.d.ts +17 -0
  159. package/dist/src2/emit/index.js +172 -0
  160. package/dist/src2/hir/lower.d.ts +15 -0
  161. package/dist/src2/hir/lower.js +378 -0
  162. package/dist/src2/hir/types.d.ts +373 -0
  163. package/dist/src2/hir/types.js +16 -0
  164. package/dist/src2/lir/lower.d.ts +15 -0
  165. package/dist/src2/lir/lower.js +453 -0
  166. package/dist/src2/lir/types.d.ts +136 -0
  167. package/dist/src2/lir/types.js +11 -0
  168. package/dist/src2/lir/verify.d.ts +14 -0
  169. package/dist/src2/lir/verify.js +113 -0
  170. package/dist/src2/mir/lower.d.ts +9 -0
  171. package/dist/src2/mir/lower.js +1030 -0
  172. package/dist/src2/mir/macro.d.ts +22 -0
  173. package/dist/src2/mir/macro.js +168 -0
  174. package/dist/src2/mir/types.d.ts +183 -0
  175. package/dist/src2/mir/types.js +11 -0
  176. package/dist/src2/mir/verify.d.ts +16 -0
  177. package/dist/src2/mir/verify.js +216 -0
  178. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  179. package/dist/src2/optimizer/block_merge.js +84 -0
  180. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  181. package/dist/src2/optimizer/branch_simplify.js +28 -0
  182. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  183. package/dist/src2/optimizer/constant_fold.js +85 -0
  184. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  185. package/dist/src2/optimizer/copy_prop.js +113 -0
  186. package/dist/src2/optimizer/dce.d.ts +8 -0
  187. package/dist/src2/optimizer/dce.js +155 -0
  188. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  189. package/dist/src2/optimizer/pipeline.js +42 -0
  190. package/dist/tsconfig.tsbuildinfo +1 -0
  191. package/docs/compiler-pipeline-redesign.md +2243 -0
  192. package/docs/optimization-ideas.md +1076 -0
  193. package/editors/vscode/package-lock.json +3 -3
  194. package/editors/vscode/package.json +1 -1
  195. package/jest.config.js +1 -1
  196. package/package.json +6 -5
  197. package/scripts/postbuild.js +15 -0
  198. package/src/__tests__/cli.test.ts +8 -220
  199. package/src/__tests__/dce.test.ts +11 -56
  200. package/src/__tests__/diagnostics.test.ts +59 -38
  201. package/src/__tests__/mc-integration.test.ts +1 -2
  202. package/src/ast/types.ts +6 -1
  203. package/src/cli.ts +29 -156
  204. package/src/compile.ts +6 -162
  205. package/src/index.ts +14 -178
  206. package/src/mc-test/runner.ts +4 -3
  207. package/src/parser/index.ts +1 -1
  208. package/src/repl.ts +1 -1
  209. package/src/runtime/index.ts +1 -1
  210. package/src2/__tests__/e2e/basic.test.ts +154 -0
  211. package/src2/__tests__/e2e/macros.test.ts +199 -0
  212. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  213. package/src2/__tests__/hir/desugar.test.ts +263 -0
  214. package/src2/__tests__/lir/lower.test.ts +619 -0
  215. package/src2/__tests__/lir/types.test.ts +207 -0
  216. package/src2/__tests__/lir/verify.test.ts +249 -0
  217. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  218. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  219. package/src2/__tests__/mir/verify.test.ts +254 -0
  220. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  221. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  222. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  223. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  224. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  225. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  226. package/src2/emit/compile.ts +99 -0
  227. package/src2/emit/index.ts +222 -0
  228. package/src2/hir/lower.ts +428 -0
  229. package/src2/hir/types.ts +216 -0
  230. package/src2/lir/lower.ts +556 -0
  231. package/src2/lir/types.ts +109 -0
  232. package/src2/lir/verify.ts +129 -0
  233. package/src2/mir/lower.ts +1160 -0
  234. package/src2/mir/macro.ts +167 -0
  235. package/src2/mir/types.ts +106 -0
  236. package/src2/mir/verify.ts +218 -0
  237. package/src2/optimizer/block_merge.ts +93 -0
  238. package/src2/optimizer/branch_simplify.ts +27 -0
  239. package/src2/optimizer/constant_fold.ts +88 -0
  240. package/src2/optimizer/copy_prop.ts +106 -0
  241. package/src2/optimizer/dce.ts +133 -0
  242. package/src2/optimizer/pipeline.ts +44 -0
  243. package/tsconfig.json +2 -2
  244. package/src/__tests__/codegen.test.ts +0 -161
  245. package/src/__tests__/e2e.test.ts +0 -2039
  246. package/src/__tests__/entity-types.test.ts +0 -236
  247. package/src/__tests__/lowering.test.ts +0 -1185
  248. package/src/__tests__/macro.test.ts +0 -343
  249. package/src/__tests__/nbt.test.ts +0 -58
  250. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  251. package/src/__tests__/optimizer.test.ts +0 -162
  252. package/src/__tests__/runtime.test.ts +0 -305
  253. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  254. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  255. package/src/__tests__/stdlib-math.test.ts +0 -374
  256. package/src/__tests__/stdlib-vec.test.ts +0 -259
  257. package/src/__tests__/structure-optimizer.test.ts +0 -38
  258. package/src/__tests__/var-allocator.test.ts +0 -75
  259. package/src/codegen/cmdblock/index.ts +0 -63
  260. package/src/codegen/mcfunction/index.ts +0 -662
  261. package/src/codegen/structure/index.ts +0 -346
  262. package/src/codegen/var-allocator.ts +0 -104
  263. package/src/ir/builder.ts +0 -116
  264. package/src/ir/types.ts +0 -134
  265. package/src/lowering/index.ts +0 -3876
  266. package/src/optimizer/commands.ts +0 -534
  267. package/src/optimizer/dce.ts +0 -679
  268. package/src/optimizer/passes.ts +0 -250
  269. 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"}