网站大量收购独家精品文档,联系QQ:2885784924

机器无关的优化-南京大学计算机系.ppt

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

区域层次结构的例子 叶子区域:R1,R2,R3,R4,R5; 循环体区域:R6 循环区域:R7 整个程序的区域:R8 基于区域的分析技术的概述(1) 对每个区域R及R中的每个子区域R’,我们计算传递函数fR,IN[R’],概括从R的入口到达R’的入口的全部可能路径的运行效果 出口基本块 区域R内的基本块B有到R之外的边,B就是R的出口基本块 计算从R入口基本块到B的出口处的传递函数fR,OUT[B]。 基于区域的分析技术的步骤(1) 从最小的区域开始,为越来越大的区域计算传递函数 叶子区域的传递函数:fB,IN[B]是单元函数,fB,OUT[B]是B的传递函数 逐步处理更大的R R是一个体区域 R是它的子区域组成的无环图; 按照拓扑排序计算各个传递函数 R是循环区域 考虑回边的效果 基于区域的分析技术的步骤(2) 最终得到整个程序的传递函数之后,按照相反顺序计算得到各个基本块入口处的数据流值 设R入口处的数据流值x,子区域R’入口处的数据流值 fR,IN[R’](X) 直到计算完成各个基本块的入口处的值 传递函数的假设 需要三个作用于传递函数的基本运算 组合、交汇运算、闭包运算 组合 用于计算一个结点序列对应的传递函数 gen_kill模式的传递函数对组合封闭 交汇运算∧f (f1∧ff2)(x)=f1(x)∧f2(x) 闭包预算 f* = ∧n=0fn。 对于gen_kill模式的传递函数f f*(x)=gen∪x 基于区域的分析算法 方法: 构造区域序列R1,R2,…,Rn,其中Rn是顶层区域 按照自底向上顺序,处理各个区域 如果R是一个基本块B,fR,IN[B] = I, fR,OUT[B] = fB 如果R是循环体区域,执行子算法9-50a 如果R是循环区域,执行子算法9-50b 计算各个区域开始处的数据流值 IN[Rn] = IN[ENTRY] 自顶向下顺序:IN[R] = fR’,IN[R](IN[R’]) 子算法 计算图9-48a中的到达定值 基于区域的分析的例子 gen_kill形式上的运算符 函数的交 Gen:gen的并集;Kill:kill集合的交集 组合 Gen:gen的并集减去kill2 Kill:Kill集合的并集 闭包 Gen:原来的gen Kill:空集 计算传递函数 R1,R2,…,R5 fRi,IN[Bi]是单元函数,fRi,OUT[Bi]是基本块的传递函数 处理R6 顺序处理R6的子区域R2,R3,R4 … 处理R7 计算相应的函数闭包 … 处理R8 顺序处理子区域R1,R7和R5 自顶向下计算数据流值 * 部分冗余消除 目标:尽量减少表达式求值的次数 对于表达式x+y 公共表达式:如果对x+y求值前的程序点上x+y可用,那么我们不需要再对x+y求值; 循环不变表达式:循环中的表达式x+y的值不变,可以只计算一次; 部分冗余:在程序按照某些路径到达这个点的时候x+y已经被计算过,但是沿着另外一些路径到达时,x+y尚未计算过 处理方法:移动对x+y求值的位置; 需要使用四个数据流方程来达到优化的目的 冗余的例子 允许进行两种操作 在关键边上增加基本块; 进行代码复制 关键边: 从具有多个后继的结点到达具有多个前驱的结点 懒惰代码移动 目标: 所有不复制代码就可消除的冗余计算都被消除 优化后的代码不会执行原程序中不执行的任何计算 表达式的计算应该尽量靠后,以利于寄存器的分配 试图通过在流图中放置表达式x+y的拷贝,使得某处的x+y成为完全冗余,从而删除; 问题的简化: 假设每个基本块只包含一个指令; 基本步骤 按照如下四个步骤进行处理 找出各个程序点上预期执行的所有表达式 即运行到某程序点时,有哪些表达式将来一定会执行 重新放置表达式,使得表达式在某些点上变成可用的; 这些点上的表达式可以删除 在保证不会引入冗余的情况下,设法把表达式后延 消除只使用一次的临时变量; 预处理 在关键边上插入新的基本块; 我们只允许在基本块开头增加代码; 例子 图9-33 (完整版) 预期执行表达式 数据流分析框架 逆向 当表达式B在出口处预期执行,且它没有被B杀死,那么此表达式在B的入口处被预期执行 当B的所有后继基本块的入口处都被预期执行,那么表达式在出口处被预期执行 在整个程序的出口处,没有表达式被预期执行; 求出预期执行点之后,表达式被放置到首次被预期执行的程序点上 此时一些表达式变得完全冗余; 可用表达式(考虑代码复制) 和前面的可用表达式类似,但是假设代码已经被复制到了预期执行点上 表达式在基本块的出口处可用的条件 条件一: 在基本块的入口处可用; 在基本块的入口处的预期执行表达式中 没有被这个基本块杀死 在一个基本块的开头放置的表达式: earliest[B] = anticipa

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档