v8 术语中 merge、phi、effectphi 和 dead 的含义

2023-12-12

我正在尝试阅读 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(使用前将#替换为@)

v8 术语中 merge、phi、effectphi 和 dead 的含义 的相关文章

  • 是否可以通过脚本禁用 Firefox JavaScript JIT?

    我们的网站有一个相当复杂的 JS 应用程序 该应用程序在最新的 Firefox 10 版本中失败 这是由于 JS 解释器中的一个错误导致变量返回 NULL 而实际上它们显然不是这样 此错误仅在 JIT 编译器处于活动状态时发生 而不是在禁用
  • 从脚本/命令行执行浏览器页面/javascript

    希望这不是一个愚蠢的问题 我最近对一些我很好奇的事情有了一个想法 我是 Node js 我认为与此无关 和 V8 引擎的粉丝 但我想知道是否可以在内部运行浏览器 让它执行 JS 我的意思是创建一个程序 可能使用 V8 引擎 它可以打开一个页
  • Google Apps Script V8 分配给 null 会取消调试

    将变量赋值为 null 会导致调试取消该行的执行 这是重现该问题的测试脚本 function myFunction var a Hallo Logger log a a var b null Logger log b b 调试时 此脚本执行
  • Nodejs 分析:父级(切片字符串)

    我分析了我的 Nodejs 应用程序并看到一些奇怪的字符串 它被标记为父级 切片字符串 我使用 v8 profiler 和 node inspector 这是分析器屏幕的照片 抱歉是照片 不是屏幕截图 只是我的系统真的超载并且没有足够的空间
  • 及时编译 - 存储与始终执行[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JVM 不缓存 JIT 编译的代码 https stackoverflow com questions 1992486 why doesnt the jvm cache jit compile
  • Perl:Javascript::V8 模板 - 来自 Perl

    寻找像 HTML Mason 或 Mason 这样的模板引擎 那么什么将源组件 编译 为 perl 代码 而不是 perl 代码将组件 编译 为 JavaScript 代码 然后使用 Javascript V8 运行 执行它们Perl 模块
  • 在 64 位 Windows 计算机上使用 32 位 com 运行 32 位应用程序

    我有一个使用 C COM 对象的 C 应用程序 两者都构建在 32 位计算机上 现在我必须在 64 位机器上运行它们 我注册了COM对象 在计算机 hkey classes root wow6432node clsid xxx 下的寄存器中
  • 为什么 WPF 应用程序的默认平台目标是 Visual Studio x86 而不是 AnyCPU?

    当我在 Visual Studio 2012 中创建新的 WPF 应用程序时 平台目标和生成配置默认设置为 x86 为什么会这样呢 对于普通的 WPF 应用程序 没有任何对混合模式程序集的引用 使用 AnyCPU 是否存在任何危险 因此我的
  • 有没有办法向 JavaScript 对象添加元数据?

    我想将元数据的键值对添加到任意 JavaScript 对象 此元数据不应影响不知道元数据的代码 这意味着例如 JSON stringify obj JSON stringify obj WithMetaData key value 元数据感
  • 在 numba.jit 装饰器中使用并行选项会使函数给出错误的结果

    给定一个矩形的两个对角 x1 y1 and x2 y2 和两个半径r1 and r2 找到位于由半径定义的圆之间的点的比率r1 and r2到矩形中的点数 简单的 NumPy 方法 def func 1 x1 y1 x2 y2 r1 r2
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • JVM 是否会内联对象的实例变量和方法?

    假设我有一个非常紧密的内部循环 每次迭代都会访问和改变一个簿记对象 该对象存储有关算法的一些简单数据 并具有用于操作它的简单逻辑 簿记对象是私有的和最终的 并且它的所有方法都是私有的 最终的和 inline 下面是一个示例 Scala 语法
  • 如何证明 .NET CLR JIT 每次运行只编译每个方法一次?

    There s 一个老问题 https stackoverflow com questions 1255803 does the net clr jit compile every method every time 1255832每次询问
  • iOS App Store ExecutionEngineException 尝试 JIT 编译

    我有一个非常尴尬的问题 我已经为 iOS 构建了我的应用程序 并在所有模拟器上对其进行了测试 并且运行良好 我已将其安装在设备 iPhone 6 plus 上 效果也很好 然而 当我将其提交到应用商店时 反馈是它在所有设备上启动时都会崩溃
  • 引用与指针的执行速度

    我最近阅读了一篇关于托管语言是否比本机语言 特别是 C 与 C 慢 或快 的讨论 一位参与讨论的人士表示 托管语言的 JIT 编译器将能够对引用进行优化 而这在使用指针的语言中是不可能实现的 我想知道的是 对于引用而不是指针可以进行 什么样
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • 如何在 x86 汇编中编写自修改代码

    我正在考虑为我最近开发的一个业余爱好虚拟机编写一个 JIT 编译器 我了解一些汇编语言 我主要是一名 C 程序员 我可以阅读大多数汇编语言并参考我不理解的操作码 并编写一些简单的程序 但是我很难理解这几个示例我在网上找到的自我修改代码 这是
  • 为什么这些 Javascript for 循环在 Firefox 上比 Chrome / Safari 上慢得多?

    我在搞基准网站jfprefs http jsperf com 并创建了我自己的基准http jsperf com prefix or postfix increment 9 http jsperf com prefix or postfix
  • 禁用 WerFault.exe/“应用程序已停止工作”崩溃对话框

    我有一个开发工具在启动时崩溃 我看不到它抛出的任何错误消息 也没有机会调试它 因为它显示了崩溃程序的 Windows 7 对话框 其中显示 Windows 正在检查寻求解决方案 我想让我的老派大屁股断言对话框回来 有一个大的 调试 按钮 我
  • 将值存储为变量或再次调用方法更好吗?

    最近 我开始学习一些Java 从我对 JVM 的了解来看 JIT 使其在需要 CPU 周期的操作 即调用方法 上变得非常快 但也使其对内存产生了饥饿感 因此 当我需要与以前相同的方法获得相同的输出时 将之前的输出存储在变量中并再次使用它 同

随机推荐