【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算
本次笔记内容:
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
- 设基本块B由语句s1,s2,…,sns_1, s_2, … , s_ns1,s2,…,sn顺序组成,则
基本块上的数据流模式
到达定值分析
定值(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)=gend∪(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)=genB∪(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_B
和kill_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.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...
- zucc 编译原理 笔记
zucc 编译原理 笔记 lec02 lec03 lec04
- 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除
本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...
- 【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析
本次笔记内容: 8-8 活跃变量分析 8-9 可用表达式分析 本节课幻灯片,见于我的 GitHub 仓库:第18讲 代码优化_3.pdf 文章目录 活跃变量分析 活跃变量 例:各基本块的出口处的活跃变 ...
- 【编译原理】中间代码优化(二) 局部优化
预备知识简述. 对于一个给定的程序,我们可以把它划分为一系列的基本块.在各个基本块范围内,分别进行优化.局限于基本块范围内的优化称为基本块内的优化,或者称为局部优化. 所谓基本块,是指程序中一个顺序执 ...
- 了解编译原理-笔记小结
这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...
- 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识
本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...
- 【编译原理】中间代码优化(三) 循环优化
文章目录 循环优化概述. 计算必经节点集. 循环查找算法. 1.查找回边. 2.查找循环. 代码外提. 强度削弱. 删除归纳变量. 循环优化概述. 什么叫做循环?循环就是程序中那些可能反复执行的代码序 ...
- 【编译原理】中间代码优化(一) 优化技术大观
代码优化概述. 通过对程序进行等价变换,使得从变换后的程序出发,能够生成更加有效的目标代码,这种变换我们叫做优化. 优化其实可以在编译的各个阶段进行,但最主要的一类优化是在目标代码生成以前,对语法分析 ...
最新文章
- 使用Jenkins持续集成Vue项目配置Sonar任务
- linux内核模块的强制删除-结束rmmod这类disk sleep进程
- 主题图标_Avada主题网站favicon图标设置详细图文教程
- neon浮点运算_Linux下VFP NEON浮点编译
- 当Elasticsearch遇见智能客服机器人
- OJ1029: 三角形判定
- sql调优的几种方式_「数据库调优」屡试不爽的面试连环combo
- VMware时钟不准的解决之道
- NET对象的XML序列化和反序列化
- 《模拟电子技术》-童诗白
- 给potplayer配置iptv源,看所有你想看的电视
- Windows设置程序开机自启动的几种方法(整理发布)
- html中form表单提交中文乱码问题基本解决办法
- 阿里云DataV数据可视化---数据
- 戴尔服务器板载系统raid管理,如何在 Dell 系统的统一可扩展固件接口(UEFI)配置中管理您的板载 LSI 3008 RAID 控制器...
- 如何根据pom文件创建自己的本地仓库
- css样式字体文本汇总
- 利用Django实现一个博客(附全部源码)
- 虹科案例分享丨世界领先的矿业公司(英美资源集团)与虹科-Atheer合作
- 大数据之“用户行为分析