Lab4¶
经过前序实验,同学们已经基本完成了一个贯穿从前端到后端的简单编译器,祝贺大家!然而,该编译器生成的代码只能保证语义正确、能在目标机器上运行。接下来,我们将让大家体验如何通过增加优化 pass 让生成的代码快起来。正如课上所讲,优化的方法有很多,由于时间关系,我们不能一一尝试。因此,我们为大家准备了 Mem2Reg (访存优化,消除 load/store) 与 LICM (循环优化,不变量外提),在实验中,同学们将实现这两个优化 pass。完成代码后,同学们可以在测试样例中,看到优化前后的性能差距。
同步实验仓库¶
在进行实验之前,首先拉取实验仓库 ta 分支的最新代码,这次实验将使用助教提供的 Lab1, Lab2, Lab3 代码和框架,为了评测机能正常工作(特别是为了实现性能统计功能),你需要完全使用助教的 Lab1, Lab2, Lab3。
拉取代码
即使你已经在 ta 分支实现了 Lab3,也应该创建一个新分支,这可以使用
git switch -c lab4 upstream/ta
来实现。
然后更改后需要推送到 origin,这可以用
git push -u origin lab4:lab4
来实现。
框架与 Lab1 - Lab3 相比具有一些变化,详见助教代码介绍。
本次实验仓库更新的内容如下,每个阶段的文件将在对应文档详细说明:
.
├── ...
├── include
│ ├── ...
│ └── passes
│ ├── DeadCode.hpp # 死代码删除
│ ├── Dominators.hpp # 支配树分析(需要阅读,根据需要修改)
│ ├── FuncInfo.hpp # 纯函数分析
│ ├── LICM.hpp # 循环不变量外提(需要阅读,根据需要修改)
│ ├── LoopDetection.hpp # 循环分析(需要阅读,根据需要修改)
│ ├── Mem2Reg.hpp # Mem2Reg 分析(需要阅读,根据需要修改)
│ └── PassManager.hpp # PassManager:管理 pass 的运行
├── src
│ ├── ...
│ └── codegen
│ ├── ...
│ └── CodeGen.cpp <-- 需要实现对phi指令的处理
│ └── passes
│ ├── ...
│ ├── Dominators.cpp <-- 支配树分析实现,需要补全
│ ├── LICM.cpp <-- 循环不变量外提实现,需要补全
│ ├── LoopDetection.cpp <-- 循环分析实现,需要补全
│ └── Mem2Reg.cpp <-- Mem2Reg 实现,需要补全
└── tests
├── ...
└── 4-opt # 本地测试
实验内容¶
阶段一 Mem2Reg¶
阅读章节 Dominators 和 Mem2Reg ,完成 Dominators 支配树分析 与 Mem2Reg 访存优化 两个Pass。
Deadline
2025 年 12 月 14 日 23:59
阶段二 LICM¶
阅读章节循环相关介绍, LoopDetection 和 LICM,完成 LoopDetection 循环分析 与 LICM 循环不变量外提 两个Pass。
Deadline
2025 年 12 月 21 日 23:59
提交方式¶
- 在希冀平台提交实验仓库的 URL
在提交之前,请确保你 fork 得到的远程仓库与本地同步:
git push origin lab4