Skip to content

控制流图可归约性

Control-flow graph reducibility · Reducible flow graph · 可归约流图

以循环区域的唯一支配入口或可由受支配回边解释的环结构刻画结构化控制流。

条目类型
定义

形式陈述

G=(V,E,r) 是只含入口可达节点的控制流图。一种标准口径称 G 可归约,若边可分为 E=Ef˙Eb,使 (V,Ef) 无环,且每条 (u,h)Eb 的头 h控制流支配关系支配尾 u。这时回边 (u,h) 的 natural loop 由 hu 以及不经 h 可反向到达 u 的节点组成,h 是该循环的唯一入口。

等价的结构描述是:每个循环区域都能选出一个支配区域内节点的 header,所有从区域外进入的控制都先经过该 header。文献也用迭代 T1/T2 变换定义可归约流图;使用“DFS back edge”口径时必须说明对所用 DFS 与 retreating edges 的关系,不能把某次搜索中指向祖先的边未经支配检查就称为自然循环回边。

对回边 uh,natural loop 可由反向搜索具体构造:从 u 开始沿前驱边搜索,但遇到 h 停止,最后加入 h。支配条件保证搜索得到的节点除 h 外不会接受来自循环外的入口。若若干回边共享 h,它们的 natural loops 可以合并为同一 header 的循环区域;若两个循环头互不支配,不能仅因 SCC 相交就随意选一个作为外层。

直觉

结构化的 while 循环有一道门:第一次进入和以后回跳都经过循环头。可归约 CFG 允许嵌套、多个回边和复杂分支,但每个循环仍能围绕这样一个唯一入口组织。编译器因此可以把循环区域像括号一样嵌套,很多循环优化也能把 header 当作统一的检查与 φ 合流位置。

不可归约图的困难不是“存在环”,而是一个强连通区域有多个彼此不能支配的入口。执行可以从不同门直接钻进环中部,找不到单一 header 覆盖所有入口路径。这个性质属于控制结构,不直接断言程序语义错误或无法编译。

例子与边界

rh,ha,ab,bh,he 可归约:删去回边 bh 后无环,且 h 支配 b。其 natural loop 是 {h,a,b},所有外部进入路径先到 h。即使再加 ah,仍可有多个回边共享同一 header,而不会破坏唯一入口。

不可归约的最小图可取 ra,rb,ab,ba{a,b} 强连通,却有从 r 分别进入 a,b 的两条边;a 不支配 bb 也不支配 a。任选其中一条环边当“回边”,其头都不支配尾,故不能按上述方式分解。复制节点或插入调度变量可以把它结构化,但会改变图规模并需要单独证明语义。

不可归约不意味着 SSA 不存在。支配关系、支配边界和 φ 放置仍可在任意单入口可达 CFG 上定义;只是某些只按自然循环层次处理 φ、代码外提或循环退出的算法不能直接套用。类似地,可归约也不保证所有代码移动安全,副作用、陷阱与活跃性仍是额外条件。

推论与应用

结构化源语言在没有任意跳转、异常边扭曲或低层变换复制控制时通常产生可归约 CFG,但“通常”不是证明。间接跳转、异常处理、状态机生成器和优化后的低层控制流都可能形成多入口 SCC,分析器应检测性质后选择算法,而非依据源语言标签假定。

对可归约图,循环嵌套森林、自然循环和若干数据流求解顺序更容易建立;对不可归约图,可用 SCC 算法保守处理或先做 node splitting。选择结构化变换时要计入代码膨胀,并保持每个原路径的观察。可归约性是算法适用条件,不是编译正确性的替代品。

node splitting 的正确性也不能只看新图已经可归约。若复制 aa1,a2 来分开两条入口,状态关系应把两个副本都解码回原控制点 a,并证明每条新边投影为原边、每个原执行至少有合适的新执行。复制含副作用的块若让同一次路径多执行一份指令,就改变了语义;正确变换复制的是控制位置与代码表示,不是把两个副本串行执行。

参考资料
  • 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.
关系图谱2 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系