我正在为堆栈机器(特别是CIL)开发编译器,并且我已将代码解析为基本块图。从这里开始,我希望将SSA应用于这些方法,但进展并不顺利。我的第一次尝试(在使用平面列表而不是图表时)是迭代代码并保留一堆 SSA id(即,用于分配目标),当我产生分配时推送它们,当我弹出它们时他们被使用了。这适用于单个基本块,但我根本无法弄清楚如何处理生成 Φ 函数。
我一直在折腾的想法是将堆栈位置附加到 SSA id,然后查看代码路径收敛时堆栈上仍然存在的内容,但这似乎不是做事的正确方式 (TM)。
是否有一种简单的算法来跟踪跨多个代码路径的堆栈操作并确定它们收敛时的冲突?