首页计算机计算机软件编译原理 11 第十一章 代码生成.pptx

11 第十一章 代码生成.pptx

页数:33页文件大小:178.7 KB来源: 编译原理ppt课件

本课件讲解代码生成,说明代码生成器的输入、输出与目标代码的三种形式,给出基本块内的简单代码生成算法与寄存器分配原则,介绍待用信息、活跃信息的计算与待用信息链,并给出从 DAG 生成目标代码的方法与窥孔优化。

第十一章代码生成封面,本课件讲解代码生成,说明代码生成器的输入、输出与目标代码的三种形式,给出基本块内的简单代码生成算法
第十一章代码生成(续)说明页,号语法单位四元式表格管理出错处理目标代码生成器四元式目标代码
目标代码一般有以下三种形式说明页,能够立即执行的机器语言代码,所有地址已经定位
查看本课件的文字版(共 33 页,供检索与复制)

第1页:第十一章代码生成

第十一章代码生成

  • 编译原理

第2页:第十一章代码生成(续)

第十一章代码生成(续)

  • 号语法单位四元式表格管理出错处理目标代码生成器四元式目标代码

第3页:目标代码一般有以下三种形式

目标代码一般有以下三种形式

  • 能够立即执行的机器语言代码,所有地址已经定位;
  • 待装配的机器语言模块。执行时,由连接装配程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;
  • 汇编语言代码。尚须经过汇编程序汇编,转换成可执行的机器语言代码。

第4页:如何使生成的目标代码较短

如何使生成的目标代码较短

  • 如何使生成的目标代码较短;
  • 如何充分利用计算机的寄存器,减少目标代码中访问存贮单元的次数。
  • 如何充分利用计算机的指令系统的特点。

第5页:11.1基本问题

11.1基本问题

  • 代码生成器的输入
  • 代码生成器的输入包括源程序的中间表示,以及符号表中的信息
  • 类型检查

第6页:11.1基本问题(续)

11.1基本问题(续)

a
=a+1
  • 目标程序
  • 绝对机器代码、可再定位机器语言、汇编语言
  • 采用汇编代码作为目标语言
  • 指令选择
  • INCa
  • LD R0, aADD R0, #1ST R0, a

第7页:11.1基本问题

11.1基本问题

  • 寄存器分配
  • 在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量。
  • 在随后的寄存器指派阶段,挑出变量将要驻留的具体寄存器。
  • 计算顺序选择

第8页:11.2目标机器模型

11.2目标机器模型

  • 考虑一个抽象的计算机模型
  • 具有多个通用寄存器,他们既可以作为累加器,也可以作为变址器。
  • 运算必须在某个寄存器中进行。
  • 含有四种类型的指令形式

第9页:如果op是一目运行符

如果op是一目运行符

  • 则“op Ri, M”的意义为:op(M)
  • Ri,其余类型可类推。

第10页:如果op是一目运行符(续)

如果op是一目运行符(续)

  • 如ADD加SUB减MUL乘DIV除

第11页:

第12页:如果op是一目运行符

如果op是一目运行符

不考虑代码的执行效率,目标代码生成是不难的,例如:A:=(B+C)*D+E翻译为四元式:T1:=B+CT2:=T1*DT3:=T2+EA:=T311.3一个简单代码生成器

第13页:如果op是一目运行符(续)

如果op是一目运行符(续)

假设只有一个寄存器可供使用•目标代码:LDR0,BADDR0,CSTR0,T1•假设T1,T2,T3在基本块之后不再引用:LDR0,BADDR0,CMULR0,DADDR0,ESTR0,A•四元式T1:=B+CT3:=T2+ET2:=T1*DA:=T3LDR0,T1MULR0,DSTR0,T2LDR0,T2ADDR0,ESTR0,T3LDR0,T3STR0,A

第14页:11.3一个简单代码生成器

11.3一个简单代码生成器

尽可能留
在生成计算某变量值的目标代码时,尽可能让该变量保留在寄存器中。
尽可能用
后续的目标代码尽可能引用变量在寄存器中的值,而不访问内存。
及时腾空
在离开基本块时,把存在寄存器中的现行的值放到主存中。

第15页:11.3.1待用信息

11.3.1待用信息

  • 用信息
  • 如果在一个基本块内,四元式i对A定值,四元式j要引用A值,而从i到j之间没有A的其他定值,那么,我们称j是四元式i的变量A的待用信息。(即下一个引用点)i: A:=B op C…j: D:=A op E
  • 假设在变量的符号表登记项中含有记录待用信息和活跃信息的栏。

第16页:11.3.1待用信息(续)

11.3.1待用信息(续)

待用信息和活跃信息的表示:1(x,x)表示变量的待用信息和活跃信息。其中i表示待用信息,y表示活跃,^表示非待用和非活跃;2在符号表中,(x,x)→(x,x)表示后面的符号对代替前面的符号对;3不特别说明,所有说明变量在基本块出口之后均为非活跃变量。

第17页:11.3.1待用信息

11.3.1待用信息

计算待用信息和活跃信息的算法步骤:1.开始时,把基本块中各变量的符号表登记项中的待用信息栏填为“非待用”,并根据该变量在基本块出口之后是不是活跃的,把其中的活跃信息栏填为“活跃”或“非活跃”;

第18页:11.3.1待用信息(续)

11.3.1待用信息(续)

