图染色法的寄存器分配及应用探究.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图染色法的寄存器分配 计算机科学与技术系98级 吴汉唐 摘要 本文讲述了寄存器分配的图染色法理论。 Chaitin 和他的同伴,在IBM 的Yorktown Heights研究中心,实现了第一个基于图染色法的全局的寄存器分配器。后来,Rice 大学的Preston Briggs对Chaitin的算法进行了改进和扩展。 Chaitin的算法悲观地假设任何高度数的结点都不能被染色,只能被抛出(spilled)。Briggs的算法乐观地认为高度数的结点有可能被染色,从而获得更低的抛出开销(spill costs),和更快的代码。 一 介绍 (一) 编译器和优化 一个优化编译器分为三个层次: 前端把源语言转换为中间代码。这个转换依赖于源语言的结构,需要几遍扫描(pass)代码才能完成。编译时的错误检查就在这一层。我们可以理想地认为前端是只与语言有关的、与机器无关的。 优化器包含几遍的扫描(pass), 每一遍扫描对中间代码执行特定的转换。我们感兴趣的是全局优化,就是从整个函数搜集有用信息,再去做优化。一般的全局优化包括强度削减(strength reduction),循环不变量移动(loop-invariant code motion)和公共子表达式消除(common subexpression elimination)。优化器最好是与语言和机器都无关的。 后端把中间代码转换为针对特定机器的目标代码。这个转换过程又称为代码生成,也需要几遍扫描才能完成。这几遍扫描包括指令选择(instruction selection),指令调度(instruction scheduling),寄存器分配(register allocation)。后端在很大程度上是与语言无关的,与机器有关的。 这个划分简化了每一个层次的开发和维护,使得在不同的编译器中复用每个层次成为可能。例如,一个完全与机器无关的FORTRAN语言前端可以用到为不同机器设计的编译器中。 当然,这还是一个理想的观点。在实际中,每个层次都表现出既与语言相关又与机器相关。这些相关限制复用和维护,也成为编译器设计人员努力要克服的难关。 (二)优化和寄存器分配 寄存器是位于CPU内部的少量的高速存储器。寄存器与内存有很大的不同: 寄存器很少。一个寄存器可以用几个比特直接定位。内存空间很大。内存的定位一般是通过间接的“寻址方式”,其中可能包含一个或多个对寄存器的引用。 寄存器很快。在一个周期内,可以同时读两个寄存器,写第三个寄存器。内存要慢些,一次访问就需要几个周期。 因为寄存器的个数受限和高速度,它们成为大多数计算机体系结构中的关键资源之一。寄存器分配器作为后端的一个模块,控制寄存器的分配和使用。 寄存器很重要。最简单的情况,每条机器指令的操作数要放在寄存器里。在计算复杂表达式的过程中产生的中间结果也要在寄存器里。更复杂的编译器会把经常使用的变量放在寄存器里,来避免反复地存取。如果是一个带优化的编译器,它会把公共子表达式消除或者循环不变量移动以后的重用值,放在寄存器里。 分配寄存器的任务有几个层次 寄存器只在一个表达式的范围内分配。这是一项为了减少寄存器需求量的指令调度的技术。 更先进的分配器可以在一个基本块的范围内管理寄存器。 全局分配器在一个函数的范围内工作。Chaitin 的分配器就在这样的例子。 程序间的寄存器分配是对一些函数工作,通常是一个完整的程序。 为了支持全局的优化,全局的寄存器分配是必须的。 (三)寄存器分配和图染色法 实现好的寄存器分配总是很困难。即使是最简单的实现也会因为机器的特殊细节变得复杂。可靠的分配器必要能很好地对付复杂的程序和稀少的寄存器的情况。 图染色法提供了一种简化的抽象。它建立一张表示分配过程中的各种限制的冲突图(interference graph),并对它染色,把许多表面上各异的细节纳入统一的模式。图中的结点代表生命期(live range),边代表生命期之间的冲突关系。一般说来,如果两个生命期在函数的某一点是同时活跃(live)的,它们就相互冲突,不能占有同一个寄存器。假设k 就是机器中可供分配的寄存器数目,如果图中的所有结点可以用k 种或者更少的颜色染色,有边相连的一对顶点接受不同的颜色,那么这种图染色方案对应一种寄存器分配方案。如果找不到一种k-染色方案,只好修改代码重新染色。 使寄存器使用率最小 寄存器分配的目标是使不得不执行的load 和store指令的数目最小。把寄存器分配问题化归到图染色问题巧妙地转移了目标:以前是最小化存取内存的开销,变成最小化寄存器使用率。 使被抛出代码最少 即使有最好的染色算法和大量的寄存器,有时候也不得不把某些值抛到内存里。这样就产生了几个难题。首先我们希望插入load 和store 指令的动态开销最小

文档评论(0)

aa15090828118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档