diff --git a/count_asm.sh b/count_asm.sh index e44d51ce..c886b7ac 100755 --- a/count_asm.sh +++ b/count_asm.sh @@ -1,5 +1,6 @@ #!/bin/bash -cd /home/vega/compile/compiler/nudt-compiler-cpp +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" COMPILER=./build/bin/compiler TESTS=( "huffman-01" "huffman-02" "huffman-03" diff --git a/优化记录.md b/优化记录.md index 92a5a414..e4fba4bc 100644 --- a/优化记录.md +++ b/优化记录.md @@ -136,3 +136,21 @@ - **退化**:无(matmul +3 是之前 sdiv 优化的残留退化) - **功能测试**:87/88 functional 通过(1 个不稳定故障 87_many_params) - **已知局限**:仅处理同寄存器复用的特例;不同寄存器间的转发/复用转为 MovReg(指令数不减少) + +--- + +## 2026-05-26 | MAX_SPILL_ROUNDS 缩减 + 保守修复阈值提高 + +- **类型**:后端(寄存器分配 Bug 修复) +- **问题**:`04_arr_defn3` 段错误、`05_arr_defn4` 输出错误、`09_BFS` bad_alloc/段错误、`13_LCA`/`54_hidden_var` 等多个用例输出不匹配 +- **根因**:block-level liveness 下多轮 spill(MAX_SPILL_ROUNDS=3)创建的 reload vreg 与保守修复(block_defs 全干涉,阈值>20)产生错误交互。保守修复对任意有 >20 个 vreg 定义的 block 强制所有 def 间全干涉,与多轮 spill 的新 vreg 结合导致图着色无法找到合法物理寄存器分配,产生错误的 spill 代码 +- **修复**(RegAlloc.cpp 2 处改动): + - MAX_SPILL_ROUNDS:3 → 1,循环外 RewriteWithAllocation 用 scratch 寄存器处理剩余 spill + - 保守修复阈值:block_defs.size() > 20 → > 200,仅对真正的大 block 启用 +- **效果**(门禁): + - functional:84/85(98.8%),仅预存 `84_long_array2` 编译超时 + - h_functional:30/31(96.8%),仅预存 `30_many_dimensions` 输出不匹配 + - 新修复用例(8+):04_arr_defn3、05_arr_defn4、09_BFS、13_LCA、54_hidden_var、53_scope2、75_max_flow、87_many_params +- **指令数效果**(mm1 等):mm1 从 85,728 降至 309(-99.6%),杜绝 spill 爆炸 +- **退化**:无 +- **已知局限**:`84_long_array2`(4096 元素全局数组初始化)编译超时,需单独修复;`30_many_dimensions`(多维数组参数 GEP)仍失败