课题13:窥孔优化器
难度:低
状态:✅ 收尾完成(2026-08-01)— 8 条默认规则,83/83 测试通过
完成目录(总入口):13-窥孔优化器-完成目录
深入阅读:13-窥孔优化器-设计文档
统一对比报告:../../../benchmark_reports/peephole_benchmark.html
概述:在生成的RISC-V汇编代码上,匹配并替换低效指令序列(如连续加法、冗余移动等),减少指令数。
Benchmark 统一入口为 make -s ci-peephole,会生成三类 JSON、统一 HTML
benchmark_reports/peephole_benchmark.html 和 GitHub Actions Summary 使用的
benchmark_reports/peephole_summary.md。PR 的 Benchmark CI 会将完整 HTML/JSON/Markdown
报告上传到 peephole-benchmark-report Artifact;Summary 页面直接展示三类汇总和可折叠案例明细。
详细任务:
1. 定义若干窥孔优化规则,例如:
- addi x1, x1, 1; addi x1, x1, 1 → addi x1, x1, 2(和须落入 12 位有符号立即数)
- li x1, 0; addi x1, x1, 1 → li x1, 1
- beq x0, x0, label → 无条件跳转 j label
- mv a, b; mv c, a → mv c, b(中间寄存器不再使用时;best-effort)
- addi x, x, 0 / nop / mv x, x → 删除
- ~~mv x1, x2; mv x2, x1 → 删除~~(禁止:非真交换,删除会改语义)
2. 编写汇编解析器,将每行解析为对象(标签、操作码、操作数列表)。
3. 实现滑动窗口扫描,匹配规则并替换,迭代直到不动点;窗口中间带标签时不得融合。
4. 输出优化后的汇编,并统计匹配次数和节省的指令数。
5. 集成到编译器后端,添加--peephole-asm开关。
交付产物:
- 独立的peephole模块或集成模块
- 测试汇编文件及优化前后对比(含语义/正确性用例)
- 文档:规则列表、使用方法、已知不健全点
12周每周目标:
- W1:学习窥孔优化原理,收集常见低效汇编模式。
- W2:设计规则表(每条规则包含模式指令列表和替换指令列表)。
- W3:编写汇编加载函数,将每行解析为对象(操作码、操作数等),保留原始字符串。
- W4:实现模式匹配:滑动窗口大小等于规则长度,比较操作码和操作数(支持通配符如任意寄存器)。
- W5:实现替换:删除匹配窗口,插入新指令列表,重新扫描。
- W6:实现第一条规则:addi x1,x1,1; addi x1,x1,1 → addi x1,x1,2。测试。
- W7:分析为何 mv x,y; mv y,x 不能删除;实现 mv a,b; mv c,a → mv c,b 并写语义测试。
- W8:实现规则:li x1, 0; addi x1, x1, 1 → li x1, 1。
- W9:实现规则:beq x0, x0, label → j label(需要处理标签)。
- W10:增加优化报告,打印匹配次数、节省的指令数。
- W11:集成到编译器后端(在汇编生成后自动调用),添加--peephole-asm开关。
- W12:测试10个以上汇编文件,用模拟器/语义检查验证正确性,撰写文档。