下面是一段抽象汇编指令
load a to r1
load b to r2
mult r1 r2 to r3
首先声明的是 这里为什么叫抽象汇编指令因为我们假设是有无限多的寄存器的 我们可以一直r1 r2 r3 r4 ……我们称这些寄存器为virtual register(虚拟寄存器) 而后端中的register allocation做的工作就是把这些虚拟寄存器映射到真实的寄存器上
其次这里发现r1和r2都存储着真实的变量(variable)a和b 而r3却是一个中转的临时变量(temporaries) 实际中的汇编是没有变量这个概念的 实际中只有寄存器和内存地址
在优化过程中 例如common subexpression elimination(CSE)就是会增加变量的数量来减少重复计算,一旦变量太多 就会增加寄存器的负担,导致一部分变量不能存在速度最快的寄存器中而是存在了内存中 就有可能会适得其反降低了代码运行速度

如何通过一个AST转换成抽象汇编指令呢 这里有一个特性是deepth first 只有先计算了最底层的a*b和c*d才能执行上一层的加法运算 只有执行完加法运算才能执行赋值运算
ILOC(intermidate language for optimizing compiler)编译器优化的中间语言
load a
r1
loadAI
本文介绍了编译器优化中的寄存器分配概念,从抽象汇编指令出发,解释了虚拟寄存器与真实寄存器的映射过程。讨论了变量数量增多对寄存器压力的影响,以及如何通过AST转换为抽象汇编指令。同时,阐述了编译器如何在有限的物理寄存器资源下进行优化,避免寄存器溢出,确保代码运行效率。
最低0.47元/天 解锁文章

394

被折叠的 条评论
为什么被折叠?



