问题标签 [register-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
912 浏览

optimization - 实时变量分析,我的解释正确吗?

由于stackexchange没有更多关于编译器标签的标签,所以我在这里发布这个问题。


如果同时满足以下三个条件,则称变量 x 在程序中的语句 Si 处有效:

在此处输入图像描述

在上述控制流图的基本块 2 中的语句和基本块 3 中的语句中都存在的变量是

  1. p, s, 你
  2. r、s、u
  3. r,你
  4. q, v

我试图解释:


正如维基百科所说:“简单地说:如果变量具有将来可能需要的值,则该变量是活动的。”

根据所讨论的定义,如果将来在任何新分配之前使用变量,则该变量是活动的。块 2 将 'r' 和 'v' 都作为实时变量。因为它们在分配给它们的任何新值之前在块 4 中使用。请注意,变量 'u' 不在块 2 中,因为 'u' 在块 3 中使用之前在块 1 中分配了一个新值。变量 'p'、's' 和 'q' 也不存在于块中2 出于同样的原因。块 3 只有 'r' 作为实时变量,因为每个其他变量在使用前都被分配了一个新值。


另一种解释为:


只有 r。

p、s 和 u 被分配到 1 中,在此之前没有中间使用它们。因此 p、s 和 u 不在 2 和 3 中。q 被分配到 4 中,因此不在 2 和 3 中。

v 在 3 时有效,但在 2 时无效。只有 r 在 2 和 3 时都有效。

但是官方的 GATE 键同时表示 r 和 u。

0 投票
1 回答
556 浏览

java - Java JIT 编译器寄存器优化

我正在查看 Hotspot VM JIT 编译器的一些输出本机代码。我正在分析的方法使用了很多局部变量。我曾预计这会溢出寄存器分配并在内存中进行加载/存储。但是,我在本机代码中看不到任何加载/存储指令。为此,我有2个相关问题。

  1. 我读过Java VM具有基于堆栈的体系结构,其中使用堆栈而不是使用寄存器作为计算的暂存器。因此,JIT 编译器是否也遵循基于堆栈的模型或基于寄存器的模型?

  2. 如果 JIT 是基于寄存器的,JIT 编译器在寄存器用完时会做什么?JIT 编译器是否执行了其他一些技术来处理这种情况,或者只是因为我没有足够的局部变量而我没有看到任何加载/存储到内存和从内存中加载/存储的情况?

0 投票
3 回答
7791 浏览

c - c - 使用寄存器和静态存储类声明变量

(ANSI-C 89)嗨,是否可以同时声明一个变量staticregister?每当我尝试这样做时,我都会得到一个错误消息:multiple storage classes in declaration specifiers

这是代码:

0 投票
0 回答
25 浏览

php - 我想使用位寄存器为我的 PHP 程序创建一个错误寄存器

有没有人试过这样做?这在我使用 PLC 的工作中很常见,但我还没有在 php 中使用它。

这个想法是使用二进制数作为各种错误的寄存器,以便轻松收集它们。这个想法是这样的

有什么想法吗?

理想情况下,我希望将此寄存器用作条件。

0 投票
2 回答
217 浏览

c - 此功能是否被视为可重入?

我有一个具有以下实现的功能:

注意:myArrayOfStructures 是文件上的全局变量。

我认为这个函数是可重入的,只要它的参数的传递是通过堆栈完成的,因为以下分析:

在函数调用时,函数的 2 个参数被压入堆栈。如果函数本身被另一个 OS 任务中断,则第二次将参数压入堆栈。因此,函数的 2 个实例是“独立的”,因为每个实例在堆栈中都有自己的一组参数。

直到,我使用某个编译器选项优化了这个文件的速度。

经过优化,我发现那些参数的传递是通过寄存器来完成的(我知道编译器有权做这样的事情(寄存器分配))。但是这种优化使这个函数不可重入。

所以,我的问题是

  • 上述功能真的是可重入的吗?
  • 如果是(重入),编译器如何进行这样的优化以恢复其重入状态?

请参考您的答案。

非常感谢。

0 投票
1 回答
1171 浏览

operating-system - 段表计算

我有个问题。我“谷歌”了很多次,但找不到解决方案或任何解决方法。

在使用简单分段的系统上,分段表如下(所有值均为十进制):

a) 绘制显示所有段的内存分配图。

b) 计算以下段+偏移逻辑地址对应的物理地址(如果地址产生故障,请注明):0+1200, 1+500, 3+1024.

c) 计算以下物理地址对应的逻辑段+偏移地址(如果地址产生故障,请注明):9000, 50, 1200.

0 投票
1 回答
240 浏览

llvm - llvm 调用者保存的寄存器在函数调用后未重新加载

我正在为 llvm 生成带有自定义 RISCV 后端的代码。当我在没有优化 (-O0) 的情况下编译时,程序可以正常工作。当我使用优化(-O2)进行编译时,调用后不会重新加载任何临时寄存器(调用者保存)。优化后的代码看起来确实有一个很好的寄存器分配,但它会做一些事情,比如用类初始化器的地址加载一个临时寄存器,然后在不重新加载寄存器的情况下多次调用初始化器。

.bc 文件看起来与此伪代码基本相同,正确声明了跨越所有函数调用的生存范围(lifetime.start 和lifetime.end)。

我认为寄存器分配器的策略是首先使用调用者保存的寄存器,所以我不认为这是错误声明我的寄存器的问题。在较旧的寄存器分配器中,我看到 loadRegFromStackSlot() 或 assignVirt2StackSlot() 函数用于溢出在被破坏后需要重新加载的寄存器。但是在贪婪的寄存器分配器中,我看不到发生这种情况的明显地方,所以我不知道如何调试我的后端可能缺少的东西。

也许我需要向代码生成器添加另一个通道或不同的通道。也许我的注册声明有问题,但我不这么认为。任何见解将不胜感激。

0 投票
1 回答
1657 浏览

gcc - 使用 GCC 编译器为代码的特定部分保留寄存器

是否可以为 C 代码的特定部分保留寄存器?

-fixed-reg 选项或声明全局寄存器变量不是我正在寻找的答案。我想保留特定范围的寄存器值(比如说特定功能)。

使用本地寄存器变量是不可能的,因为它不能保证在整个范围内保留寄存器的值。我正在寻找带有 asm volatile 的 clobber list 之类的东西,但是对于 C 语句。

0 投票
1 回答
85 浏览

llvm - LLVM IR 中缺少虚拟寄存器编号

考虑以下两个示例:

LLVM IR 将是:

在第一个函数中,寄存器%2丢失(%0并且%1用于参数);

同样,在第二个函数中,寄存器%1丢失了。

只是好奇,失踪的人是做什么用的?为什么它们不一致?

0 投票
1 回答
258 浏览

x86 - LLVM 物理寄存器映射

我在 LLVM IR 中有一些函数,它有一些输入参数。但是,我想保留一个在寄存器中传递的参数,并且我只想为 x86 编译它。例如,我正在编写一个包含添加指令的函数:

并且无论列表中有哪些参数,我都会保证 val1 在 eax 中,而 val2 在 ebx 物理寄存器中。如何在 val1 和 eax 之间进行映射?