3.1 KiB
Lab1 语法树构建
要做什么:补全 SysY 文法,保证更多合法程序可被解析并打印语法树。 主要改哪些文件: Lab1-语法树构建.md SysY.g4 AntlrDriver.cpp SyntaxTreePrinter.cpp 修改方式: 扩展 grammar 规则和 token;保持解析入口稳定;错误信息要可定位到行列;语法树打印结构清晰。 验收:parse-tree 模式批量通过测试集。 Lab2 中间表示生成
要做什么:把语义检查和 IR 生成从最小子集扩展到课程要求语法。 主要改哪些文件: Lab2-中间表示生成.md Sema.h SymbolTable.h Sema.cpp SymbolTable.cpp IR.h IRBuilder.cpp Instruction.cpp IRPrinter.cpp IRGen.h IRGenDecl.cpp IRGenStmt.cpp IRGenExp.cpp IRGenFunc.cpp IRGenDriver.cpp 修改方式: 先补语义绑定和错误检查,再补 IR 指令与类型,最后在 Visitor 里把各类语句表达式翻译到 IR。 验收:IR 能生成,并且 verify_ir 脚本 run 模式和输出比对通过。 Lab3 指令选择与汇编生成
要做什么:把 IR 正确 lower 到 AArch64 汇编,覆盖更多语义。 主要改哪些文件: Lab3-指令选择与汇编生成.md MIR.h Lowering.cpp RegAlloc.cpp FrameLowering.cpp AsmPrinter.cpp 修改方式: 扩充 MIR 指令和操作数表示;完善 lowering 映射;保证栈帧和函数序言尾声正确;输出可汇编可运行的 asm。 验收:verify_asm 脚本 run 模式通过。 Lab4 基本标量优化
要做什么:先做 mem2reg,再做常量相关优化、DCE、CFG 简化、CSE 等。 主要改哪些文件: Lab4-基本标量优化.md Mem2Reg.cpp ConstFold.cpp ConstProp.cpp DCE.cpp CSE.cpp CFGSimplify.cpp PassManager.cpp DominatorTree.cpp LoopInfo.cpp 修改方式: 实现每个 pass 的核心逻辑,并在 PassManager 固化顺序和迭代策略。 验收:优化前后语义一致,IR/ASM 回归测试通过。 Lab5 寄存器分配与后端优化
要做什么:从固定寄存器模板,升级到虚拟寄存器+真实分配+spill/reload,再做后端局部优化。 主要改哪些文件: Lab5-寄存器分配.md MIR.h Lowering.cpp RegAlloc.cpp FrameLowering.cpp AsmPrinter.cpp Peephole.cpp PassManager.cpp 修改方式: Lowering 先产出 vreg;RA 选图着色或线扫;处理调用约定和栈槽;最后做 peephole 与冗余访存清理。 验收:全测试正确,且汇编明显减少无效 move/load/store。 Lab6 并行与循环优化
要做什么:识别循环结构并做循环优化,必要时尝试并行化识别。 主要改哪些文件: Lab6-并行与循环优化.md DominatorTree.cpp LoopInfo.cpp PassManager.cpp CMakeLists.txt 修改方式: 补稳定的循环分析,再实现 LICM、强度削弱、展开、分裂中的一部分,并接入 pass 流程。 验收:功能回归全通过,同时在代表性用例看到性能或代码质量收益。 你可以直接照这个顺序推进
先做 Lab2,优先把语义和 IR 生成功能面补全。 再做 Lab3,保证语义到汇编端到端正确。 接着做 Lab4,把优化 pass 跑通。 然后做 Lab5,完成真实寄存器分配。 最后做 Lab6,补循环优化和并行化探索。