Compiler construction 控制项的快速计算

Compiler construction 控制项的快速计算,compiler-construction,ssa,Compiler Construction,Ssa,据说在将中间代码转换为静态单赋值形式时 有必要计算基本块的支配因子 作为方程的一个固定点,有点明显的方法是缓慢的 要快速完成,需要使用相当复杂的Lengauer-Tarjan算法 我可以看到前两点,但我不清楚第三点背后的原因。特别是,有什么原因不能在计算前序支配树的过程中这样做?我已经用JavaScript实现了一个版本,它似乎可以工作: var domPreorder = []; function doms(b) { b.children = []; for (var c o

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

  • 有必要计算基本块的支配因子

  • 作为方程的一个固定点,有点明显的方法是缓慢的

  • 要快速完成,需要使用相当复杂的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])
    

    这种方法有一些我没有看到的缺点吗?

    啊,我现在看到了,简单的技术不能正确地处理具有任意多个分叉和重新联接的控制流图。你需要能够找到绕过路径,如果你想让代码更快,你需要计算并记住半支配者,然后看起来你最终会得到Lengauer Tarjan或类似的东西。

    啊,我现在明白了,简单的技术无法正确处理具有任意多个分叉和重联的控制流图。你需要能够找到绕过路径,如果你想让代码更快,你需要计算并记住半支配者,然后看起来你最终会得到Lengauer Tarjan或类似的东西。

    而快速正确地计算支配者确实不是一件小事,有比Lengauer Tarjan简单得多的算法,它们在实践中同样快或更快(即在大多数程序中出现的控制流图上),即使最坏情况的复杂性听起来很可怕。见:库珀,基思D。;哈维,蒂莫西J;和Kennedy,Ken(2001年)

    虽然快速准确地计算支配者确实不是一件小事,但有比Lengauer Tarjan简单得多的算法在实践中同样快或更快(即在大多数程序中出现的各种控制流图上),即使最坏情况的复杂性听起来很可怕。见:库珀,基思D。;哈维,蒂莫西J;和Kennedy,Ken(2001年)

    另一方面,您不一定需要计算支配者。一篇相对较新的文章提出了一个问题。另一方面,您不一定需要计算支配者。一篇相对较新的文章提出了一个问题。