图染色法的寄存器分配 - 北京大学教务部欢迎您.doc

图染色法的寄存器分配 - 北京大学教务部欢迎您.doc

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图染色法的寄存器分配 - 北京大学教务部欢迎您

图染色法的寄存器分配 - 北京大学教务部欢迎您 自己收藏的 觉得很有用 故上传到百度 与大家一起分享! 图染色法的寄存器分配 计算机科学与技术系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-染色方案 只好修改代码重新染色 1. 使寄存器使用率最小 寄存器分配的目标是使不得不执行的load 和store指令的数目最小

文档评论(0)

cbf96793 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档