您的位置:首页 > 其它

一个国产编译器的寄存器分配试验

2011-01-24 20:36 239 查看
到目前为止,析码编译器的寄存器分配模块基本上已经完成了。核心基于“York-Town”模型,其将复杂的生命域特征建模为直观的无向图染色问题,“York-Town”的核心是通过一系列过程分析中间代码,从中将其生命域之间的关系抽象为一个无向图图,然后对该图染色,从而确定寄存器的分配策略。以下是简单的实验,先来看一个列子,下图由析码编译器在解析中间代码过程中实时生成。

我们来看一下“YorkTown”分配器的工作情况,图中节点表示生命域,节点之间的边表示两个生命域相交。节点中间有两个数字,从上到下依次是:邻接点个数、生命域编号。当染色总数为3时干涉图的染色情况如下:



橘黄色表示说染色失败了,“YorkTown”中有一种情况,如果一个节点有N条边,染色总数有N-1个,则无法染色。分配器这时估计不能有一种策略可以满足所有干涉关系。这时的做法是选择一个生命域将其“分裂”到其它存储器之中,然后重建干涉图,直到完成染色为止。把所有度大于等于颜色总数的节点分裂之后,干涉图可以顺利染色,如下图:



上图是经过分裂之后的干涉图,每个节点都被染色,并且与其邻接点颜色唯一,这个图用于寄存器分配已经没有障碍了。由于生命域分裂的缘故,上图中有边节点数量比之前没有分裂之间少了很多。可以发现,分配器可以保证在寄存器资源很极端的情况下尽可能多的增加寄存器的分配次数,这一点同时还得利于“SSA”,它增加了生命域的密度,换句话说,通过减少生命域的重叠,增加了寄存器利用率。



“如果一个节点有N条边,颜色总数有N-1个”这个说法在多数情况下是正确的,只是有一种特例,当节点有N(N>2)个邻接点,颜色总数有2个,如果N的邻接点之间没有边存在,这时该图仍然可以被染色。很明显“2 <= N-1”,与定义矛盾。让“York-Town”去识别这个特例并没有多大意义,因为它产生的条件非常极端。不过从优化角度来说,“York-Town”毕竟是30年前的研究成果,其自身还有很大的优化潜力。编译理论,经过几十年的发展,针对优化寄存器的分配策略出现了很多理论,不过万变不离七宗,多数都是在“York-Town”基础上的扩展。

析码编译器:http://semo.googlecode.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: