在CPU寄存器中分配寄存器变量的标准?

问题描述:

声明一个变量寄存器是对编译器的建议,如果可能的话,应该把特定的自动变量分配给CPU寄存器。在CPU寄存器中分配寄存器变量的标准?

但是编译器如何决定何时把寄存器变量CPU寄存器?它使用哪种算法/机制来决定?

感谢,

纳文

+0

该编译器... – 2010-10-04 06:05:34

如果诺曼拉姆齐没有注意到这一点,并回答,也许是一个指向他papers之一将是秩序。

图着色主要用于静态编译器(又名提前时间编译器)。对于动态(准时)编译器,你通常使用的东西,让结果更快(例如,一个linear scan算法),即使它通常不会做的好寄存器分配的工作。

正如杰里说,编译器使用寄存器分配。寄存器分配是其中一个简单定义的但困难的问题。

在过去的日子里,编译器非常感谢您帮助您解决将哪些变量放入寄存器以及何时放入寄存器的问题。但是今天,这个任务得到了更好的理解,编译器也忙于程序分析,以便真正倾听你所说的话。

除非优化完全关闭,你的编译器很可能会忽略register符。

+0

你见过一个(合理)最近的编译器,它注重'register'与优化?完全关闭?不要误解我的意思。我并不是想说明这一点,这只是我最近没有看过的东西。 – 2010-10-04 07:21:40

+0

@Jerry:GCC出于某种原因支持这一点。 – Potatoswatter 2010-10-04 15:24:57

+0

感谢您的信息 - 我没有注意到这一点。 – 2010-10-04 15:37:29

从提到的那些

除此之外,GCC(4.5.x +)使用SSA-Tree based register allocator(在Passes section更详细),虽然这里是SSA register allocation

+0

SSA(树或DAG)是包括大多数编译器IR在内的语言类。所以大多数图形着色分配器也将是SSA。 (几年前我试图配置/调整LLVM寄存器分配器用于学校项目......当时它绝对是“学术”代码:vP。) – Potatoswatter 2010-10-04 17:55:50

一个很好的示例,您可以指定变量的register关键字。但是直到编译器决定是否将它放入寄存器中。通常在静态编译图中使用着色来产生有效的分配。而在动态(JIT)编译中,称为线性扫描分配的方法是优选的,因为图着色花费更多时间。
向非循环图(DAG)的可用于产生最佳的指令序列(或最小的寄存器分配序列)。
更彻底的阅读看到:1. Towards a More Principled Compiler:Register Allocation and Instruction Selection Revisited by David Ryan Koes
2.由Alfred V阿霍编译器设计原理