10.1概述 优化实施可从不同环节着手 1.源代码 选择合适的算法和实现语句,如排序时选择 快速排序比插入排序快。 2.设计语义动作 考虐产生更加高效的中间代码,并为后面的 代码优 如:在循环语句的头和尾对应的中间代码打上 标记,有助于后面的控制流和数据流分析:代 码的交叉处和交汇处也可以打上标记,以便子 识别程序流图中的直接前驱和直接后继。在 标代码 可以考虑怎样重复利用寄存器 选择指令;进行题式冼花季
10.1 概述 ◼ 优化实施可从不同环节着手 ◼ 1.源代码 ◼ 选择合适的算法和实现语句,如排序时选择 快速排序比插入排序快。 ◼ 2.设计语义动作 ◼ 考虑产生更加高效的中间代码,并为后面的 代码优化作准备。 ◼ 如:在循环语句的头和尾对应的中间代码打上 标记,有助于后面的控制流和数据流分析;代 码的交叉处和交汇处也可以打上标记,以便于 识别程序流图中的直接前驱和直接后继。在目 标代码这一级,可以考虑怎样重复利用寄存器, 如何选择指令,进行窥孔优化等
10.1概述 优化的种类(后面举例说明 □删除多余运算(或称删除公用子表达式) □复写传播 代码外提 □强度消弱 □变换循环控制条件 □合并已知量 □删除无用赋值
10.1 概述 ◼ 优化的种类(后面举例说明) 删除多余运算(或称删除公用子表达式) 复写传播 代码外提 强度消弱 变换循环控制条件 合并已知量 删除无用赋值
void quicksort(m,n);內快速排序 int m, n, int l, J5 int V, x; if(n≤=m) return fragment begins here*/ =m-1;j=n;v=a[n]; while(1)i do i=i+1; while(a [s<v) do j=j-1; while(a d>v) if(>可 break; X=ac可=ai;a]=x; X=a[; at=a [ n; a [n=x /fragment ends here*/ d, quicksort(m, j); quicksort(i+1, n) 以下列出在两个 fragment直接代码的中间代码
void quicksort (m, n); /*快速排序*/ int m, n; { int i, j; int v, x; if (n<=m) return; /* fragment begins here*/ 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; /*fragment ends here*/ quicksort (m, j); quicksort (i+1, n); }以下列出在两个fragment直接代码的中间代码
i:=m-1 -n T1:=4n v:=aT B if i>=j goto B6 B4 i:=i+1 I2:=4*i x: =a T Bs x:=aTul T3: -aT 2 T:4 12 if T3<v goto B2 13 n a 14 -a a T1a:=4 x√ n a 15 goto B2 if Ts>v goto B 口中间代码程序段
❑中间代码程序段 i:=m-1 j:=n T1 :=4*n v:=a[T1 ] B1 i:=i+1 T2 :=4*i T3 :=a[T2 ] if T3<v goto B2 B2 j:=j-1 T4 :=4*j T5 :=a[T4 ] if T5>v goto B3 B3 if i>=j goto B6 B4 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 B5 T11:=4*i x:=a [T11] T12:=4*i T13:=4*n T14:=a [T13] a [T12]=T14 T15:= 4*n a [T15]=x B6
I-n J:=n T1:=4*n V:-a 匝 B ifi>= i goto B6」JB4 i:=i+1 64 1:=4*i I2:=4*i x:=a [ T6l B Bs x:=a, I-=4 5 6 a 12=4i ifT3<v goto B2 8 4 13:=4n a T14:=a[T1 ⅡT}=T9 a T12IFT =4*n TRol a T:=4 15 oto b Ts: =aT ifTs>v goto B3 口中间代码程序段 如果一个表达式E在前面已经计算过,并且之后E中变量的值没有改变,则称E 为公共子表达式。对公共子表达式可避免重复计算,称为删除公共子表达式
❑中间代码程序段 i:=m-1 j:=n T1 :=4*n v:=a[T1 ] B1 i:=i+1 T2 :=4*i T3 :=a[T2 ] if T3<v goto B2 B2 j:=j-1 T4 :=4*j T5 :=a[T4 ] if T5>v goto B3 B3 if i>=j goto B6 B4 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 B5 T11:=4*i x:=a [T11] T12:=4*i T13:=4*n T14:=a [T13] a [T12]=T14 T15:= 4*n a [T15]=x B6 如果一个表达式E在前面已经计算过,并且之后E中变量的值没有改变,则称E 为公共子表达式。对公共子表达式可避免重复计算,称为删除公共子表达式