Skip to content

第十章 代码优化和目标代码生成

Giovanna

About 382 wordsAbout 1 min

2024-07-04

一、代码优化

  • 局部优化:在基本块内的优化
    • 合并已知量
    • 删除公共子表达式
    • 删除无用赋值
    • 删除死代码
  • 全局优化(循环优化):在基本块间的优化
    • 代码外提
    • 强度削弱
    • 删除归纳变量

二、目标代码的生成

p: x:=y op z
  • y本身占有寄存器Ri,且y在P点后不再被引用,op Ri,z
  • 有空余可用寄存器Ri,将Ri分配给x,MOV y,Ri; OP Ri,z
  • 寄存器均被占用
    • 占用Ri变量在主存已有副本的
    • 占用P点后该变量不再被引用的
    • 占用离P点最远才被引用的

例:

t:=a-b
u:=a+c
v:=a-t
w:=v+u

可用寄存器R0,R1

MOV a,R0
SUB R0,b   ; t占用R0
MOV a,R1
ADD R1,c   ; u占用R1
MOV R1,u   ; 释放R1
MOV a,R1
SUB R1,R0  ; v占用R1
MOV R1,v   ; 释放R1
ADD R1,u   ; w占用R1

三、固定分配寄存器节省的代价

  • 0:块内赋值前被引用的次数,未赋值的话都算
  • 1:块后是活跃变量则为2

基本块后的活动变量列在基本块下方。

image.png

a0a1b0b1c0c1d0d1e0e1f0f1
B12211221
B2112
B3121121
B4211

所以答案为:

a:4,b:6,c:3,d:6,e:4,f:4