我正在尝试阅读 v8 源代码(特别是其中的编译器部分)以更好地理解优化和缩减过程(以便查找错误)。
我遇到了评论中使用的一些术语,但似乎无法解释。评论是这样的:
// Check if this is a merge that belongs to an unused diamond, which means
// that:
//
// a) the {Merge} has no {Phi} or {EffectPhi} uses, and
// b) the {Merge} has two inputs, one {IfTrue} and one {IfFalse}, which are
// both owned by the Merge, and
// c) and the {IfTrue} and {IfFalse} nodes point to the same {Branch}.
术语 Merge、Phi 和 EffectPhi 是什么意思?另外,将节点标记为“死亡”是否意味着它将被视为冗余?
提前致谢。
上面代码的链接是这样的:https://chromium.googlesource.com/v8/v8.git/+/refs/heads/master/src/compiler/common-operator-reducer.cc
V8 开发者在这里。作为背景知识,了解 V8 的“Turbofan”编译器使用“SSA”(静态单赋值)和“节点海”概念会有所帮助。有各种编译器教科书和研究论文对这些内容进行了非常详细的解释。简而言之回答您的问题:
“合并”节点合并两个控制节点,即控制流的两个分支。您可以将其视为分支的“相反”,或者相当于控制节点的 Phi。控制节点是 Turbofan 节点海设计用来确保节点不会跨某些控制流边界重新排序的机制。
“Phi”节点合并由不同分支计算的值的两种(或多种)可能性。看https://en.wikipedia.org/wiki/Static_single_assignment_form了解更多。
“EffectPhi”是 Phi 节点的特殊版本,用于“效果链”上的节点。效果链是 Turbofan 用来确保节点的外部效果(如内存加载和存储)不会明显重新排序的机制。
“死”节点是无法到达且可以被消除的节点。所以它是“多余/不必要”意义上的“冗余”,而不是“与另一个节点相同”的意义上的“冗余”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)