|
|
|
|
@ -39,22 +39,7 @@ Lab4 的目标是在 Lab3 示例基础上,把“固定寄存器 + 栈槽”的
|
|
|
|
|
|
|
|
|
|
说明:本阶段不应继续沿用 Lab3 的“所有中间值统一写回栈槽 + 固定寄存器临时搬运”的做法,而应先把指令选择结果改造成带虚拟寄存器的 MIR,再进入寄存器分配阶段;在寄存器分配与栈帧落地完成后,再针对最终机器指令序列做局部后端优化。无论选择哪一种寄存器分配算法,都需要先解决几个共同前提:为机器指令补充 `use/def` 信息、能够遍历机器基本块与控制流关系、为虚拟寄存器维护分配状态,并在 spill 后为新引入的访存指令重新参与后续流程。
|
|
|
|
|
|
|
|
|
|
后端优化部分建议保持“局部、可验证、与当前框架贴合”的范围,典型可以包括:
|
|
|
|
|
|
|
|
|
|
1. 窥孔优化
|
|
|
|
|
- 删除冗余 `move`
|
|
|
|
|
- 合并常见短指令模式
|
|
|
|
|
- 消除无效恒等操作
|
|
|
|
|
|
|
|
|
|
2. 冗余 `move/copy` 消除
|
|
|
|
|
- 删除 `mov r, r`
|
|
|
|
|
- 压缩连续拷贝链
|
|
|
|
|
- 在安全前提下减少无意义寄存器搬运
|
|
|
|
|
|
|
|
|
|
3. 局部访存冗余消除
|
|
|
|
|
- 删除明显冗余的 `load/store`
|
|
|
|
|
- 识别相邻、无干扰的重复访存
|
|
|
|
|
- 减少由 spill/reload 或固定模板生成带来的低效访存
|
|
|
|
|
后端优化部分建议保持“局部、可验证、与当前框架贴合”的范围,不必一开始就追求很重的优化框架。更合适的做法,是先围绕最终机器指令里最常见、最容易验证收益的冗余展开,例如删除明显多余的 `move/copy`,合并常见的短指令模式,清理无效恒等操作,以及减少相邻、无干扰的重复 `load/store`。如果寄存器分配或固定模板代码引入了比较机械的搬运和访存,也可以优先从这些最直观的低效模式入手做局部改进。
|
|
|
|
|
|
|
|
|
|
说明:本实验中的后端优化重点是“局部机器级优化”,并不要求实现全局代码布局优化、复杂指令调度或更高级的机器级分析框架。目标是在保证语义正确的前提下,让最终汇编更紧凑、更直接。
|
|
|
|
|
|
|
|
|
|
|