【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析
本次笔记内容:
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
开始的某条路径
会引用变量x
在p
点的值,则称变量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
- 从e_killBe\_kill_Be_killB中删除表达式
- 把所有和 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】代码优化:活跃变量分析,可用表达式分析相关推荐
- 【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)
本次笔记内容: 4-8 自底向上的分析概述 4-9 LR分析法概述 4-10 LR0分析 4-11 LR0分析表构造 本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf 本节课介 ...
- 【编译原理笔记04】语法分析:自顶向下的分析概述、文法转换、LL1文法
本次笔记内容: 4-1 自顶向下分析概述 4-2 文法转换 4-3 LL1文法 文章目录 自顶向下分析概述 最左推导(Left-most Derivation) 最右推导(Right-most Der ...
- 【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算
本次笔记内容: 8-5 数据流分析 8-6 到达定值分析 8-7 到达定值方程的计算 本节课幻灯片,见于我的 GitHub 仓库:第17讲 代码优化_2.pdf 文章目录 数据流分析 数据流分析(da ...
- 编译原理笔记(二)之词法分析
编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...
- zucc 编译原理 笔记
zucc 编译原理 笔记 lec02 lec03 lec04
- Principles of Program Analysis -- 可用表达式分析
目录 可用表达式分析 available expressions analysis 例子 静态分析框架 什么是计算 副作用分析 形式化 求值 结论 课后作业 编程作业 本文将通过一个简单的例子来体现静 ...
- 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除
本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...
- 了解编译原理-笔记小结
这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...
- 【编译原理笔记01】什么是编译,编译系统各结构作用
资源Bilibili AV17649289 编译原理 哈尔滨工业大学 陈鄞 本次笔记内容: 1-1 什么是编译 1-2 编译系统的结构 1-3 词法分析 1-4 语法分析概述 1-5 语义分析概述 1 ...
最新文章
- 如何挽回一个快要“变心”的买家?
- 321. Create Maximum Number 解题方法详解
- 利用D触发器和异或门实现两个IO解读电机编码器的计数值和方向
- VB6 无法加载ieframe.dll,导致不能使用 浏览器控件--(转载)
- ARM产品系列对应架构图
- 【LeetCode】汉明距离(Hamming Distance)
- 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
- paramiko获取远程主机的环境变量
- ubuntu 下WebStorm 无法输入中文
- 什么是php与html,php和html的关系和区别是什么
- redis-trib.rb和redis-cli部署redis主从集群的异同
- SSRF---gopher和dict打redis
- WSL2中 使用jupyter lab
- Gmail账号申诉成功
- OpenCV第六篇:阈值函数
- 安卓海外SDK接入问题
- 关于游戏中仓库类的设计
- tekton入门 - piplinerun
- FPS游戏通用准星修正实现自瞄
- 这应该是第一篇写拼多多商业模式的文章吧
热门文章
- 【PostgreSQL-9.6.3】分区表
- [解决方案]Window 2008 R2 + IIS7.5 + VS2013 错误代码 0x80070002
- 解决eclipse中mybatis的xml配置文件无代码提示问题
- MySQL出现Incorrect integer value: ‘‘ for column ‘id‘ at row 1解决方法
- The AC power adapter wattage and type cannot be determined. 解决方案
- mac下解决中文乱码的问题
- session跨域共享解决方案
- ora-01489 字符串连接的结果过长 解决方案
- 如何将Groovy中的文件读入字符串?
- win11怎么快速返回桌面 windows11快捷键返回桌面的设置方法