【问题标题】:Register assignment for outer loops外循环的寄存器分配
【发布时间】:2021-07-07 15:24:34
【问题描述】:

我正在浏览红龙书,在为外部循环注册分配部分中,我遇到了以下语句,我不太清楚。

如果外循环 L1 包含内循环 L2,则在 L2 中分配的寄存器名称不需要在 L1 - L2 中分配寄存器

他们想说什么?他们是在谈论在L1L2 中使用的变量吗?这些名称在L2 中分配了寄存器。我不太明白文中的意思。

谁能给我解释一个可能的例子?

【问题讨论】:

    标签: compiler-construction code-generation register-allocation


    【解决方案1】:

    一个常见的优化是在循环期间将循环中使用的变量保存在寄存器中。这可以在紧密循环中产生巨大的差异,因为它避免了内存的使用。

    与这种形式的任何优化一样,寄存器需要在循环开始之前使用变量的值进行初始化,这可能意味着从内存中读取它。如果变量在循环期间被修改并且之后仍在使用,则可能需要将其保存回其内存位置。不过,这最多是一次内存读取和一次写入,而不是在每次迭代中读取和写入变量的值。

    决定以这种方式优化哪些变量很重要。这里出现了变量用于内部循环而不是封闭外部循环的可能性。在这种情况下,外循环中的寄存器可能会有更多有益的用途。

    因此,为内部循环中的优化变量保留的寄存器不必也保留在包含循环中。在启动内部循环之前保存寄存器的值并在内部循环退出时恢复它甚至可能是值得的。这一切都取决于优化器对循环重复次数的最佳猜测、变量的优化使用点的数量,当然还有可用的寄存器数量。

    【讨论】:

    • So it is not a given that a register reserved for an optimised variable in an inner loop will be also reserved in a containing loop. 没有得到它@rici
    • @AbhishekGhosh:是英语的问题吗? “Not a given”表示不一定如此。
    • 是的,我听不懂英语。对不起... :(
    • 现在我明白了。在阅读了您的解释并在您向我解释了英语之后,作者想说什么或我的问题中引用的文字是什么意思。非常感谢。我发现我在这本书的很多地方都陷入了困境,仅仅是因为我无法理解文本中句子的含义或将其与上下文相关联。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多