编译原理课件第八章代码优化.pptVIP

  • 4
  • 0
  • 约7.6千字
  • 约 52页
  • 2018-04-23 发布于河南
  • 举报
编译原理课件第八章代码优化

第八章 代码优化   逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优结构的目标代码。            若存在,且其左右子结点为NODE(B),NODE(c),让n等于找到的结点;   n3 n4 R r n1 + 公共表达式 T2 如果A无定义,则把A附加到结点n上并令NODE(A)=n;否则先把A从NODE(A)结点上的附加标识符集中删除,再把A附加到新结点n上并令NODE(A)=n 下面是前面介绍的基本块的DAG生成过程 删除无用赋值 ③ T2=R+r                      如果不存在,则建立这样的结点,让n等于建立的结点   否则,查看OP结点, n1 n7 n2 n6 n8 n5 n3 n4 3.14 T0 6.28 T1 R r + T2 * A ,B ,T3 ,T4 ,T5 - T6 * B DAG 生成过程 ① T0=3.14 ② T1=2*T0 ③ T2=R+r ④ A=T1*T2 ⑤ B=A ⑥ T3=2*T0 ⑨ T6=R-r ⑩B=T5*T6 ⑧ T5=T3*T4 ⑦ T4=R+r 此时应去掉B n1 n7 n2 n6 n8 n5 n3 n4 3.14 T0 6.28 T1 R r + T2 * A ,T3 ,T4 ,T5 - T6 * B 生成 DAG ① T0=3.14 ② T1=6.28 ③ T3=6.28 ④ T2=R+r ⑤ T4=T2 ⑥ A=6.28*T2 ⑦ T5=A ⑧ T6=R-r ⑨ B=A*T6 由DAG生成的中间代码G’ G’中已合并了已知量② ⑥ ⑤为无用赋值,G’已删除 ③ ⑦是公共子表达式,删除 ① T0=3.14 ② T1=2*T0 ③ T2=R+r ④ A=T1*T2 ⑤ B=A ⑥ T3=2*T0 ⑦ T4=R+r ⑧ T5=T3*T4 ⑨ T6=R-r ⑩ B=T5*T6   假设T0、T1、T2、T3、T4、T5、T6在后面的基本块中都不使用, S1=R+r A=6.28*S1 S2=R-r B=A*S2   在基本块中应用:合并已知量、临时变量改名等优化技术,可将上述代码变换为: 8.3 循环优化 8.3.1代码外提 实行代码处提时,在循环入口处建立一个新结点,称为前置结点 循环中的代码优化可采用: 代码外提、强度削弱和删除归纳变量 循环中外提的代码将通通外提到前置结点中。 对下面程序段: Int a[10,10] For I=1 to 10 do A[I,2*j]=A[I,2*j]+1 其生成的中间代码为: (1) I=1 (2) if I10 goto (15) (3)T1=2*j (4)T2=10*I (5)T3=T2+T1 (6)T4=addr(A)-11 (7)T5=2*J (8)T6=10*I (9)t7=T6+T5 (10)T8=addr(A)-11 (11)T9=T8[T7] (12)T4[T3]=T9+1 (13)I=I+1 (14)GOTO B2 程序流图 B1 B2 B3 *辛明影  * 1、源程序级:局部优化、循环优化、全局优化 1、节省时间 2、节省空间 二、优化技术 一、优化目的 2、目标代码级的优化 三、优化原则 1、等价原则 2、有效原则 3、合算原则 Void quicksort(a,m,n); Int m,n,a[]; { int I,j; int v,x; if(n=m) 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); } 例:快速排序程序 8.1 优化的主要种类 i=m-1 j=n t1=4*n v=a[t1] i=i+1 t2=4*i t3=a[t2] If t3v goto B2 j=j-1 t4=4*j t5=a[t4] If t5v goto B3 If I=j goto b6 t11=4*I x=a[t11] t12=4*I t13=4*n t14=a[t13] a[12]=t14 t14=4*n a[15]=x t6=4*I x=a[t6] t7=4*i t8=4*j t9=a[t8] a[t7]=t9 t10=4*j a[t10]x goto b2 中间代码程序段 B1

文档评论(0)

1亿VIP精品文档

相关文档