《编译原理实践及应用》PPT教学课件-第7章 代码优化.ppt

《编译原理实践及应用》PPT教学课件-第7章 代码优化.ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 代码优化 代码优化所地位和作用: 实际上很多地方可以对代码的执行效率进行改进,主要讲对中间代码的优化 优化分类 按阶段分: 与机器无关的优化--对中间代码进行 依赖于机器的优化--对目标代码进行 根据优化所涉及的程序范围分成: (1)局部优化:(基本块) (2)循环优化:对循环中的代码进行优化 (3)全局优化:大范围的优化 中间代码优化技术 优化工作 数据流分析(control-flow analysis) 控制流分析(data-flow analysis) 变换(transformations) 快速排序程序 void quicksort(int m,int n) { int i,j, v,x; if (nm) return; i=m-1;j=n;v=a[n]; while(1) { do i=i+1; while(a[i]v); do j=j-1; while(a[j]v); if (i=j) break; x=a[i];a[i]=a[j];a[j]=x; } x=a[i];a[i]=a[n];a[n]=x; quicksort(m,j);quicksort(i+1,n); } 入口语句: 1.程序的第一个语句;或者, 2.条件转移语句或无条件转移语句的转移目标语句(此处的转移语句包括各种控制的转向,如call,return,end,stop等) ;或者 3.紧跟在条件转移语句后面的语句。 练习 以快速排序的C代码为例: void quicksort(int m,int n) { int i,j, v,x; if (nm) return; i=m-1;j=n;v=a[n]; while(1) { do i=i+1; while(a[i]v); do j=j-1; while(a[j]v); if (i=j) break; x=a[i];a[i]=a[j];a[j]=x; } x=a[i];a[i]=a[n];a[n]=x; quicksort(m,j);quicksort(i+1,n); } 快速排序程序的中间代码 i=m-1; j=n; v=a[n]; while(1) { do i=i+1; while(a[i]v); do j=j-1; while(a[j]v); if (i=j) break; x=a[i];a[i]=a[j];a[j]=x; } x=a[i];a[i]=a[n];a[n]=x; 优化技术1—删除公共子表达式 如果表达式E已经在前面计算过,并在计算之后E的值没有改变,则称该表达式为公共子表达式。可以避免重复计算。 在更大的范围内删除4*i,4*j的计算,得到: 优化技术2—复写传播 T6:=T2 x=a[T6] T7:=T6 T8:=T4 T9=a[T8] a[T7]:=T9 T10:=T8 a[T10]:=x goto B2 T6:=T2 x=T3 T7:=T2 T8:=T4 T9=T5 a[T2]:=T5 T10:=T4 a[T4]:=T3 goto B2 优化技术3—删除无用代码 优化技术4——对程序进行代数恒等变换(合并已知量) T1:=2 …… T2:=4*T1 优化技术4—对程序进行代数恒等变换(降低运算强度) a) i*2 = 2*i = i+i = i2 b) i/2 = (int)(i*0.5) c) 0-1 = -1 d) f*2 = 2.0 * f = f + f e) f/2.0 = f*0.5 优化技术4——对程序进行代数恒等变换(代数化简) x+0 = x 0+x = x x*1 = x 1*x = x 0/x = 0 x-0 = x b true = b b false = false b || true = true b || false = b 基本块的DAG表示及其应用 DAG Directed Acyclic Graph 有向无环路图 基本块的DAG是在结点上带有标记的DAG DAG表示了基本块的计算过程 叶结点表示标识符或常数的值,以标识符或常数作为标记 内部结点以运算符作为标记,表示运算结果 边表示了操作间的前驱和后继的关系 每个结点:附加标识符标记,可以是一个或多个标识符都具有该结点代表的值 基本块的DAG构造算法: 首先,DAG为空。 对基本块的每一四元式,依次执行1,2,3,4步: 1. 如果NODE(B)无定义,则构造一标记为B的叶结点并定义NODE(B)为这个结点; 如果当前四元式是0型,则记NODE(B)的值为n,

文档评论(0)

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

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

1亿VIP精品文档

相关文档