问题标签 [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.

0 投票
1 回答
103 浏览

compiler-construction - 显示什么编程语言?

因为我在谷歌上找不到任何东西,而且我以前从未见过这样的语法

我想问一下显示的是什么编程语言?

0 投票
1 回答
146 浏览

graph - 弦图和 SSA 形式程序

我的问题是为什么每个 SSA 表单程序默认都对应一个弦图。维基百科将弦图定义为

弦图是其中四个或更多顶点的所有循环都具有弦的图,弦是不属于循环但连接循环的两个顶点的边

这是一个简单的示例,取自我遵循的一些讲义,以了解 SSA 表单对注册分配的好处。作者写道:

[...] 以下程序和相应的弦图:

令人困惑的例子

第一:我不明白这个图表是如何和弦的。我意识到该程序不是 SSA 形式。然后作者将其转换为SSA形式得到这个干扰图

后 ssa 示例干扰图

但是我再一次看不出这是一个弦图,或者第一个图如何与后面的任何图相关。

所有这些都使得理解 SSA 程序如何产生弦交点图变得非常困难。

以下是我研究过的一些来源:

  1. https://pdfs.semanticscholar.org/db6b/c047856bee4eb4e7d04f1b934864dca4b065.pdf?_ga=2.67844629.501567003.1543477413-723933249.1539714051

  2. https://homepages.dcc.ufmg.br/~fernando/publications/papers/APLAS05.pdf

  3. http://compilers.cs.uni-saarland.de/papers/ifg_ssa.pdf

  4. https://homepages.dcc.ufmg.br/~fernando/classes/dcc888/ementa/slides/SSABasedRA.pdf

0 投票
1 回答
604 浏览

compilation - 如何使用 LLVM 将基于堆栈的虚拟机字节码转换为 SSA 形式

关于如何将 SSA 表示转换为堆栈机器存在许多问题,但我对相反的问题很感兴趣。

问题

考虑一个带有条件/无条件跳转的基于堆栈的 VM,其中每个操作码都有固定数量的它消耗和产生的堆栈元素。

LLVM 框架中是否有工具/方法可以从字节码输出中重建 SSA 形式。这本质上是一种拆卸形式。

0 投票
0 回答
51 浏览

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 我正在尝试以下代码

0 投票
0 回答
223 浏览

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 操作数是“无论别名分析所说的破坏它”。

我不确定如何理解该术语的这种用法,我希望能提供任何指向正确方向的指针。

0 投票
0 回答
45 浏览

compiler-optimization - 什么是程序点,与基本块有什么关系?

看《编译器:原理、技术和工具》这本书时,总是会遇到“程序点”这个词,虽然我对它是什么有一种模糊的感觉,并带着这种感觉,我读完了关于数据流的章节分析一下,我还是想知道“程序点”到底是什么,和基本块有什么关系?

0 投票
1 回答
62 浏览

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我得到了许多不同之处,包括以下内容

0 投票
1 回答
264 浏览

graph - 我的 SSA 结构正确吗?(重命名)

我一直在学习 ssa(静态单一赋值形式),我得到了下面插入了 phi 函数的图表,但该图表尚未重命名:

给定的 ssa 图

我不得不重命名变量,这就是我得到的:

我转换的 ssa 图

我很不确定这是否正确。我是否正确重命名了变量?这是最小的ssa吗?我正在使用这里的算法 Cytron 等人的论文)来重命名变量。请帮忙!:)

0 投票
1 回答
162 浏览

optimization - SSA - 复制传播和 Phi 函数

我已经实现了一个将控制流图转换为最小 ssa 的程序(我很确定它是正确的(参见此处))。现在我正在尝试实现复制传播。我已经实现了大部分,但我不确定当我们传播的变量在 phi 函数中时该怎么做。假设我有一个要传播的变量:

此外,z_0在 phi 函数中:

现在,在传播时,我应该z_0在 phi 函数中做什么(因为传播完成后,我将删除 的定义z_0)?我应该传播z_0到 phi 函数吗?使得 phi 函数看起来像这样?:

0 投票
1 回答
213 浏览

llvm - LLVM IR中的`select`和`phi`有什么区别?

例如,我有一个 C 代码:

为了简化 LLVM IR 级别的代码(y可以放在寄存器而不是堆栈中),我可以使用select

但是,如果我使用phi,代码会变得更长:

据我所知,phiover的唯一优势selectphi支持2个以上的分支,而select只支持2个分支。除了这种情况,还有什么phi比这更好的情况select吗?