课题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:撰写文档,包含算法流程图、使用示例、可视化样例。