编译原理8 代码优化

优化

  1. 定义:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码
    1. 等价:不能改变程序的运行结果
    2. 有效:目标代码运行时间段,占用存储空间小
      在这里插入图片描述
  2. 优化的级别:局部优化,循环优化,全局优化
  3. 优化的种类
    1. 删除多余运算(删除公用子表达式)
    2. 合并已知量
    3. 复写传播
    4. 删除无用赋值
    5. 代码外提
    6. 强度消弱
    7. 变换循环控制条件
  4. 优化序列:
    1. 源代码
      在这里插入图片描述
    2. 复写传播后:
      1. 已经计算过的直接引用
      2. 值始终相等的进行替换
        在这里插入图片描述
    3. 删除无用赋值:
      因为上一步进行了替换所有有一些赋值语句不再使用
      在这里插入图片描述
    4. 强度削弱:
      1. 乘法变加法
      2. 用执行时间少的指令代替执行时间长的指令
        在这里插入图片描述
    5. 删除归纳变量
      1. 把循环中用到的i和j删减了
      2. 修改控制中的条件
        在这里插入图片描述

局部优化

  1. 基本块:程序中一顺序执行语句序列,其中只有一个入口和一个出口。入口就是其中第一个语句,出口就是其中最后一个语句。
    在这里插入图片描述

  2. 划分基本块:局限于基本快范围内的优化称为基本块内的优化,或称局部优化

  3. 划分基本块的算法:

    1. 找出中间语句(三地址语句)程序中各个基本块的入口语句:

      1. 程序第一个语句
      2. 能由条件转移语句或无条件转移语句转移到的语句
      3. 紧跟在条件转移语句后面的语句
    2. 对以上求出的每个入口语句,确定其所属的基本块。它是由该入口语句到下一入口语句(不包括该入口语句)、或到一转移语句(包括该转移语句)之间的语句序列组成的、或一停语句(包括该停语句)之间的语句序列组成的。
      在这里插入图片描述

    3. 凡未被纳入某一基本快中的语句,可以从程序中删除

    4. 示例:
      在这里插入图片描述
      在这里插入图片描述

  4. 流图:

    1. 以基本块为结点构成流图
    2. 如果一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点
    3. 如果在某个执行顺序中,基本快B2紧接在基本块B1之后执行,则从B1到B2有一条有向边(B1是B2的前驱,B2是B1的后继)
      1. 有一个条件或无条件转移语句从B1的最后一条语句转移到B2的第一条语句。
      2. 在程序的序列中,B2紧接在B1的后面,并且B1的最后一条语句不是一个无条件转移语句。
        在这里插入图片描述
  5. 基本块的DAG表示:

    1. 在DAG增加标记和附加信息:
      1. 图的叶结点以一标识符或常数作为标记,表示该结点代表该变量或常熟的值
      2. 图的内部结点以一运算符作为标记,表示该结点代表应用该运算符对其后继结点所代表的值进行计算的结果
      3. 各个结点上可能附加一个或多个标识符(称附加标识符)表示这些变量具有该结点所代表的值
        在这里插入图片描述
    2. 四元式的DAG表示:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  6. 基本块的优化算法:

    1. 一个基本块,可用一个DAG来表示
    2. 对基本块中每一条四元式代码,依次构造对应的DAG图,最后基本快中所有四元式构造出来DAG连成整个基本快的DAG
      1. 准备操作数的结点:构造结点
      2. 合并已知量:根据常数值能计算的将其计算出来
      3. 删除公共子表达式:计算过的值直接用之前的变量赋值
      4. 删除无用赋值:原来对一个值有了结果,现在又要其有新的结果,将之前的删除
  7. 示例:

    1. 算出常量之前那个常量结点可以删除(常数)删除无用赋值
      在这里插入图片描述
    2. 最后结果来看第五句结果是多余的
      在这里插入图片描述
      在这里插入图片描述
    3. 优化四元式
      在这里插入图片描述
      在这里插入图片描述

循环优化

  1. 循环优化的措施

    1. 代码外提
    2. 强度消弱
    3. 删除归纳变量(变换循环控制条件)
    4. 循环展开
    5. 循环合并
  2. 代码外提:

    1. 所谓变量A在某点d的定值到达另一点u(或称变量A的定值点d到达另一点u),是指流图中从d有一通路到达u且该通路上没有A的其他定值

    2. 循环不变运算:对四元式A:=B op C,若B和C是常数,或者到达他们的B和C的定值点都在循环外
      在这里插入图片描述
      查找循环中华不变运算的算法
      在这里插入图片描述

    3. 把循环不变运算提到循环体外

      1. 外提的位置:
        在这里插入图片描述
        示例:
        在这里插入图片描述
        在这里插入图片描述
      2. 外提的条件:
        1. 不变运算A所在的结点是L所有出口结点的必经结点
        2. A在循环中其他地方未再定值,才能把循环不变运算A:=B op C外提
        3. 循环中所有A的引用点只有S中的A的定值才能到达
          在这里插入图片描述
          在这里插入图片描述
        4. 代码外提算法:
          在这里插入图片描述
    4. 强度消弱:把程序中执行时间较长的运算转换为执行时间较短的运算
      在这里插入图片描述

      1. 强度消弱通常是针对循环控制变量有线性关系的变量赋值进行
      2. 经过强度消弱后,循环中可能出现一些新的无用赋值
      3. 对于消弱下标变量地址计算的强度非常有效
    5. 删除归纳变量:
      在这里插入图片描述
      在这里插入图片描述
      计算T3终止值将I替换
      在这里插入图片描述

      1. 删除归纳变量再强度消弱以后进行
      2. 强度消弱和删除归纳变量的统一算法框架
        在这里插入图片描述

例题

  1. 优化的目的:
    为了便于在目标代码生成阶段从优化的中间代码出发,生成更加有效的目标代码
  2. 优化遵循的原则:
    1. 等价原则:变换前后的代码在逻辑上必须是等价的,变换不能改变程序的运行结果
    2. 有效原则
    3. 合算原则
  3. 从优化的范围来看,优化分为:
    1. 局部优化
    2. 循环优化
    3. 全局优化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值