我正在编译器用于堆机(具体地说 CIL )和I” VE解析的代码转换成基本块的曲线图。在这里,我正在寻找应用 SSA 的方法,但它不是太顺利。我的(同时有一台上市的工作,而不是图)第一次尝试遍历代码,并保持SSA ID的堆栈(即,对于分配对象),推动他们时,我产生一个任务,弹出他们时,他们已经习惯。这只是正常单个基本块中,但我根本无法找出如何处理产生Φ功能。

我已经被折腾周围的想法是堆积位置连接到SSA ID,然后看看什么是仍然在栈上,当代码路径收敛,但是这似乎并不像正确的方式(TM)的做的事情。

有一个简单的算法用于跟踪在多个代码路径堆栈操作和确定所述碰撞时它们收敛?

有帮助吗?

解决方案

您需要查看所述多个设置SSA IDS 会聚的节点上(基本块)。保持中间基本块结构,这样,可以很容易地在块中使用(例如,查询)的所有标识符

我不知道你的意思碰撞什么,但我想你想解决类似

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

这就是你想要的披在这个地方。要知道,没有披可执行代码!利用信息y是(依赖)于X1和X2,可以在下一步重写这个。例如,在存储器中为中心的表示中,披(X1,X2)告诉你x1和x2应该是两个别名同一存储器位置,即Y的。披只是捆绑信息一起。

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

希望这有助于一点!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top