美文网首页
编译器笔记45-代码优化-流图

编译器笔记45-代码优化-流图

作者: 衣忌破 | 来源:发表于2020-03-10 22:49 被阅读0次

基本块 (Basic Block)

基本块是满足下列条件的最大的连续三地址指令序列

  • 控制流只能从基本块的第一个指令进入该块。也就是说,没有跳转到基本块中间或末尾指令的转移指令。
  • 除了基本块的最后一个指令,控制流在离开基本块之前不会跳转或者停机。

基本块划分算法

  • 输入
    三地址指令序列

  • 输出
    输入序列对应的基本块列表,其中每个指令恰好被分配给一个基本块。

  • 方法
    首先,确定指令序列中哪些指令是首指令 (leaders) ,即某个基本块的第一个指令。

    1. 指令序列的第一个三地址指令是一个首指令
    2. 任意一个条件或无条件转移指令的目标指令是一个首指令
    3. 紧跟在一个条件或无条件转移指令之后的指令是一个首指令

    然后,每个首指令对应的基本块包括了从它自己开始,直到下一个首指令(不含)或者指令序列结尾之间的所有指令。

例.png

流图(Flow Graphs)

  • 流图的结点是一些基本块
  • 从基本块B到基本块C之间有一条边当且仅当基本块C的第一个指令可能紧跟在B。此时称B是C的前驱(predecessor),C是B的后继(successor)。

有两种方法可以确认这样的边:

  1. 有一个从B的结尾跳转到C的开头的条件或无条件跳转语句
  2. 按照原来的三地址语句序列中的顺序,C紧跟在之B后,且B的结尾不存在无条件跳转语句。
例.png 例.png

相关文章

  • 编译器笔记45-代码优化-流图

    基本块 (Basic Block) 基本块是满足下列条件的最大的连续三地址指令序列 控制流只能从基本块的第一个指令...

  • iOS的性能优化

    1、ipa包体积优化 1.1 编译配置优化:编译器代码层面优化Optimize Level;Bitcode(较难...

  • 编译器优化部分代码

    我们简单写一些代码看编译器优化前后的对比。编译器没有优化时 在Build Setting 搜索optimizati...

  • 编译器想做什么

    编译器就程序员写的代码变成CPU能理解机器代码。编译器的指令重排指开启编译器优化后,在不影响代码行为的前提下,代码...

  • 编译器前端和后端

    编译器粗略分为词法分析,语法分析,类型检查,中间代码生成,代码优化,目标代码生成,目标代码优化。把中间代码生成及之...

  • APK 编译打包 笔记

    一图流 1.Java编译器对工程本身的java代码进行编译,这些java代码有三个来源:app的源代码,由资源文件...

  • 编译器笔记48-代码优化-数据流分析

    数据流分析(data-flow analysis) 数据流分析一组用来获取程序执行路径上的数据流信息的技术 数据流...

  • Flutter 前端编译器编译流程分析

    1. 前端编译器和后端编译器的区别 编译流程粗略分为词法分析、语法分析、类型检查、中间代码生成、代码优化、目标代码...

  • 编译原理——寄存器

    •代码生成是编译器的最后阶段。代码生成器通过前端产生的中间表示法或者通过代码优化器在代码优化阶段,映射到目标程序中...

  • 编译器优化

    首先我们先看以下代码: 编译器优化优化的是什么呢,优化的是底层代码执行逻辑,使项目执行更加高效。汇编是最接近底层的...

网友评论

      本文标题:编译器笔记45-代码优化-流图

      本文链接:https://www.haomeiwen.com/subject/quvndhtx.html