- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Chapter-13_updated 北航本科编译原理 张莉
第十三章 代码优化 下面的优化合理吗? int foo(int a) { int count = 0 ; for(int i = 1 ; i=100 ; i++){ count += i ; } return a + count ; } 优化方法的分类1: 与机器无关的优化技术 数据流分析 常量传播 公共子表达式删除 死代码删除 循环交换 代码内联等等 与机器相关的优化技术 面向超标量超流水线架构、VLIW或者EPIC架构的指令调度方法 面向SMP架构的同步负载优化方法 面向SIMD、MIMD或者SPMD架构的数据级并行优化方法等 优化方法的分类2: 局部优化技术 基本块内 例如,局部公共子表达式删除 全局优化技术 函数/过程内 跨越基本块 例如,全局数据流分析 跨函数优化技术 整个程序 例如,跨函数别名分析 ,逃逸分析 等 13.1.1 基本块的DAG图表示 赋值语句:a=b*(-c) + b*(-c) 13.1.2 消除局部公共子表达式 t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5 建立DAG图,例1 t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5 建立DAG图,例2 t1 := - c t2 := b * t1 c := t1 t3 := - c t4 := b * t3 t5 := c + t4 a := t5 13.1.3 数组、指针及函数调用 当中间代码序列中出现了数组成员、指针或函数调用时,算法13.1需要作出一定的调整,否则将得出不正确的优化结果 13.1.4从DAG图重新导出中间代码 算法13.2 从DAG导出中间代码的启发式算法 输入:DAG图 输出:中间代码序列 方法: 初始化一个放置DAG图中间节点的队列。 如果DAG图中还有中间节点未进入队列,则执行步骤3,否则执行步骤5 选取一个尚未进入队列,但其所有父节点均已进入队列的中间节点n,将其加入队列;或选取没有父节点的中间节点,将其加入队列 如果n的最左子节点符合步骤3的条件,将其加入队列;并沿着当前节点的最左边,循环访问其最左子节点,最左子节点的最左子节点等,将符合步骤3条件的中间节点依次加入队列;如果出现不符合步骤3条件的最左子节点,执行步骤2 将中间节点队列逆序输出,便得到中间节点的计算顺序,将其整理成中间代码序列 算法13.2 从DAG导出中间代码的启发式算法 13.1.5 窥孔优化 窥孔优化关注在目标指令的一个较短的序列上,通常称其为“窥孔” 通过删除其中的冗余代码,或者用更高效简洁的新代码来替代其中的部分代码,达到提升目标代码质量的目的 13.2 全局优化13.2.1 数据流分析 编译器需要了解一些非常重要的信息,例如: 某个变量在某个特定的执行点(语句前后)是否还“存活” 某个变量的值,是在什么地方定义的 某个变量在某一执行点上被定义的值,可能在哪些其他执行点被使用 数据流分析方程 out[S] = gen[s] ? (in[S] – kill[S]) S代表某条语句(也可以是基本块,或者语句集合,或者基本块集合等) out[S]代表在该语句末尾得到的数据流信息 gen[S]代表该语句本身产生的数据流信息 in[S]代表进入该语句时的数据流信息 kill[S]代表该语句注销的数据流信息 数据流方程求解过程中的3个关键因素 当前语句产生和注销的信息取决于需要解决的具体问题 :可以由in[S]定义out[S],也可以反向定义,由out[S]定义in[S] 由于数据是沿着程序的执行路径,也就是控制流路径流动,因此数据流分析的结果受到程序控制结构的影响 代码中出现的诸如过程调用、指针访问以及数组成员访问等操作,对定义和求解一个数据流方程都会带来不同程度的困难 到达定义(reaching definition)分析 在程序的某个静态点p,例如某条中间代码之前或者之后,某个变量可能出现的值都是在哪里被定义的? 在p处对该变量的引用,取得的值是否在d处定义? 如果从定义点d出发,存在一条路径达到p,并且在该路径上,不存在对该变量的其他定义语句 如果路径上存在对该变量的其他赋值语句,那么路径上的前一个定义点就被路径上的后一个定义点“杀死”,或者消除了 基本块B的到达定义数据流方程 out[B] = gen[B] ? ( in[B] – kill[B] ) in[B]为进入基本块时的数据流信息 kill[B] = kill[d
您可能关注的文档
最近下载
- 2025年湖北省襄阳市襄阳四中学初三下学期四月调考化学试题含解析.doc VIP
- GBT 42706.1-2023 电子元器件 半导体器件长期贮存 第1部分:总则.doc
- 2018人教版七年级数学下册练习:期末达标检测卷.docx VIP
- AC-25厂拌热再生沥青混凝土试验段施工方案.doc
- 行业联盟与竞争格局演变-深度研究.pptx
- 2024-2025学年北京西城区九年级初三(上)期末道德与法治试卷(含答案).pdf
- 2025年山东省枣庄市滕州市高三二模物理试卷及答案.docx
- 第九章 压强和浮力(知识清单)【教师版】.docx VIP
- 2025保安员理论考试100题(附答案) .pdf VIP
- 2022年三级教育测试题.docx
文档评论(0)