当我阅读与编译器相关的书时,我发现有两种主要的内存模型。
注册到注册模型和内存到内存模型。
在书中,它说寄存器到寄存器模型忽略了机器对寄存器数量的限制,编译器后端必须插入加载和存储。是因为寄存器到寄存器模型可以使用虚拟registers...and吗?这个模型保留了所有可以存储在寄存器中的值,所以在完成之前,它必须插入加载和存储(与内存相关)?
此外,在内存到内存部分,书中说编译器后端可以删除冗余的加载和存储。这是否意味着模型必须删除冗余的内存使用来进行优化?
发布于 2013-05-08 09:47:13
我将在编译器的上下文中回答您的问题,因为这就是您所读到的内容。在计算机体系结构上下文中,这些答案将不适用,因此请谨慎阅读。
是因为寄存器到寄存器模型可以使用虚拟registers...and这个模型保留了可以存储在寄存器中的所有值,所以在完成之前它必须插入加载和存储(与内存相关)?
这可能是一个原因。如果底层机器不支持寄存器/寄存器操作,则需要将“虚拟寄存器”操作转换为加载和存储。类似地,如果您的编译器在IR阶段假设了一个无限寄存器机器,那么在寄存器分配阶段(在这个阶段中,您将无限的虚拟寄存器集映射到有限的真实寄存器集,在用完时使用内存访问),可能需要将一些寄存器溢出到内存。
这是否意味着模型必须删除冗余的内存使用来进行优化?
是的,这是编译器可能会做的优化步骤。如果我们这样做:
register1 <- LOAD 1234
// Operation using register 1 that leaves the result in register 1
STORE register1, 1234
register1 <- LOAD 1234
// Another operation that uses register 1
STORE register1, 1235可以将其优化为只将值保留在寄存器中,如下所示:
register1 <- LOAD 1234
// Operation using register 1 that leaves the result in register 1
// Another operation that uses register 1
STORE register1, 1235这显然更有效,因为它避免了与寄存器相比速度较慢的额外DRAM访问。
https://stackoverflow.com/questions/16431278
复制相似问题