【问题标题】:Is my construction of SSA correct? (Renaming)我的 SSA 结构正确吗? (重命名)
【发布时间】:2020-11-09 01:16:18
【问题描述】:

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

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

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

【问题讨论】:

  • 我不明白你得到的图表。为什么标签L1 在基本块的中间?这是否表明goto L1 会跳到块的中间(跳过 phi 节点)?来自初始块的 t1 等的值是什么(没有给它们任何值)?
  • @sepp2k -- 感谢您的关注 :) -- 不,这些没有任何意义......它们只是帮助我。
  • 很抱歉,我不太确定如何接受您的回复。什么没有意义?在我看来,goto L1 是否跳过 phi 节点以及t1t3 的初始值是什么,都非常重要。就像t1_0 <- phi(t1_0, t1_1) 行格式错误,因为t1_0 没有在循环之前的块中定义,但我不能告诉你正确的版本是什么,因为我什至不明白t1 <- phi(t1, t1) 是什么一开始就应该这样做。
  • @sepp2k -- 我的意思是 goto 和标签(goto L1 和标签 L1)。
  • 另外,t1_0 <- phi(t1_0, t1_1) 不正确吗?

标签: graph compiler-construction compiler-optimization control-flow-graph ssa


【解决方案1】:

不,您的图表不正确。 xy 的 phi 函数和重命名是正确的,问题是临时变量 t1t3。当输入块L1 时,这些变量已经失效,并且根本不需要任何 phi 函数。如果您坚持对这些变量使用 phi 函数,则必须假设变量存在并且在输入图形时具有不确定的值。让t1_0t2_0t3_0 成为这些值并相应地更新重命名的图形。

【讨论】:

  • 好的,谢谢...还有一件事:我构造了修剪后的 ssa,而 y 的 phi 函数消失了(可能是因为它没有在块 L1 中使用)。我猜对了吗?
  • @xilpex 您需要在L1 中为y 提供一个phi 函数,因为此变量具有不同的定义,具体取决于您通过哪个输入边输入。
  • 啊,是的——但是如果y 没有在块L2 中使用,就不需要phi 函数对吗?
  • 无论如何都需要它,因为yL1 的入口处没有死(它在计算t2 时使用)并且根据您到达L1 的方式有不同的定义。 Phi 函数用于合并 incoming 流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2022-11-25
  • 1970-01-01
  • 2018-06-16
  • 2013-11-10
相关资源
最近更新 更多