编译原理笔记

编译原理龙书第二版笔记,主要是代码生成和代码优化相关,记录概念,方便查阅

每天看点,督促自己

 

0.基本块:满足以下条件的最大连续三地址指令序列

1)控制流只能从基本块的第一个指令进入该块。即没有跳转到基本块中间的跳转指令序列

2) 除了基本块的最后一个指令,控制流在离开基本块之前不会停机或者跳转。

 

1.基本块形成了流图的结点,流图的边指明了那些基本块可能紧随一个基本块之后运行

 

2.基本块的首指令:

1)中间代码的第一个三地址指令是一个首指令

2)任意一个条件或者无条件跳转的目标指令是一个首指令

3)紧跟在一个条件或无条件跳转指令之后的指令是一个首指令

 

3.三地址语句中对一个名字使用(use)的定义:假设三地址语句i给x赋值;若语句j的一个运算分量为x(含x的表达式),且从语句i可以通过未对x进行赋值的路径到达语句j(j直接使用i中x的值),则j使用了语句i处计算得到的x值。x在语句i处活跃(live)

 

4.用流图表示基本块之间的控制流,基本块是流图的结点。若从基本块b到基本块c有一条边连接,b是c的前驱(predecessor),c是b的后继(successor)

 

5.对循环的处理。程序会花费大量时间执行循环,循环的优化是编译器完成的。结点集合L是循环流图的条件:

1)在L中有一个循环入口结点(loop entry),是唯一的前驱可能在L之外的结点。即从整个流图的入口结点开始到L中任何结点的路径都必然经过循环入口结点,且循环入口结点不是整个流图的入口结点。

2)L中每个结点都有一个到达L的入口结点的非空路径,且该路径全部在L中

 

6.代码生成

1)x=y+z

1>getReg(x=y+z)为x、y、z选择寄存器,记Rx、Ry、Rz

2>根据寄存器描述符判断y是否在Ry中,若不在生成指令“LD Ry,y'”,其中y‘是根据y的地址描述符得到的内存位置;类似地处理z

3>生成指令“ADD Rx,Ry,Rz”

2)x=y

假设getReg(x=y)总是为x、y选择同一寄存器,判断y是否位于Ry,若不在生成指令“LD Ry,y”;若y已经在Ry中,只修改Ry的寄存器描述符,表明Ry也存放x值

3)基本块结束对临时变量的处理

在基本块结束时若一个变量只在基本块内部使用,当基本块结束后可以假设存放该变量的寄存器为空。若变量在基本块结束时活跃或不知道变量是否在出口处活跃,则必须假定其活跃,此时若该变量的地址描述符表明它没有存放在内存位置上,则用寄存器R保存其值生成指令ST x,R。

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/snip3r/p/12506271.html