式对每一个四元式i
A:=B opC,依次执行下面的步骤:1)把符号表中变量A的待用信息和活跃信息附加到四元式i上;2)把符号表中A的待用信息和活跃信息分别置为“非待用”和“非活跃”;3)把符号表中变量B和C的待用信息和活跃信息附加到四元式i上;4)把符号表中B和C的待用信息均置为i,活跃信息均置为“活跃”。

第19页:基本块1.T

基本块1.T

基本块1.T
=A-B2.U:=A-C3.V:=T+U4.W:=V+U设W是基本块出口之后的活跃变量。建立待用信息链表与活跃变量信息链表如下:

第20页:

第21页:基本块1.T

基本块1.T

附加在四元式上的待用/活跃信息表:(4)W:=V+U(3)V:=T+U(2)U:=A-C(1)T:=A-B(^,y)(^,^)(^,^)(4,y)(^,^)(4,y)(3,y)(^,^)(^,^)(3,y)(2,y)(^,^)序号四元式左值左操作数右操作数变量名初始状态→信息链(待用/活跃信息栏)→ (3,y)→ (^,^)→ (2,y)→ (1,y)→ (1,y)→ (2,y)→ (4,y)→ (^,^)→ (3,y)T(^,^)A(^,^)B(^,^)C(^,^)U(^,^)V(^,^)W(^,y)→ (^,^)→ (4,y)→ (^,^)

第22页:

第23页:变量地址描述数组AVALUE

变量地址描述数组AVALUE

  • 动态记录各寄存器的使用信息
  • RVALUE[R]={A,B}
  • 动态记录各变量现行值的存放位置
  • AVALUE[A]={R1, R2, A}

第24页:变量地址描述数组AVALUE(续)

变量地址描述数组AVALUE(续)

  • 因为寄存器的分配是局限于基本块范围之内的,一旦处理完基本块中所有四元式,对现行值在寄存器中的每个变量,如果它在基本块之后是活跃的,则要把它存在寄存器中的值存放到它的主存单元中。
  • 要特别强调的是,对形如:A:=B的四元式,如果B的现行值在某寄存器Ri中,则无须生成目标代码,只须在RVALUE(Ri)中增加一个A,(即把Ri同时分配给B和A),并把AVALUE(A)改为Ri。

第25页:变量地址描述数组AVALUE

变量地址描述数组AVALUE

代码生成算法:对每个四元式:i:A:=BopC,依次执行:1.以四元式:i:A:=BopC为参数,调用函数过程GETREG(i:A:=BopC),返回一个寄存器R,用作存放A的寄存器。2.利用AVALUE[B]和AVALUE[C],确定B和C现行值的存放位置B’和C’。如果其现行值在寄存器中,则把寄存器取作B’和C’

第26页:3.如果B’≠R

3.如果B’≠R

则生成目标代码:LD R, B’op R, C’否则生成目标代码op R, C’如果B’或C’为R,则删除AVALUE[B]或AVALUE[C]中的R。4.令AVALUE[A]={R}, RVALUE[R]={A}。

第27页:3.如果B’≠R(续)

3.如果B’≠R(续)

  • 也不是基本块出口之后的活跃变量,且其现行值在某寄存器Rk中,则删除RVALUE[Rk]中的B或C以及AVALUE[B]或AVALUE[C]中的Rk,使得该寄存器不再为B或C占用。

第28页:3.如果B’≠R

3.如果B’≠R

寄存器分配:GETREG(i:A:=BopC)返回一个用来存放A的值的寄存器1如果B的现行值在某个寄存器Ri中,RVALUE[Ri]中只包含B,此外,或者B与A是同一个标识符,或者B的现行值在执行四元式A:=BopC之后不会再引用,则选取Ri为所需要的寄存器R,并转4;2如果有尚未分配的寄存器,则从中选取一个Ri为所需要的寄存器R,并转4;1尽可能用B独占的寄存器2后尽可能用空闲寄存器3抢占用非空闲寄存器

第29页:3.如果B’≠R(续)

3.如果B’≠R(续)

最好使得Ri满足一下条件
占用Ri的变量的值也同时存放在该变量的贮存单元中,或者在基本块中要在最远的将来才会引用到或不会引用到。要不要为Ri中的变量生成存数指令?1尽可能用B所在的寄存器2后尽可能用空闲寄存器3抢占用非空闲寄存器

第30页:3.如果B’≠R

3.如果B’≠R

对RVALUE[Ri]中每一变量M,如果M不是A,或者如果M是A又是C,但不是B并且B也不在RVALUE[Ri]中,则(1)如果AVALUE[M]不包含M,则生成目标代码STRi,M(2)如果M是B,或者M是C但同时B也在RVALUE[Ri]中,则令AVALUE[M]={M,Ri},否则令AVALUE[M]={M}(3)删除RVALUE[Ri]中的M4给出R,返回。

第31页:基本块1.T

基本块1.T

基本块1.T
=A-B2.U:=A-C3.V:=T+U4.W:=V+U设W是基本块出口之后的活跃变量,只有R0和R1是可用寄存器,生成的目标代码和相应的RVALUE和AVALUE:

第32页:中间代码目标代码RVALUE

中间代码目标代码RVALUE

=A-BU
=A-CV:=T+UW:=V+ULD R0,ASUB R0,BR0含有TT在R0中LD R1,ASUB R1,CR0含有TR1含有UT在R0中U在R1中ADD R0,R1R0含有VR1含有UV在R0中U在R1中ADD R0,R1R0含有WW在R0中ST R0,W

第33页:中间代码目标代码RVALUE(续)

中间代码目标代码RVALUE(续)

  • P327-1
顶部目录