编译 第八章 代码生成.pptVIP

  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文档。上传文档
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 优化应用的时间 优化可以在编译的每阶段分别执行。一般将完成主要的优化工作。 中间代码生成时的优化 优化用来转换语法树本身,其中某些子树被删除或替换为简单的子树 中间代码生成后的优化 对很多优化而言,语法树不适合收集信息及实现优化,优化将在中间代码上实现 目标代码生成时 优化依赖于目标机器结构 优化应用的范围 可分为: 局部优化 全局优化 过程间优化 局部优化 局部优化是应用于代码的线性部分, 即, 代码中没有跳进或跳出语句 一个最大的线性代码序列被称为 基本块 局部优化是在基本块中的优化。 全局优化 全局优化是扩展超出基本块,但是限制在单个过程中的优化 过程间优化 过程间优化是扩展出过程边界到整个程序的优化 8.4.3 优化的数据结构和实现技术 优化的两种数据结构 流图 流图是执行全局优化的过程中间代码的图形表示 DAG(无环有向图) DAG 是为每个基本块构造的,执行局部优化的无环有向图 1 流图 流图用于表示每个过程代码的全局信息 流图的结点是基本块 边是条件转或无条件转 (目的是作为其他基本块的开始) 流图的构造 A flow graph, together with each of its basic blocks, can be constructed by a single pass over the intermediate code. Each new basic block is identified as follows: The first instruction begins a new basic block Each label that is the target of a jump begins a new basic block Each instruction that follows a conditional jump begins a new basic block (1) read X (2) read Y (3) R=X mod Y (4) if R=0 goto (8) (5) X=Y (6) Y=R (7) goto (3) (8) write Y (9) halt 流图 三地址码 read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt read X R:=X mod Y X:=Y write Y 解释: 流图是数据流分析的主要数据结构,积累信息用于优化。 不同的信息要求对流图作不同处理,而且收集的信息各不相同,对应于不同的优化要求。 基本块的DAG DAG数据结构跟踪基本块中值和变量的计算和赋值 块中Leaf nodes are values that are used in 格的来自别处的值表示为叶子结点 值上的操作表示为内部结点 新值的赋值表示为将目标变量或临时变量的名字附加到表示赋值的结点上。 2 DAG(无环有向图) 例如 基本块 label L2 t2=fact*x fact=t2 t3=x-1 x=t3 t4=x==0 if_false t4 goto L2 这个基本块的DAG * - == fact x fact,t2 x,t3 1 0 t4 标记基本块的开始和最后的跳转一般不包括在DAG中。Labels at the beginning of basic blocks and jumps at the end are usually not included in the DAG 拷贝操作不生成新的结点,仅仅在表示拷贝值的结点处增加新标记 相同值的重复使用也在DAG中表示 DAG 的构造 轮流处理块中的每条语句 形如 x=y+z的语句 查找表示y和z的“当前”值的结点 若y 和 z 是常量, 则生成一个结点表示y+z 的结果值,并标记为结点x。若x和y已生成则删除该结点,否则生成一个标记为+,且两个孩子分别为y和z的结点,标记这个结点为+ 然而,若已经存在一个结点表示y+z相同的值,则我们不需要在DAG中增加新的结点,而只需要在已存在的结点处再标记x 需要注意三个细节 对于 x=y+z, 如果 y 和 z 是常数, 不需要生成为+的内部结点, 而执行 y+z (常量合并) 对于 x=y+z, 若已经有结点表示y

文档评论(0)

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

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

1亿VIP精品文档

相关文档