9

我正在为堆栈机器(特别是CIL)开发编译器,并且我已将代码解析为基本块图。从这里开始,我希望将SSA应用于这些方法,但进展并不顺利。我的第一次尝试(在使用平面列表而不是图表时)是迭代代码并保留一堆 SSA id(即,用于分配目标),当我产生分配时推送它们,当我弹出它们时他们被使用了。这适用于单个基本块,但我根本无法弄清楚如何处理生成 Φ 函数。

我一直在折腾的想法是将堆栈位置附加到 SSA id,然后查看代码路径收敛时堆栈上仍然存在的内容,但这似乎不是做事的正确方式 (TM)。

是否有一种简单的算法来跟踪跨多个代码路径的堆栈操作并确定它们收敛时的冲突?

4

1 回答 1

9

您需要查看汇聚在一个节点(基本块)上的多组 SSA id 。保留中间基本块结构,这样您就可以轻松地使用(例如查询)块中的所有标识符。

我不确定你对碰撞的意思,但我假设你想解决类似的问题

 if (bExp)                  if (bExp)
   x := 1                    x1 := 1
 else            SSA:       else
   x := 2                    x2 := 2
 y := x;                    y := Phi(x1,x2)

也就是说,你想要这个地方的 Phi。意识到可执行代码中没有 Phi!使用 y 依赖于 x1 或 x2 的信息,您可以在下一步中重写它。例如,在以内存为中心的表示中,Phi(x1,x2) 告诉您 x1 和 x2 应该是同一内存位置的两个别名,即 y 的别名。Phi 只是将信息联系在一起。

if (bExp)
  stackframe[y_index] = 1     (y_index being some offset)
else
  stackframe[y_index] = 2
nop

希望这个对你有帮助!

于 2009-02-27T13:04:16.947 回答