形式陈述 ​
设
等价的结构描述是:每个循环区域都能选出一个支配区域内节点的 header,所有从区域外进入的控制都先经过该 header。文献也用迭代 T1/T2 变换定义可归约流图;使用“DFS back edge”口径时必须说明对所用 DFS 与 retreating edges 的关系,不能把某次搜索中指向祖先的边未经支配检查就称为自然循环回边。
对回边
直觉
结构化的 while 循环有一道门:第一次进入和以后回跳都经过循环头。可归约 CFG 允许嵌套、多个回边和复杂分支,但每个循环仍能围绕这样一个唯一入口组织。编译器因此可以把循环区域像括号一样嵌套,很多循环优化也能把 header 当作统一的检查与 φ 合流位置。
不可归约图的困难不是“存在环”,而是一个强连通区域有多个彼此不能支配的入口。执行可以从不同门直接钻进环中部,找不到单一 header 覆盖所有入口路径。这个性质属于控制结构,不直接断言程序语义错误或无法编译。
例子与边界
图
不可归约的最小图可取
不可归约不意味着 SSA 不存在。支配关系、支配边界和 φ 放置仍可在任意单入口可达 CFG 上定义;只是某些只按自然循环层次处理 φ、代码外提或循环退出的算法不能直接套用。类似地,可归约也不保证所有代码移动安全,副作用、陷阱与活跃性仍是额外条件。
推论与应用
结构化源语言在没有任意跳转、异常边扭曲或低层变换复制控制时通常产生可归约 CFG,但“通常”不是证明。间接跳转、异常处理、状态机生成器和优化后的低层控制流都可能形成多入口 SCC,分析器应检测性质后选择算法,而非依据源语言标签假定。
对可归约图,循环嵌套森林、自然循环和若干数据流求解顺序更容易建立;对不可归约图,可用 SCC 算法保守处理或先做 node splitting。选择结构化变换时要计入代码膨胀,并保持每个原路径的观察。可归约性是算法适用条件,不是编译正确性的替代品。
node splitting 的正确性也不能只看新图已经可归约。若复制
参考资料
- Matthew S. Hecht and Jeffrey D. Ullman, “Flow Graph Reducibility,” SIAM Journal on Computing 1(2), 1972, pp. 188–202.
- Steven S. Muchnick, Advanced Compiler Design and Implementation, Morgan Kaufmann, 1997, §§7.4–7.6.
- Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman, Compilers: Principles, Techniques, and Tools, 2nd ed., Pearson, 2007, §9.6.