课题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个以上汇编文件,用模拟器/语义检查验证正确性,撰写文档。