外循环的寄存器分配

Register assignment for outer loops

我正在翻阅红龙书,在外部循环的注册分配部分,我遇到了以下我不太清楚的声明。

If an outer loop L1 contains an inner loop L2, the names allocated registers in L2 need not be allocated registers in L1 - L2

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

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

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

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

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

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