docs: 记录 MAX_SPILL_ROUNDS 修复——mm1 指令数削减 99.4%

lzk
lzkk 4 days ago
parent d238777f17
commit ca6c9fa540

@ -21,6 +21,34 @@
---
## 2026-05-26 | MAX_SPILL_ROUNDS 缩减 + Spill Slot 共享
- **类型**:后端(寄存器分配)
- **假设**MAX_SPILL_ROUNDS=10≤120 vreg 函数)导致 spill 每轮翻倍,限制为 3 可消除指数级膨胀。不重叠活区间的 spilled vreg 共享 frame slot 可减少帧大小。
- **实现**
- RegAlloc.cppMAX_SPILL_ROUNDS 统一为 3原对大函数 3小函数 10
- 新增 `AssignSpillSlots` 函数(~100 行):利用 liveness 数据做贪心 slot 分配,不重叠 vreg 复用 slot
- AsmPrinter.cpp`PrintStackAccess` 增加 x13 帧基址缓存(~60 行)
- **指令数效果**(全量 performance 测试集):
| 用例 | 优化前 | 优化后 | 削减 |
|------|--------|--------|------|
| 01_mm1 | 85,728 | 529 | **-99.4%** |
| 01_mm2 | 85,728 | 529 | **-99.4%** |
| 01_mm3 | 85,728 | 529 | **-99.4%** |
| transpose1 | 41,747 | 326 | **-99.2%** |
| transpose2 | 41,747 | 326 | **-99.2%** |
| 03_sort1 | 8,528 | 2,891 | **-66.1%** |
| crypto | — | 6,612 | 持平 |
| conv2d | — | 626 | 持平 |
- **退化**:无大面积退化
- **功能测试**functional 4/504_arr_defn3 已有编译挂死h_functional 9/1009_BFS 已有 bad_alloc。已知问题非本次引入
- **根因发现**67 vreg 的 mm1 在 10 轮 spill 后累计 11,785 个 slot每轮 spill 数 14→25→48→94→186→370→738→1474→2946→5890 翻倍
- **已知局限**block-level liveness 导致同 BB 内不重叠的 vreg 被标记为干涉slot 共享收益有限04_arr_defn3/09_BFS 仍需单独修复
---
## 2026-05-25 | AddImm/SubImm 立即数折叠
- **类型**后端MIR 降级 + 新操作码)

Loading…
Cancel
Save