本次笔记内容:
8-5 数据流分析
8-6 到达定值分析
8-7 到达定值方程的计算

本节课幻灯片,见于我的 GitHub 仓库:第17讲 代码优化_2.pdf

文章目录

  • 数据流分析
    • 数据流分析(data-flow analysis)
    • 数据流分析模式
    • 基本块上的数据流模式
  • 到达定值分析
    • 例:可以到达各基本块的入口处的定值
    • 到达定值分析的主要用途
    • “生成”与“杀死”定值
    • 到达定值的传递函数
      • 例:各基本块B的gen_B 和kill_B
    • 到达定值的数据流方程
  • 到达定值方程的计算
    • 计算到达定值的迭代算法
    • 引用-定值链(Use-Definition Chains)

数据流分析

数据流分析(data-flow analysis)

数据流分析:一组用来获取程序执行路径上的数据流信息的技术。

数据流分析应用:

  • 到达-定值分析(Reaching-Definition Analysis)
  • 活跃变量分析(Live-Variable Analysis)
  • 可用表达式分析(Available-Expression Analysis)

在每一种数据流分析应用中,都会把每个程序点和一个数据流值关联起来。

数据流分析模式

语句的数据流模式

  • IN[s]IN[s]IN[s]:语句s之前的数据流值
  • OUT[s]OUT[s]OUT[s]: 语句s之后的数据流值
  • fsf_sfs​:语句s的传递函数(transfer function)
    • 一个赋值语句s之前和之后的数据流值的关系
    • 传递函数的两种风格
    • 信息沿执行路径前向传播(前向数据流问题)
      OUT[s]=fs(IN[s])OUT[s] = f_s(IN[s])OUT[s]=fs​(IN[s])
    • 信息沿执行路径逆向传播(逆向数据流问题)
      IN[s]=fs(OUT[s])IN[s] = f_s(OUT[s])IN[s]=fs​(OUT[s])
  • 基本块中相邻两个语句之间的数据流值的关系
    • 设基本块B由语句s1,s2,…,sns_1, s_2, … , s_ns1​,s2​,…,sn​顺序组成,则
      IN[si+1]=OUT[si]i=1,2,…,n−1IN[s_{i+1}]= OUT[s_i] i=1, 2, … , n-1IN[si+1​]=OUT[si​]i=1,2,…,n−1

基本块上的数据流模式

到达定值分析

定值(Definition):变量x的定值是(可能)将一个值赋给x的语句

到达定值(Reaching Definition):

  • 如果存在一条从紧跟在定值d后面的点到达某一程序点p的路径,而且在此路径上d没有被“杀死” (如果在此路径上有对变量x的其它定值d′,则称变量x被这个定值 d′ “杀死”了) ,则称定值d到达程序点p。
  • 直观地讲,如果某个变量x的一个定值d到达点p,在点p处使用的x的值可能就是由d最后赋予的。

例:可以到达各基本块的入口处的定值


假设每个控制流图都有两个空基本块,分别是表示流图的开始点的ENTRY结点和结束点的EXIT结点(所有离开该图的控制流都流向它)。

如上,是哪些定值可以到达BiB_iBi​的入口处。

到达定值分析的主要用途

  • 循环不变计算的检测:如果循环中含有赋值x=y+z ,而y和z所有可能的定值都在循环外面(包括y或z是常数的特殊情况) ,那么y+z就是循环不变计算
  • 常量合并:如果对变量x的某次使用只有一个定值可以到达,并且该定值把一个常量赋给x,那么可以简单地把x替换为该常量
  • 判定变量x在p点上是否未经定值被引用

“生成”与“杀死”定值

对于定值 ddd :u=v+wu=v+wu=v+w。这里,“+”代表一个一般性的二元运算符

该语句“生成”了一个对变量u的定值d,并“杀死”了程序中其它对u的定值。

到达定值的传递函数

fdf_dfd​:定值ddd:u=v+wu=v+wu=v+w的传递函数,fd(x)=gen⁡d∪(x−killd)f_{d}(x)=\operatorname{gen}_{d} \cup\left(x-k i l l_{d}\right)fd​(x)=gend​∪(x−killd​)。

fBf_BfB​:基本块BBB的传递函数。fB(x)=gen⁡B∪(x−killB)f_{B}(x)=\operatorname{gen}_{B} \cup\left(x-k i l l_{B}\right)fB​(x)=genB​∪(x−killB​),其中,killB=kill1∪kill2∪...∪killnkill_B = kill_1 \cup kill_2 \cup ... \cup kill_nkillB​=kill1​∪kill2​∪...∪killn​,被基本块B中各个语句杀死的定值的集合;而genB=genn∪(genn−1−killn)∪(genn−2−killn−1−killn)∪...∪(gen1−kill2−kill3−killn)gen_B = gen_n \cup (gen_{n-1} - kill_n) \cup (gen_{n-2} - kill_{n-1} - kill_n) \cup ... \cup (gen_1 - kill_2 - kill_3 - kill_n)genB​=genn​∪(genn−1​−killn​)∪(genn−2​−killn−1​−killn​)∪...∪(gen1​−kill2​−kill3​−killn​),表示基本块中没有被块中各语句“杀死”的定值的集合。

