PR #41 应作为项目统一的 CFG 基础设施。寄存器分配相关 PR 将只提供机器指令语义并消费 CFG,不再独立维护 CFG 实现。
需要完善
- 统一
scratchv/analysis/cfg_builder.py 与 scratchv/ir/cfg.py,只保留一个正式 CFG API。
- 抽取可供 IR 和 Machine IR 共用的 CFG 数据结构与图算法。
- 提供 Machine IR adapter,根据指令语义识别 label、terminator 和跳转目标。
- 提供基本块级
uses/defs/live_in/live_out 反向数据流分析。
- 明确控制流规则:
- 条件分支:target + fallthrough
J/JAL:只有 target
JALR/return:无静态 successor
CALL:保留 fallthrough,不是 terminator
LABEL:基本块入口,不是可执行指令
- 明确
FOR/ENDFOR 的建边规则,或在构建 CFG 前将其规范化为 BR/BR_IF。
- 校验 entry、重复块名、悬空跳转目标和 predecessor/successor 一致性。
- 明确不可达代码接口是只分析 CFG,还是同步修改原始 IR。
测试要求
增加精确拓扑测试,覆盖:
- 线性流、if/else、diamond/join
- 单层与嵌套循环
- 多回边循环
- 条件分支和无条件跳转
- return 与 call fallthrough
- 无效 target、重复块名和空函数
- join 和循环中的
live_in/live_out
- IR CFG 降低到 Machine CFG 后的控制流一致性
验收标准
PR #41 应作为项目统一的 CFG 基础设施。寄存器分配相关 PR 将只提供机器指令语义并消费 CFG,不再独立维护 CFG 实现。
需要完善
scratchv/analysis/cfg_builder.py与scratchv/ir/cfg.py,只保留一个正式 CFG API。uses/defs/live_in/live_out反向数据流分析。J/JAL:只有 targetJALR/return:无静态 successorCALL:保留 fallthrough,不是 terminatorLABEL:基本块入口,不是可执行指令FOR/ENDFOR的建边规则,或在构建 CFG 前将其规范化为BR/BR_IF。测试要求
增加精确拓扑测试,覆盖:
live_in/live_out验收标准