问题标签 [ssa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
compiler-construction - 显示什么编程语言?
因为我在谷歌上找不到任何东西,而且我以前从未见过这样的语法
我想问一下显示的是什么编程语言?
graph - 弦图和 SSA 形式程序
我的问题是为什么每个 SSA 表单程序默认都对应一个弦图。维基百科将弦图定义为
弦图是其中四个或更多顶点的所有循环都具有弦的图,弦是不属于循环但连接循环的两个顶点的边
这是一个简单的示例,取自我遵循的一些讲义,以了解 SSA 表单对注册分配的好处。作者写道:
[...] 以下程序和相应的弦图:
第一:我不明白这个图表是如何和弦的。我意识到该程序不是 SSA 形式。然后作者将其转换为SSA形式得到这个干扰图
但是我再一次看不出这是一个弦图,或者第一个图如何与后面的任何图相关。
所有这些都使得理解 SSA 程序如何产生弦交点图变得非常困难。
以下是我研究过的一些来源:
compilation - 如何使用 LLVM 将基于堆栈的虚拟机字节码转换为 SSA 形式
关于如何将 SSA 表示转换为堆栈机器存在许多问题,但我对相反的问题很感兴趣。
问题
考虑一个带有条件/无条件跳转的基于堆栈的 VM,其中每个操作码都有固定数量的它消耗和产生的堆栈元素。
LLVM 框架中是否有工具/方法可以从字节码输出中重建 SSA 形式。这本质上是一种拆卸形式。
llvm-ir - 如何获取 phi 变量在 LLVM-IR 中包含的程序变量
对于像这样的 IR
因此,如果我在我的 llvm-pass 中进行迭代并在第三条指令中遇到使用 0.1。我将它存储在值类中(使用 Instruction->getOperand(0)),比如说名称 v1。现在我如何遍历 0.1 可能包含的 y、z 和 x 变量。在 v1 上调用什么。
我已尝试阅读 llvm 文档和以下链接,但没有为 llvm-passes 提供语法
https://llvm.org/docs/MemorySSA.html 我正在尝试以下代码
compiler-construction - LLVM的内存依赖分析上下文中的“clobbers”是什么意思
我是 LLVM 的新手,我目前正在研究涉及内存依赖性分析的东西。阅读文档我发现“clobber”这个词被大量使用。现在,我确实了解内联汇编器等方面的破坏寄存器是什么,但它在 LLVM 文档中的用法让我感到困惑。
例如,在https://llvm.org/docs/MemorySSA.html中提到:
给定 MemoryAccess 的操作数都是所述 MemoryAccess 的(潜在)破坏者,并且 MemoryAccess 产生的值可以充当其他 MemoryAccesses 的破坏者......
或者
%a 的商店显然不是 %b 的商店的破坏者。walker 的目标是弄清楚这一点,并在查询 MemoryAccess 2 的clobber 时返回 liveOnEntry。
或者
如果您选择制作自己的助行器,您可以通过以下方式找到 MemoryAccess 的破坏者...
此外,在这个(简短的)谈话中,他在 0:38 谈到“商店破坏的东西”,在 0:53 谈到 Load 操作数是“无论别名分析所说的破坏它”。
我不确定如何理解该术语的这种用法,我希望能提供任何指向正确方向的指针。
compiler-optimization - 什么是程序点,与基本块有什么关系?
看《编译器:原理、技术和工具》这本书时,总是会遇到“程序点”这个词,虽然我对它是什么有一种模糊的感觉,并带着这种感觉,我读完了关于数据流的章节分析一下,我还是想知道“程序点”到底是什么,和基本块有什么关系?
llvm - LLVM pass 不执行单个静态分配
我使用的是预构建的 LLVM 6.0,当我执行 llvm pass-mem2reg
来生成 SSA 时,IR 代码保持原样而没有被更改。但是当我使用预构建的 LLVM 3.8 来做同样的事情时,llvm pass 就可以了。但是,我需要使用 LLVM 6.0,因为我正在使用利用此 LLVM 版本的其他工具。
举一个具体的例子:这是c代码
我运行 LLVM pass 以生成 SSA,然后使用以下命令生成人类可读的 IR 代码:
当我执行相同的先前步骤但使用预构建的 LLVM 3.8 时,diff h1 h2
我得到了许多不同之处,包括以下内容
graph - 我的 SSA 结构正确吗?(重命名)
我一直在学习 ssa(静态单一赋值形式),我得到了下面插入了 phi 函数的图表,但该图表尚未重命名:
我不得不重命名变量,这就是我得到的:
我很不确定这是否正确。我是否正确重命名了变量?这是最小的ssa吗?我正在使用这里的算法( Cytron 等人的论文)来重命名变量。请帮忙!:)
optimization - SSA - 复制传播和 Phi 函数
我已经实现了一个将控制流图转换为最小 ssa 的程序(我很确定它是正确的(参见此处))。现在我正在尝试实现复制传播。我已经实现了大部分,但我不确定当我们传播的变量在 phi 函数中时该怎么做。假设我有一个要传播的变量:
此外,z_0
在 phi 函数中:
现在,在传播时,我应该z_0
在 phi 函数中做什么(因为传播完成后,我将删除 的定义z_0
)?我应该传播z_0
到 phi 函数吗?使得 phi 函数看起来像这样?:
llvm - LLVM IR中的`select`和`phi`有什么区别?
例如,我有一个 C 代码:
为了简化 LLVM IR 级别的代码(y
可以放在寄存器而不是堆栈中),我可以使用select
:
但是,如果我使用phi
,代码会变得更长:
据我所知,phi
over的唯一优势select
是phi
支持2个以上的分支,而select
只支持2个分支。除了这种情况,还有什么phi
比这更好的情况select
吗?