例:各基本块B的gen_B 和kill_B


如上,计算了各流图中各个基本块的 gen 与 kill 集合。

到达定值的数据流方程


gen_Bkill_B的值可以直接从流图计算出来,因此在方程中作为已知量

到达定值方程的计算

求解上面提出的 “到达定值的数据流方程” 。

计算到达定值的迭代算法

  • 输入:流图 GGG ,其中每个基本块 BBB 的 genBgen_BgenB​ 和 killBkill_BkillB​ 都已计算出来;
  • 输出:IN[B]IN[B]IN[B] 和 OUT[B]OUT[B]OUT[B] 。


如上,上角标 i 表示第 i 次迭代。

如上,可以根据结束时,各个 B 的 IN 值,来直接构建到达 IN 值表。

引用-定值链(Use-Definition Chains)

可以用上面的 到达 IN 值表 构建 ud 链。

引用-定值链(简称ud链) 是一个列表,对于变量的每一次引用,到达该引用的所有定值都在该列表中。

  • 如果块B中变量a的引用之前a的定值,那么只有a的最后一次定值会在该引用的ud链中;
  • 如果块B中变量a的引用之前没有a的定值,那么a的这次引用的ud链就是IN[B]中a的定值的集合。

【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算相关推荐

  1. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  2. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  3. 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除

    本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...

  4. 【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析

    本次笔记内容: 8-8 活跃变量分析 8-9 可用表达式分析 本节课幻灯片,见于我的 GitHub 仓库:第18讲 代码优化_3.pdf 文章目录 活跃变量分析 活跃变量 例:各基本块的出口处的活跃变 ...

  5. 【编译原理】中间代码优化(二) 局部优化

    预备知识简述. 对于一个给定的程序,我们可以把它划分为一系列的基本块.在各个基本块范围内,分别进行优化.局限于基本块范围内的优化称为基本块内的优化,或者称为局部优化. 所谓基本块,是指程序中一个顺序执 ...

  6. 了解编译原理-笔记小结

    这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...

  7. 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识

    本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...

  8. 【编译原理】中间代码优化(三) 循环优化

    文章目录 循环优化概述. 计算必经节点集. 循环查找算法. 1.查找回边. 2.查找循环. 代码外提. 强度削弱. 删除归纳变量. 循环优化概述. 什么叫做循环?循环就是程序中那些可能反复执行的代码序 ...

  9. 【编译原理】中间代码优化(一) 优化技术大观

    代码优化概述. 通过对程序进行等价变换,使得从变换后的程序出发,能够生成更加有效的目标代码,这种变换我们叫做优化. 优化其实可以在编译的各个阶段进行,但最主要的一类优化是在目标代码生成以前,对语法分析 ...

最新文章

  1. 使用Jenkins持续集成Vue项目配置Sonar任务
  2. linux内核模块的强制删除-结束rmmod这类disk sleep进程
  3. 主题图标_Avada主题网站favicon图标设置详细图文教程
  4. neon浮点运算_Linux下VFP NEON浮点编译
  5. 当Elasticsearch遇见智能客服机器人
  6. OJ1029: 三角形判定
  7. sql调优的几种方式_「数据库调优」屡试不爽的面试连环combo
  8. VMware时钟不准的解决之道
  9. NET对象的XML序列化和反序列化
  10. 《模拟电子技术》-童诗白
  11. 给potplayer配置iptv源,看所有你想看的电视
  12. Windows设置程序开机自启动的几种方法(整理发布)
  13. html中form表单提交中文乱码问题基本解决办法
  14. 阿里云DataV数据可视化---数据
  15. 戴尔服务器板载系统raid管理,如何在 Dell 系统的统一可扩展固件接口(UEFI)配置中管理您的板载 LSI 3008 RAID 控制器...
  16. 如何根据pom文件创建自己的本地仓库
  17. css样式字体文本汇总
  18. 利用Django实现一个博客(附全部源码)
  19. 虹科案例分享丨世界领先的矿业公司(英美资源集团)与虹科-Atheer合作
  20. 大数据之“用户行为分析

热门文章

  1. 网络维护与管理作业3
  2. 关于微信小程序开发环境苹果IOS真机预览报SSL协议错误问题解决方案
  3. 实战互联网公司数据存储解决方案
  4. win10更新1809版本后运行Dev-cpp, dos控制台字符乱码解决方法
  5. 运用js解决java selenium元素定位问题
  6. sql无效字符 执行sql语句报错解决方案
  7. dubbo 解决既是消费者又是提供者 Duplicate application configs 的问题
  8. 如何强制gradle重新下载依赖项?
  9. 如何生成随机的字母数字字符串?
  10. js 中断函数执行_js如何中断递归函数