本次笔记内容:
8-8 活跃变量分析
8-9 可用表达式分析

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

文章目录

  • 活跃变量分析
    • 活跃变量
      • 例:各基本块的出口处的活跃变量
    • 活跃变量信息的主要用途
    • 活跃变量的传递函数
      • 例:各基本块B的use_B和def_B
    • 活跃变量数据流方程
    • 计算活跃变量的迭代算法
    • 定值-引用链(Definition-Use Chains)
  • 可用表达式分析
    • 可用表达式信息的主要用途
    • 可用表达式的传递函数
    • e\_gen_B的计算
    • e\_kill_B的计算
    • 可用表达式的数据流方程
    • 计算可用表达式的迭代算法
    • 为什么将OUT[B]集合初始化为U?

活跃变量分析

活跃变量

对于变量x和程序点p,如果在流图中沿着从p开始的某条路径会引用变量xp点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)。

例:各基本块的出口处的活跃变量


有再次定值(且定值与本身无关),则不活跃。

活跃变量信息的主要用途

删除无用赋值:

  • 无用赋值:如果x在点p的定值在基本块内所有后继点都不被引用,且x在基本块出口之后又是不活跃的,那么x在点p的定值就是无用的。

为基本块分配寄存器:

  • 如果所有寄存器都被占用,并且还需要申请一个寄存器,则应该考虑使用已经存放了死亡值的寄存器,因为这个值不需要保存到内存;
  • 如果一个值在基本块结尾处是死的不必在结尾处保存这个值

活跃变量的传递函数

逆向数据流问题:IN[B]=fB(OUT[B])IN[B] = f_B(OUT [B])IN[B]=fB​(OUT[B])

fB(x)=useB∪(x−defB)f_B (x) = use_B \cup(x-def_B)fB​(x)=useB​∪(x−defB​)

  • defBdef_BdefB​:在基本块BBB中定值,但是定值前在BBB中没有被引用的变量的集合;
  • useBuse_BuseB​:在基本块BBB中引用,但是引用前在BBB中没有被定值的变量集合。

例:各基本块B的use_B和def_B


如上依次构建各表达式的 useuseuse 与 defdefdef 集合,很直观。

活跃变量数据流方程

IN[B]IN[B]IN[B]:在基本块B的入口处的活跃变量集合;
OUT[B]OUT[B]OUT[B]:在基本块B的出口处的活跃变量集合。

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

计算活跃变量的迭代算法

  • 输入:流图G,其中每个基本块B的useBuse_BuseB​和defBdef_BdefB​都已计算出来
  • 输出: IN[B]IN[B]IN[B]和OUT[B]OUT[B]OUT[B]


如上,依次迭代,得到最后的IN[B]IN[B]IN[B]和OUT[B]OUT[B]OUT[B]。

由 OUT 值,得到各个基本块的活跃变量。结果与人工分析的结果一致。

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

  • 定值-引用链:设变量x有一个定值d,该定值所有能够到达的引用u的集合称为x在d处的定值-引用链,简称du链
  • 如果在求解活跃变量数据流方程中的OUT[B]时,将OUT[B]表示成从B的末尾处能够到达的引用的集合,那么,可以直接利用这些信息计算基本块B中每个变量x在其定值处的du链。
  • 第一种情况:如果B中x的定值d之后有x的第一个定值d′,则d和d′之间x的所有引用构成d的du链。
  • 第二种情况:如果B中x的定值d之后没有x的新的定值,则B中d之后x的所有引用以及OUT[B]中x的所有引用构成d的du链。

可用表达式分析

可用表达式:

  • 如果从流图的首节点到达程序点p每条路径都对表达式x op y进行计算,并且从最后一个这样的计算到点p之间没有再次对x或y定值,那么表达式x op y在点p可用的(available)。

表达式可用的直观意义:

  • 在点p上,x op y已经在之前被计算过,不需要重新计算。

可用表达式信息的主要用途

  • 消除全局公共子表达式

    如上,如果在 B3 的入口处,表达式 4∗i4 * i4∗i 是可用表达式的话,那么B3中的 4∗i4 * i4∗i 是一个全局公共子表达式,可以将其删除。那么,B2中的表达式满足什么条件,在 B3 的入口处,表达式 4∗i4 * i4∗i 是可用表达式呢?则要求,在B2中,i没有重新定值,或者,即使重新定之后,计算了表达式 4∗i4*i4∗i 的值。

  • 进行复制传播

    在x的引用点u可以用y代替x的条件:从流图的首节点到达u的每条路径都存在复制语句x = y,并且从最后一条复制语句x = y到点u之间没有再次对x或y定值。这个概念即:复制语句x=y在引用点u处可用

可用表达式的传递函数

对于可用表达式数据流模式而言,如果基本块B对x或者y进行了(或可能进行)定值,且以后没有重新计算x op y,则称B杀死表达式x op y。如果基本块B对x op y进行计算,并且之后没有重新定值x或y,则称B生成表达式x op y。

