第十二章代码生成.ppt

  1. 1、本文档共109页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 1 这样web w1被分成4个web: w5、 w6、 w7、 w8: web Components w2 def x in B5, use x in B6 w3 def y in B2, use y in B4 w4 def y in B1, use y in B3 w5 def x in B2, tmp   x in B2 w6 def x in B3, tmp   x in B3 w7 x  tmp in B4, use x in B4 w8 x  tmp in B5, use x in B5 所得的干扰图如图12.9所示: 干扰图的相邻列表中每项有一个成分spcost。spcost用于计  算spilling相应符号寄存器所需要的开销 spill一个web的开销可表示为: 其中,def、use、copy是 web的单个定义、使用和拷贝:  defwt 、usewt和 copywt相对权值 在计算spill开销的过程中,应该考虑下述因素: (1)若重新计算一个web的值比重新装载更有效,可对其 进行重新计算,因此,选择重新计算的开销 (2)若spill了某条拷贝指令的源操作数或目的操作数,则 可以不再考虑该指令 (3)若在同一基本块中,某个被spill的值需要多次使用, 且直到最后一次使用,重新装载的值一直是活跃的,则在该 基本块中,只需做一次取操作 5.干扰图的修剪: (1)degree<R规则: 结点的度degree表示与之相邻结点的个数 基本思想:对给定包含一个度小于R的结点的干扰图是R  可着色的,当且仅当不包含该结点的干扰图是可着色的 当然,这种规则并不是对所有的干扰图都适用。如图12.10  可以分别为2-可着色的和3-可着色的,但却不能利用这  种规则进行修剪: (2)消极试探法: 消极试探法是通过排除图中degree≥R的结点以对第一种  方法进行推广 基本原理:因为某个结点具有R或更多的相邻结点,这些  相邻结点并不需要所有的均具有不同的颜色,进一步地说,  它们并一定能用完R种颜色 通过从图中反复查找度小于R的结点,开始对图进行着色 选择一个degree≥R的结点消极地放入栈中,选择原则:  根据其spill cost值除以其目前的度,所得的值最小的结点  优先级最高 三.示例 如图12.11所示,代码片断中使用了符号寄存器: 假设可供分配使用的寄存器为r2 、r3、 r4,分别为其建  立干扰图和相邻矩阵,如图12.12所示: 由于符号寄存器s1在退出块B1时,s0从其定义点之后都不  再是活跃的,因此它们的spill开销值都为无穷大,如图  12.13所示: 符号寄存器s1无相邻结点,首先将其先放入栈中。实际寄  存器r2 、r3、 r4以及符号寄存器s4、s9的度都为2,依次将  它们放入栈中,s9 s4 r4 r3 r2 s1 。干扰图的修剪过程如  图12.14所示: 修剪后的干扰图如图12.14(a)所示,可以看出,结点s8的度  小于3,也将其压入栈中:s8 s9 s4 r4 r3 r2 s1  这时,所得的干扰图如图12.14(b)所示: 在余下的干扰图中,每个结点的度都大于或等于3,只好  使用消极试探法,即把s7放入栈中,这样简化了干扰图使  其变成如图12.14(c)所示: 进而将s5压入栈中。这时所有的结点的度都小于3,将它  们依次都放入栈中:s2 s3 s6 s5 s7 s8 s9 s4 r4 r3 r2 s1 依次将各个结点从栈中弹出的同时给它们赋予不同颜色值,  并根据AdjLsts[].rmvadj 域的值重构干扰图 当弹出3个结点时,干扰图如图12.15所示: 当弹出第四个结点,即s5就没有可供使用的颜色。这时就  需要进行寄存器的spilling。分别将块B4中的s7和s5 spilling  到内存中,其基址寄存器为r10,偏移量disp分别为0和4。  所得的代码的片断如图12.16所示: (3)从已分配的寄存器中选取一个Ri作为所需寄存器R,其 选择原则为:占用该寄存器的变量值同时在主存中,或在基 本块中引用的位置最远,这样对寄存器Ri所含的变量和变量 在主存中的情况必须先做如下调整:即对RVALUE[Ri]中的 每一变量M,如果M不是A且AVALUE[M]不包含M,则需完 成以下处理: ①生成目标代码ST Ri,M;即把不是A的变量值由Ri中送  入内存中 ②如果M不是B,则令AVALUE[M]={M},否则,令  AVALUE[M]={M,Ri} ③删除RVALUE[Ri]中的M (4)给出R,返回 这样,一旦得到一个为四

文档评论(0)

177****7942 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档