第八章代码优化 ·为了让编译程序能够生成效率高的目标代码,应 对中间代码进行优化 ·注意:优化最佳化 要求:相对合理性。应考虑空间和时间上的取舍, 及二者的平衡。 ·本章将介绍语法制导翻译阶级的代码优化、线性 窥孔(peep-hole)优化、基于猪构信复的优化三种 类型。 假定优化对象是四元式序列的中间代码
第八章 代码优化 • 为了让编译程序能够生成效率高的目标代码,应 对中间代码进行优化 • 注意:优化≠最佳化 • 要求:相对合理性。应考虑空间和时间上的取舍, 及二者的平衡。 • 本章将介绍语法制导翻译阶段的代码优化、线性 窥孔(peep-hole)优化、基于结构信息的优化三种 类型。 • 假定 优化对象是四元式序列的中间代码
8.1语法制导翻译阶段的优化 ·在进行语法制导翻译的过程中,通过对原文法的改造,可以 生成效率较高的代码 例如,对于一些标准函数(strcpy(s1,s2),sin(x)等)的调用, 可按一般函数调用来处理: fc_call-fc_nm (fc_nm(P_list) P_list-P_list,param |param ·也可将这类特殊函数直接作为表达式处理,从而省去参数 传递、现场保护、转子及返回指令、恢复现场等操作: expr→STRCPY(expr,expr)) ·这类优化一般适用于用于特殊目的的专用语言
8.1 语法制导翻译阶段的优化 • 在进行语法制导翻译的过程中,通过对原文法的改造,可以 生成效率较高的代码. • 例如,对于一些标准函数(strcpy(s1,s2), sin(x)等)的调用, 可按一般函数调用来处理: fc_call → fc_nm ( )| fc_nm(P_list) P_list → P_list , param |param • 也可将这类特殊函数直接作为表达式处理,从而省去参数 传递、现场保护、转子及返回指令、恢复现场等操作: expr → STRCPY ( expr , expr ) • 这类优化一般适用于用于特殊目的的专用语言
8.2线性窥孔优T化 ·考查C程序段 int i;...;i=5;++i;return i+1; ·翻译生成的中间代码为(类C-code): i=5;i+=1;T=i;T=i;T+=1;ret_reg=T1;ret; ·上述代码中有两个相同的赋值语句,它们是由于翻 译时未考虑前后文环境,对++i和return i+1进行翻 译的结果,显然二者之一可以删除 ● 由于这样的优化涉及到多个语句,在语法制导翻译 阶段不可能进行,而窥孔优化可完成此工作
8.2 线性窥孔优化 • 考查C程序段 int i;…;i=5;++i; return i+1; • 翻译生成的中间代码为(类C-code): i=5; i+=1; T1=i; T1 =i; T1 +=1; ret_reg=T1 ; ret; • 上述代码中有两个相同的赋值语句,它们是由于翻 译时未考虑前后文环境,对++i和return i+1进行翻 译的结果,显然二者之一可以删除. • 由于这样的优化涉及到多个语句,在语法制导翻译 阶段不可能进行,而窥孔优化可完成此工作
窥子孔优化的基本思想 窥好孔优化的基本恩想是,考察编译器所生成的中 间代码(或目标代码)中相邻指令,将其中的某些组 合替换为效率更高的指令组. ● 线性窥子孔优化的特点: 1.优化的对象可以是中间代码,也可以是目标代码: 2.每次处理的是一组相邻的指令,仿佛将其暴露在一观 察窗☐(窥孔)中; 3.对优化对象进行线性扫描 窥子孔优化项目有:强度削弱、常数合并、无用代 码册别除、寄存器分配等
窥孔优化的基本思想 • 窥孔优化的基本思想是,考察编译器所生成的中 间代码(或目标代码)中相邻指令,将其中的某些组 合替换为效率更高的指令组. • 线性窥孔优化的特点: 1. 优化的对象可以是中间代码,也可以是目标代码; 2. 每次处理的是一组相邻的指令,仿佛将其暴露在一观 察窗口 (窥孔)中; 3. 对优化对象进行线性扫描. • 窥孔优化项目有:强度削弱、常数合并、无用代 码删除、寄存器分配等
8.2.1强度)3 ~是指用执行效率较高的等价地替换原操作 例如,乘(或除)以2的次方的运算可用左(或右)移位实现 置8等价于X<<3);类似地,以2的次方为模的求模运算可用 按位与实现X%8==X&7). ·另外,用加法代替乘法也可提高效率如=3可替换为: +=+=t联合使用移位和加法,可以削弱乘法的强度=9 可替换为【=<<=3:+t即x*9=X*8+x=(X<<3)+X ·上述优化与具体的运算对象的值有关,有时会得不偿失,应 权衡各方面的因素. 对于非算术运算也可削弱强度,如尽量多使用寄存器,少访 问内存(或外存)等
8.2.1 强度削弱 • ~是指用执行效率较高的等价地替换原操作. • 例如,乘(或除)以2的n次方的运算可用左(或右)移n位实现 (X*8等价于X<<3);类似地,以2的n次方为模的求模运算可用 按位与实现(X%8==X&7). • 另外,用加法代替乘法也可提高效率.如x*=3可替换为:t=x; x+=t; x+=t;联合使用移位和加法,可以削弱乘法的强度:x*=9 可替换为t=x; t<<=3; x+=t; 即x*9 = x*8+x = (x<<3)+x • 上述优化与具体的运算对象的值有关,有时会得不偿失,应 权衡各方面的因素. • 对于非算术运算也可削弱强度,如尽量多使用寄存器,少访 问内存(或外存)等