问题标签 [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.
optimization - 实时变量分析,我的解释正确吗?
由于stackexchange没有更多关于编译器标签的标签,所以我在这里发布这个问题。
如果同时满足以下三个条件,则称变量 x 在程序中的语句 Si 处有效:
在上述控制流图的基本块 2 中的语句和基本块 3 中的语句中都存在的变量是
- p, s, 你
- r、s、u
- r,你
- 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。
java - Java JIT 编译器寄存器优化
我正在查看 Hotspot VM JIT 编译器的一些输出本机代码。我正在分析的方法使用了很多局部变量。我曾预计这会溢出寄存器分配并在内存中进行加载/存储。但是,我在本机代码中看不到任何加载/存储指令。为此,我有2个相关问题。
我读过Java VM具有基于堆栈的体系结构,其中使用堆栈而不是使用寄存器作为计算的暂存器。因此,JIT 编译器是否也遵循基于堆栈的模型或基于寄存器的模型?
如果 JIT 是基于寄存器的,JIT 编译器在寄存器用完时会做什么?JIT 编译器是否执行了其他一些技术来处理这种情况,或者只是因为我没有足够的局部变量而我没有看到任何加载/存储到内存和从内存中加载/存储的情况?
c - c - 使用寄存器和静态存储类声明变量
(ANSI-C 89)嗨,是否可以同时声明一个变量static和register?每当我尝试这样做时,我都会得到一个错误消息:multiple storage classes in declaration specifiers
这是代码:
和
php - 我想使用位寄存器为我的 PHP 程序创建一个错误寄存器
有没有人试过这样做?这在我使用 PLC 的工作中很常见,但我还没有在 php 中使用它。
这个想法是使用二进制数作为各种错误的寄存器,以便轻松收集它们。这个想法是这样的
有什么想法吗?
理想情况下,我希望将此寄存器用作条件。
c - 此功能是否被视为可重入?
我有一个具有以下实现的功能:
注意:myArrayOfStructures 是文件上的全局变量。
我认为这个函数是可重入的,只要它的参数的传递是通过堆栈完成的,因为以下分析:
在函数调用时,函数的 2 个参数被压入堆栈。如果函数本身被另一个 OS 任务中断,则第二次将参数压入堆栈。因此,函数的 2 个实例是“独立的”,因为每个实例在堆栈中都有自己的一组参数。
直到,我使用某个编译器选项优化了这个文件的速度。
经过优化,我发现那些参数的传递是通过寄存器来完成的(我知道编译器有权做这样的事情(寄存器分配))。但是这种优化使这个函数不可重入。
所以,我的问题是
- 上述功能真的是可重入的吗?
- 如果是(重入),编译器如何进行这样的优化以恢复其重入状态?
请参考您的答案。
非常感谢。
operating-system - 段表计算
我有个问题。我“谷歌”了很多次,但找不到解决方案或任何解决方法。
在使用简单分段的系统上,分段表如下(所有值均为十进制):
a) 绘制显示所有段的内存分配图。
b) 计算以下段+偏移逻辑地址对应的物理地址(如果地址产生故障,请注明):
0+1200
,1+500
,3+1024
.c) 计算以下物理地址对应的逻辑段+偏移地址(如果地址产生故障,请注明):
9000
,50
,1200
.
llvm - llvm 调用者保存的寄存器在函数调用后未重新加载
我正在为 llvm 生成带有自定义 RISCV 后端的代码。当我在没有优化 (-O0) 的情况下编译时,程序可以正常工作。当我使用优化(-O2)进行编译时,调用后不会重新加载任何临时寄存器(调用者保存)。优化后的代码看起来确实有一个很好的寄存器分配,但它会做一些事情,比如用类初始化器的地址加载一个临时寄存器,然后在不重新加载寄存器的情况下多次调用初始化器。
.bc 文件看起来与此伪代码基本相同,正确声明了跨越所有函数调用的生存范围(lifetime.start 和lifetime.end)。
我认为寄存器分配器的策略是首先使用调用者保存的寄存器,所以我不认为这是错误声明我的寄存器的问题。在较旧的寄存器分配器中,我看到 loadRegFromStackSlot() 或 assignVirt2StackSlot() 函数用于溢出在被破坏后需要重新加载的寄存器。但是在贪婪的寄存器分配器中,我看不到发生这种情况的明显地方,所以我不知道如何调试我的后端可能缺少的东西。
也许我需要向代码生成器添加另一个通道或不同的通道。也许我的注册声明有问题,但我不这么认为。任何见解将不胜感激。
gcc - 使用 GCC 编译器为代码的特定部分保留寄存器
是否可以为 C 代码的特定部分保留寄存器?
-fixed-reg 选项或声明全局寄存器变量不是我正在寻找的答案。我想保留特定范围的寄存器值(比如说特定功能)。
使用本地寄存器变量是不可能的,因为它不能保证在整个范围内保留寄存器的值。我正在寻找带有 asm volatile 的 clobber list 之类的东西,但是对于 C 语句。
llvm - LLVM IR 中缺少虚拟寄存器编号
考虑以下两个示例:
LLVM IR 将是:
在第一个函数中,寄存器%2
丢失(%0
并且%1
用于参数);
同样,在第二个函数中,寄存器%1
丢失了。
只是好奇,失踪的人是做什么用的?为什么它们不一致?
x86 - LLVM 物理寄存器映射
我在 LLVM IR 中有一些函数,它有一些输入参数。但是,我想保留一个在寄存器中传递的参数,并且我只想为 x86 编译它。例如,我正在编写一个包含添加指令的函数:
并且无论列表中有哪些参数,我都会保证 val1 在 eax 中,而 val2 在 ebx 物理寄存器中。如何在 val1 和 eax 之间进行映射?