« 上一篇下一篇 »

流图的表示方式和循环

首先,在流图里面把到达指令的序号或标号的跳转指令替换为到达基本块的跳转,这么做是很正常的。回忆一下,所有条2件或无条件跳转指令总是跳转到某些基本块的首指令,而现在这些跳转指令指向了相应的基本块。

这么做的原因是,在流图构造完成之后经常会对多个基本块中的指令做出实质性的改变。如果跳转的目标是指令,我们将不得不在每次改变了某个目标指令之后修正跳转指令的目标。

流图就是通常的图,它可以用任何适合表示图的数据结构来表示。结点(即基本块)的内容需要有它们自己的表示方式。我们可以用一个指向该基本块在三地址指令数组中的首指令的指针,再加上基本块的指令数量或一个指向结尾指令的指针来表示结点的内容。但是,因为我们可能会频繁改变一个基本块中的指令数量,所以为每个基本块创建一个指令链表是一种高效的表示方法。

循环

像while语句、do-while语句和for语句这样的程序设计语言构造自然地把循环引人到程序中。因为事实上每个程序会花很多时间执行循环,所以对于一个编译器来说为循环生成优良的代码就变得非常重要。很多代码转换依赖于对流图中“循环”的识别。如果下列条件成立,我们就说流图中的一个结点集合i是一个循环。

1)在i中有一个被称为循环入口(loopentry)的结点,它是唯一的其前驱可能在i之外的结点。也就是说,从整个流图的人口结点开始到i中的任何结点的路径都必然经过循环人口结点,并且这个循环入口结点不是整个流图的人口结点本身。

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

« 上一篇下一篇 »