课题11:控制流图(CFG)生成器
难度:高
概述:从IR中构建控制流图,实现不可达基本块消除和循环检测,输出可视化图。
详细任务:
1. 解析IR,划分基本块(以标签、跳转、返回为边界)。
2. 构建有向图:节点为基本块,边为跳转关系(条件/无条件)。
3. 实现不可达块消除:从入口块DFS标记可达块,删除不可达块并更新IR。
4. 实现循环检测:基于支配树寻找返回边,识别自然循环。
5. 使用graphviz输出CFG为dot格式,并渲染为PNG/PDF。
6. 集成到优化管道,添加--cfg选项输出CFG。
交付产物:
- cfg_builder.py模块
- 可视化脚本
- 测试用例及生成的CFG图片
- 文档:使用方法、算法说明
12周每周目标:
- W1:学习控制流图概念,阅读IR基本块划分方法。
- W2:实现基本块划分函数:输入IR指令列表,输出块列表(每个块有ID、指令列表、终止指令)。
- W3:构建CFG:遍历每个块,根据最后一条指令(BR, JMP, RET)添加边。
- W4:输出CFG文本形式(节点列表,边列表),测试if-else和while示例。
- W5:学习graphviz的dot语言,生成简单图。
- W6:将CFG转换为dot格式,节点显示块内前几条指令摘要,边标注跳转条件。
- W7:实现不可达块消除:从入口块BFS/DFS标记可达块,删除不可达块。
- W8:学习支配树概念,实现简单算法计算每个块的直接支配者。
- W9:基于支配树识别自然循环(寻找返回边,循环头是支配者),输出循环结构。
- W10:集成不可达消除到优化管道,添加--eliminate-unreachable选项。
- W11:优化循环检测,识别嵌套循环,在CFG图中高亮不同深度循环。
- W12:撰写文档,包含算法流程图、使用示例、可视化样例。