我阅读了许多博客文章、文章、演示文稿和视频,甚至检查了 V8 的源代码,包括字节码生成器、节点海图生成器和优化阶段,但仍然找不到答案。
V8 的优化编译器 TurboFan 使用“节点海”类型的 IR。我发现的所有关于它的学术文章都说它基本上是一个 CFG 与数据流图的结合,因此有两种类型的边来连接节点:数据边和控制边。基本上,如果你只取数据边,你会形成一个数据流图,而如果你选择控制边,你会得到一个控制流图。
然而,TurboFan 还有一种边缘类型:“效果边缘”(和效果 phis)。我想这就是这张幻灯片的意思,它说这不是节点的“海洋”而是节点的“汤”,因为我在其他任何地方都找不到这个术语。据我了解,效果边缘帮助编译器保持语句/表达式的结构,如果重新排序将产生可见的副作用。每个人都使用的示例是o.f = o.f + 1
:加载必须在存储之前(或者我们将读取新值),并且添加也必须在存储之前(否则我们将存储旧值并无用地增加结果)。
但我无法理解:这不是控制边缘的目标吗?通过搜索代码我可以看到几乎每个节点都有一个效果边和一个控制边。虽然它们的用途并不明显。据我了解,在节点海中,您使用控制边来约束评估顺序。那么为什么我们需要效果和控制边缘呢?可能我错过了一些基本的东西,但我找不到它。
TL;DR:效果边缘和 EffectPhi 节点的用途是什么,以及它们与控制边缘有何不同。
太谢谢了。