据说当将中间代码转换为静态单一赋值形式时,
有必要计算基本块的支配者
作为一个固定的方程点,这种方法显而易见的方法很慢
要做得快,你需要使用相当复杂的Lengauer-Tarjan算法
我可以看到前两点,但我不清楚第三点背后的原因。特别是,为什么你不能仅仅在计算预订支配者树的过程中做到这一点?我在JavaScript中实现了它的一个版本,它似乎有效:
var domPreorder = [];
function doms(b) {
b.children = [];
for (var c of b[b.length - 1].targets)
if (c.i == null) {
c.i = domPreorder.length
domPreorder.push(c)
b.children.push(c)
c.parent = b
doms(c)
}
}
f[0].i = 0
domPreorder.push(f[0])
doms(f[0])
我看不到这种方法有哪些缺点?
答案 0 :(得分:3)
虽然快速和正确地计算支配者确实不是微不足道的,但是在实践中(即在大多数程序中出现的控制流图的种类),有比Lengauer-Tarjan更简单的算法(即在大多数程序中出现的控制流图的种类)。最坏情况的复杂性听起来很吓人。见:Cooper,Keith D。;哈维,蒂莫西J;和Kennedy,Ken(2001)。 "A Simple, Fast Dominance Algorithm"
答案 1 :(得分:1)
啊,我现在看到,简单的技术无法正确处理具有任意多个分支和重新加入的控制流图。您需要能够找到旁路路径,如果您希望快速执行此代码,则需要计算并记住半分数,然后看起来您最终会使用Lengauer-Tarjan或类似的线路。