优化文档
代码优化
由于本学期选修了较多课程,后期优化时间有限。
中间代码优化已经被融合在了代码生成部分。 主要进行了后端优化。
临时寄存器分配
我使用了 $t0-$t8
作为临时寄存器池,使用先进先出的规则,为中间代码的临时变量分配临时寄存器。
如果临时寄存器不足,则将该临时变量存储到内存当中。
为保证正确性,临时寄存器池应当至少包含 4 个寄存器。
全局寄存器分配
中间代码生成 Alloca 指令,为变量分配栈内存。
在后端 MIPS 代码生成中,我依照先进先出的规则(时间限制,没有使用图着色算法),为变量分配8个寄存器 $s0-$s8
,其余变量放在内存中。
在超出变量的作用域后,会释放该变量对应的寄存器。
在竞速测评中,我尝试扩大8个寄存器为10个,但是结果一致,我推测全局寄存器没有被完全分配,测试点内的变量冲突较少。 因此使用其它寄存器分配算法结果也是一样的?
常量计算
在数组下标计算部分,我会尝试在编译期计算出偏移量,避免在生成的目标代码中包含偏移量计算指令。
后端指令合并
MIPS 部分指令支持立即数直接参与计算,无需提前加载到寄存器中。
li $t1 1
addu $t2 $t0 $t1
------------------
addiu $t2 $t0 1
move 指令也可以与相邻的指令合并。
原地跳转指令消除
跳转指令如果跳转到的是下一个基本块,就可以消除该条无效跳转指令。