gpt4 book ai didi

compiler-construction - 编译器中的寄存器分配

转载 作者:行者123 更新时间:2023-12-04 23:45:06 32 4
gpt4 key购买 nike

出现在代码生成的寄存器分配阶段的寄存器溢出或溢出代码是什么意思,编译器后端必须将变量分配到内存或寄存器?

最佳答案

Hardware registers是昂贵的(在芯片面积和寻址它们所需的指令位数方面),因此通常数量很少。 Spillinglive variables的数量发生时发生(或者,更准确地说,生命范围的数量)在给定的程序点超过了可用寄存器的数量。

考虑在具有两个硬件寄存器的虚拟机中执行的以下示例程序。假设编译器除了寄存器分配之外不执行任何优化。

a := 1   ; liveout: {a}
b := 2 ; liveout: {a,b}
c := 3 ; liveout: {a,b,c}
d := a + b + c

ab用于 d 的定义中,它们的生命范围跨越了 c 的定义.但是由于机器只有两个寄存器,所以 a是不可能的, bcd 时全部保存在寄存器中被定义为。必须至少洒出其中之一。

在最简单的溢出形式中,溢出变量的所有定义都被存储到 stack 中。插槽,所有用途都替换为负载。一些编译器还可以选择执行寄存器到寄存器的溢出,这意味着该值被存储到不同类的寄存器中并从其加载。例如,在 x86-64 上,编译器可能会从像 rax 这样的通用寄存器中溢出一个值。进入 SIMD 寄存器,如 xmm0 .这有减少内存流量的好处。

作为溢出的替代方案,编译器可能会执行有效范围拆分。这涉及将实时范围分成更小的部分 - 仅在分割点插入加载和存储 - 以便对原本无法着色的干扰图进行着色。

正如您可能想象的那样,选择溢出哪个变量对结果代码的性能有重大影响。任意溢出在紧密循环中使用或定义的变量可能会产生灾难性的后果。因此,一个好的编译器可能会在做出选择之前应用某种形式的启发式方法来估计溢出每个变量的成本。

关于compiler-construction - 编译器中的寄存器分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30512879/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com