fB(x)=e_genB∪(x−e_killB)f_B(x)= e\_gen_B \cup(x- e\_kill_B)fB​(x)=e_genB​∪(x−e_killB​)

  • e_genBe\_gen_Be_genB​:基本块B所生成的可用表达式的集合
  • e_killBe\_kill_Be_killB​:基本块B所杀死的UUU中的可用表达式的集合
    • UUU:所有出现在程序中一个或多个语句的右部的表达式的全集

e_gen_B的计算

  • 初始化:e_genB=Φe\_gen_B = \Phie_genB​=Φ
  • 顺序扫描基本块的每个语句:z=xopyz = x op yz=xopy
    • x op y加入e_genBe\_gen_Be_genB​
    • 从e_genBe\_gen_Be_genB​中删除和zzz相关的表达式


如上,最终得到的集合是空集。

e_kill_B的计算

  • 初始化:e_killB=Φe\_kill_B = \Phie_killB​=Φ
  • 顺序扫描基本块的每个语句:z=xopyz = x op yz=xopy
    • 从e_killBe\_kill_Be_killB​中删除表达式x op y
    • 把所有和 zzz 相关的表达式加入到 e_killBe\_kill_Be_killB​ 中

可用表达式的数据流方程


e_genBe\_gen_Be_genB​ 和 e_killBe\_kill_Be_killB​ 的值可以直接从流图计算出来,因此在方程中作为已知量

计算可用表达式的迭代算法


输入:流图 GGG ,其中每个基本块B的e_genBe\_gen_Be_genB​ 和 e_killBe \_kill_Be_killB​ 都已计算出来。

为什么将OUT[B]集合初始化为U?

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

  1. 【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)

    本次笔记内容: 4-8 自底向上的分析概述 4-9 LR分析法概述 4-10 LR0分析 4-11 LR0分析表构造 本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf 本节课介 ...

  2. 【编译原理笔记04】语法分析:自顶向下的分析概述、文法转换、LL1文法

    本次笔记内容: 4-1 自顶向下分析概述 4-2 文法转换 4-3 LL1文法 文章目录 自顶向下分析概述 最左推导(Left-most Derivation) 最右推导(Right-most Der ...

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

    本次笔记内容: 8-5 数据流分析 8-6 到达定值分析 8-7 到达定值方程的计算 本节课幻灯片,见于我的 GitHub 仓库:第17讲 代码优化_2.pdf 文章目录 数据流分析 数据流分析(da ...

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

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

  5. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  6. Principles of Program Analysis -- 可用表达式分析

    目录 可用表达式分析 available expressions analysis 例子 静态分析框架 什么是计算 副作用分析 形式化 求值 结论 课后作业 编程作业 本文将通过一个简单的例子来体现静 ...

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

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

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

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

  9. 【编译原理笔记01】什么是编译,编译系统各结构作用

    资源Bilibili AV17649289 编译原理 哈尔滨工业大学 陈鄞 本次笔记内容: 1-1 什么是编译 1-2 编译系统的结构 1-3 词法分析 1-4 语法分析概述 1-5 语义分析概述 1 ...

最新文章

  1. 如何挽回一个快要“变心”的买家?
  2. 321. Create Maximum Number 解题方法详解
  3. 利用D触发器和异或门实现两个IO解读电机编码器的计数值和方向
  4. VB6 无法加载ieframe.dll,导致不能使用 浏览器控件--(转载)
  5. ARM产品系列对应架构图
  6. 【LeetCode】汉明距离(Hamming Distance)
  7. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
  8. paramiko获取远程主机的环境变量
  9. ubuntu 下WebStorm 无法输入中文
  10. 什么是php与html,php和html的关系和区别是什么
  11. redis-trib.rb和redis-cli部署redis主从集群的异同
  12. SSRF---gopher和dict打redis
  13. WSL2中 使用jupyter lab
  14. Gmail账号申诉成功
  15. OpenCV第六篇:阈值函数
  16. 安卓海外SDK接入问题
  17. 关于游戏中仓库类的设计
  18. tekton入门 - piplinerun
  19. FPS游戏通用准星修正实现自瞄
  20. 这应该是第一篇写拼多多商业模式的文章吧

热门文章

  1. 【PostgreSQL-9.6.3】分区表
  2. [解决方案]Window 2008 R2 + IIS7.5 + VS2013 错误代码 0x80070002
  3. 解决eclipse中mybatis的xml配置文件无代码提示问题
  4. MySQL出现Incorrect integer value: ‘‘ for column ‘id‘ at row 1解决方法
  5. The AC power adapter wattage and type cannot be determined. 解决方案
  6. mac下解决中文乱码的问题
  7. session跨域共享解决方案
  8. ora-01489 字符串连接的结果过长 解决方案
  9. 如何将Groovy中的文件读入字符串?
  10. win11怎么快速返回桌面 windows11快捷键返回桌面的设置方法