必须是等价变换(保持功能) 为优化的努力必须是值得的。 有时优化后的代码的效率反而会下降。 局部公共子表达式 B5 x=a[i]; a[i]=a[j]; a[j]=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 2014-7-6 9 B5 x=a[i]; a[i]=a[j]; a[j]=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 2014-7-6 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2 2014-7-6 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2 12 10.1.1公共子表达式删除 全局公共子表达式 B5 x=a[i]; a[i]=a[j]; a[j]=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 3 2014-7-6 代码优化程序的结构 控制流分析
数据流分析 代码变换
控制流分析的主要目的是分析出程序的循环结构。循 环结构中的代码的效率是整个程序的效率的关键。 数据流分析进行数据流信息的收集,主要是变量的值 的获得和使用情况的数据流信息。 到达-定义分析;活跃变量分析;可用表达式分析. 代码变换:根据上面的分析,对中间代码进行等价变换. 2014-7-6 (1) i := m 1 (2) j := n (3) t1 := 4 * n (4) v := a[t1] (5) i := i + 1 (6) t2 := 4 * i (7) t3 := a[t2] (8)if t3<v goto(5) 6 程序例子 本节所用的例子 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; 2014-7-6 10 10.1.1公共子表达式删除 局部公共子表达式 B5 x=a[i]; a[i]=a[j]; a[j]=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 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2 2014-7-6 17 10.1.1公共子表达式删除 i := m 1 j := n t1 := 4 * n v := a[t1] B1 i := i + 1 B2 t2 := 4 * i t3 := a[t2] if t3 < v goto B2 j := j 1 B3 t4 := 4 * j t5 := a[t4] if t5 > v goto B3 2014-7-6 (9) j := j 1 (10) t4 := 4 * j (11) t5 := a[t4] (12)if t5>v goto(9) (13)if i>=j goto(23) (14) t6:=4 * i (15) x := a[t6] . . . 7 i := m 1 j := n t1 := 4 * n v := a[t1] 2014-7-6 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2 x := a[t2] t9 := a[t4] a[t2] := t9 a[t4] := x goto B2 x := t3 a[t2] := t5 a[t4] := x goto B2 5
优化范围
优化语言级
2014-7-6 程序例子 本节所用的例子 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; 21 10.1.3 无用代码删除 无用代码是指计算结果以后不被引用的语句 一些优化变换可能会引入无用代码 例:复制传播可能会引入无用代码
x := t3 a[t2] := t5 a[t4] := t3 goto B2 2014-7-6 a[t2] := t5 a[t4] := t3 goto B2 22 x := a[t2] t9 := a[t4] a[t2] := t9 a[t4] := x goto B2 14 10.1.1公共子表达式删除 B5 x=a[i]; a[i]=a[j]; a[j]=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 a := d + e c := d + e c := t 删除局部公共子表达式期间引进复制 2014-7-6 19 10.1.2 复制传播