每天看点,督促自己
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)基本块结束对临时变量的处理