快速计算支配者

时间:2015-05-19 07:30:40

标签: compiler-construction ssa

据说当将中间代码转换为静态单一赋值形式时,

  1. 有必要计算基本块的支配者

  2. 作为一个固定的方程点,这种方法显而易见的方法很慢

  3. 要做得快,你需要使用相当复杂的Lengauer-Tarjan算法

  4. 我可以看到前两点,但我不清楚第三点背后的原因。特别是,为什么你不能仅仅在计算预订支配者树的过程中做到这一点?我在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])
    

    我看不到这种方法有哪些缺点?

2 个答案:

答案 0 :(得分:3)

虽然快速和正确地计算支配者确实不是微不足道的,但是在实践中(即在大多数程序中出现的控制流图的种类),有比Lengauer-Tarjan更简单的算法(即在大多数程序中出现的控制流图的种类)。最坏情况的复杂性听起来很吓人。见:Cooper,Keith D。;哈维,蒂莫西J;和Kennedy,Ken(2001)。 "A Simple, Fast Dominance Algorithm"

答案 1 :(得分:1)

啊,我现在看到,简单的技术无法正确处理具有任意多个分支和重新加入的控制流图。您需要能够找到旁路路径,如果您希望快速执行此代码,则需要计算并记住半分数,然后看起来您最终会使用Lengauer-Tarjan或类似的线路。