编译原理 代码优化

代码优化

代码优化的任务

通过等价的程序变换,获得执行速度快、占用空间少的程序

算法优化

例:顺序查找与hash算法

有效的数据结构和算法

领域相关

编译优化

目标代码优化:机器相关

特殊指令的利用

特殊结构的高效利用:SIMD、MIDM、流水、向量机

中间代码优化:机器无关

如:常数计算、公共代码段的提取

中间代码优化

局部优化

基本块内部(不包括各种转移控制)

全局优化

循环优化、控制流分析与化简、数据流分析

基本块和流图

基本块的划分

  1. 定义入口语句

代码序列的第一语句

转移语句的目标语句

转移语句的下一条语句

  1. 定义基本块

入口语句到下一入口语句之前

入口语句到转移语句或停语句

在这里插入图片描述

程序流图的构造

程序流图 G={N,E,n0

以基本块为结点,以控制流为有向边

N:基本块集

n0 :含首语句的基本块

E:有向边集合 (A, B)

A 的出口是转移语句,转向 B 的入口

A 的出口不是转移语句,B 紧跟 A 之后

在这里插入图片描述

局部优化

(1) 合并已知量

常数表达式计算

在这里插入图片描述

(2) 重新命名临时变量

(3) 删除基本块内的公共子表达式

(4) 删除死代码

未出现在程序流图中的代码

赋值但未引用的指令

(5) 交换语句次序

减少临时变量

循环优化

1.代码外提

将循环不变运算移到循环外

2.强度削弱

用较快的操作代替较慢的操作

循环归纳变量相关的强度削弱
归纳变量

3.消除归纳变量

利用归纳变量相关的计算代替归纳变量的计算

补充:

复写传播:

a=d+e;
b=d+e;
c=d+e;
===>
t=d+e;
a=t;
b=t;
c=t;

复写语句:形式为f = g 的赋值
优化过程中会大量引入复写
复写传播变换的做法是在复写语句f = g后,尽可能用g代表f
复写传播变换本身并不是优化,但它给其他优化带来机会

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值