堆栈机器代码的SSA

问题描述:

我正在研究堆栈机器的编译器(特别是CIL),并将代码解析为基本块的图形。从这里我正在寻找SSA的方法,但它不太好。我的第一次尝试(同时使用平面列表而不是图)是迭代代码并保留一堆SSA id(即分配目标),当我产生一个任务时推送它们,当它弹出时弹出他们被使用。这对于单个基本块来说工作得很好,但我根本无法弄清楚如何处理生成Φ函数。堆栈机器代码的SSA

我一直在徘徊的想法是将堆栈位置附加到SSA ID,然后在代码路径收敛时查看堆栈上仍然存在的内容,但这看起来不像Right Way(TM)做事。

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

+0

编译器曾经有过什么?我正在考虑做同样的事情。 – 2014-03-13 21:02:44

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

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

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

也就是你想要的披在这个地方。意识到在可执行代码中没有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 

希望这会有所帮助!

+1

非常感谢。我有这个99%,但由于某种原因,堆栈位置似乎不够。在你的答案和MS Research的Marmot编译器文件之间,我现在拥有了一切:) – 2009-02-27 23:58:04