sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-04 23:45:06 32 4
mua khóa gpt4 Nike

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

1 Câu trả lời

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

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

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

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

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

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

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

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

32 4 0
Bài viết được đề xuất: matrix - 有效地将向量解包为二进制矩阵 Octave
Bài viết được đề xuất: freertos - 获取自在 FreeRTOS 中启动后的时间
Bài viết được đề xuất: asp.net - GridView 分页问题
Bài viết được đề xuất: groovy - 在 Groovy 中生成具有间隔的数字列表
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com