-
2021-11-19 16:42:03
基本块和流图 Baic Block and Flow Graph
介绍一种表示中间代码的方式—流图(Flow Graph)。先把中间代码划分成基本块(Baisc Block),载由基本块形成流图的节点,流图的边指明了哪些基本块可能跟随一个基本块之后执行。
基本块 Baic Block
(鲸书)非正式地说,基本块是一段只能从它的第一条指令进入,并从它的最后一条指令离开的最长指令序列。
(龙书)以三地址指令作为中间代码的表示。基本块为满足下列条件的最大连续指令序列:
- 控制流只能从基本块的第一条指令进入该基本块。
- 除了基本块最后一条指令,控制流在离开基本块之前不会停机或者跳转。
基本块的划分算法(龙书):
输入:三地址指令序列。
输出:输入指令序列对应的基本块列表,每个指令恰好被分给一个基本块。
方法:首先,确定指令序列中的首指令,即每个基本块的第一条指令。选择首指令的原则:
1)输入指令序列的第一条指令是一个首指令。
2)任何一个跳转指令的目标指令是一个首指令。
3)紧跟在一个跳转指令之后的指令是一个首指令。
然后,每个首指令对应的基本块包括了从它自己开始,直到下一个首指令(不包含)或者程序结尾指令之间的所有指令。
上图的这个例子中,根据首指令的规则,很容易判断1、2、3、10、12和13是首指令。流图 Flow Graph
中间代码程序转换成基本块后,可以使用一个流图表示它们之间的控制流。流图的节点就是基本块。基本块B到基本块C之间有一条边当且仅当C的第一条指令紧跟在B最后一条指令之后执行。有以下两种原因:
- 存在一个从B结尾跳转到C开头的条件或无条件跳转语句。
- 按照原来指令序列中的顺序,C紧跟在B之后,且B结尾不存在跳转语句。
称B是C的前驱(predecessor),而C是B的后继(successor)。通常还为流图增加一个入口(entry)和出口(exit)节点,方便程序分析。
下图就是上面指令序列的流图。
参考
- [1] 龙书
- [2] 鲸书
更多相关内容 -
编译原理之基本块和流图
2019-11-26 22:00:48基本块和流图 •采用图的方式表示中间代码,有助于生成更好的代码 ä构造方法 1.把中间代码划分成基本块(basic block,BB),每个基本块满足如下条件: ①控制流只能从基本块的第一个指令进入 ②除了基本块的...基本块和流图
• 采用图的方式表示中间代码, 有助于生成更好的代码ä 构造方法1. 把中间代码划分成基本块( basic block , BB ),每个基本块满足如下条件:① 控制流只能从基本块的第一个指令进入② 除了基本块的最后一条指令,控制流在离开基本块前不会停机或者跳转2. 基本块形成了流图( flow graph )的结点,流图的边指明了哪些基本块可能紧随一个基本块之后执行ä 中断等程序行为可能打破基本块的上述约定 1• 构造基本块和流图的目的是对代码进行优化ä 如果中断正常返回,则中断本身的保护机制可以使程序正常执行下去,不影响正确性,但可能形象优化效果ä 如果中断导致异常退出,优化的结果也不会有错,程序本身非正常终止基本块(1)
• 基本块:ä 定义:基本块是程序中最大限度顺序执行的语句序列,其中只有一个入口和出口,入口是其第一个语句,出口是其最后一个语句ä 基本块的入口语句可能是• 程序的第一个语句• 跳转的目标语句• 条件跳转的下一条语句ä 基本块的结束语句可能是• 停机语句• 跳转语句• 跳转目标语句的前一个语句(词法序)• 基本块(续)ä 构造方法• 输入:一个三地址指令序列• 输出:与之对应的基本块列表,每个指令恰好被分到一个基本块中• 方法:ä 首先,取定中间代码序列中哪些指令是首指令( leader ,入口指令,基本块的第一条指令)1. 中间代码的第一个三地址指令是一个首指令2. 任意一个条件或无条件转移指令的目标指令是一个首指令3. 紧跟在一个条件或无条件转移指令之后的指令是一个首指令ä 然后,每个首指令对应的基本块包括了从它自己开始,直到下一个首指令(不含)或者中间程序的结尾指令之间的所有指令ä 一个特殊情况:过程调用语句作为一个新的基本块的开始,甚至独立成为一个基本块后续使用信息
• 下次不再引用意味着优化的机会ä 寄存器优化ä 临时名字存储单元的指派• 计算后续使用信息ä 三地址语句中名字的 使用( use ) 定义:• 假定三地址语句 i 把 a 的值赋给 x, 如果语句 j 用 x 作为运算对象,并且控制从 i 流到 j, 这条路径中没有 x 的其它赋值,则称 j 引用 x 在 i 定的值• 此时,称 x 在语句 i 处活跃( live )ä 在基本块内:后续使用信息• 对每个基本块反向扫描• 为每个名字 x 在符号表中登记它是否在本块中有后续使用• 如果在本块中没有后续使用,则登记它是否在本块的出口活跃。缺省认为所有的非临时变量在出口都是活跃的ä 算法 8.7 :对一个基本块中的每一个语句确定活跃性与后续使用信息• 输入:一个三地址语句的基本块 B ,假设在基本块 B 开始时,所有的非临时变量都是活跃的• 输出:对于每一个语句 i : x = y op z , 将 x 、 y 及 z 的活跃性信息及后续使用信息关联到 i• 方法:从基本块 B 的最后一个语句开始,反向扫描到 B 的开始处。对每一个三地址语句 i : x := y op z , 依次执行下述步骤:ä 把当前符号表中 x 、 y 和 z 的后续使用信息和活跃信息附加到语句 i 上;(若 x 不活跃,则这个语句可以删掉)ä 在符号表中设置 x 为 “无后续使用”和“不活跃”;ä 把符号表中 y 和 z 的后续使用信息均置为 i , 活跃信息均置为“活跃”。注意:上述次序不能颠倒,因为x可能是y或z
流图(1)
• 定义:控制流图或流图ä 结点是基本块的有向图 G = ( N , E , root )• N 是结点的集合,每个结点表示一个基本块• E 是边的集合,如果结点 n i 和 n j 间存在前驱和后继的关系,则在存在一条从 n i 到 n j 的有向边(此时意味着,在 n i 执行后,可能会执行 n j )ä n i 的出口语句是 goto (s) 或 if … goto (s), 且( s) 是的 n j 入口语句ä n j 在程序中的位置紧跟在 n i 后,且 n i 的出口语句不是无条件转移语句和停语句• root 是流图的首结点(或称为根结点),是包含程序第一个语句的基本块ä 每个流图都可以等价变换为单入口,且每个结点最多有两个后继的图流图的表示方式
• 可以用任意的表示图的数据结构表示流图• 结点(基本块)ä 基本块是一个指令序列ä 可能要频繁改变这个指令序列• 数量或组成的指令• 目的之一是优化ä 采用指令链表的形式较为高效 -
【编译原理笔记16】代码优化:流图,常用代码优化方法, 基本块的优化
2020-08-14 19:29:05以基本块为单位,进行运算上的推导优化。堪称妙!原来编译器这么强大!本次笔记内容:
8-1 流图
8-2 常用代码优化方法一
8-3 常用代码优化方案二
8-4 基本快的优化本节课幻灯片,见于我的 GitHub 仓库:第16讲 代码优化_1.pdf
文章目录
流图
基本块(Basic Block)
基本块
是满足下列条件的最大
的连续
三地址指令序列:- 控制流只能从基本块的
第一个指令
进入该块。也就是说,没有跳转到基本块中间或末尾指令的转移指令 - 除了基本块的
最后一个指令
,控制流在离开基本块之前不会跳转或者停机
基本块划分算法
输入:
- 三地址指令序列
输出:
- 输入序列对应的
基本块列表
,其中每个指令恰好被分配给一个基本块
方法:
- 首先,确定指令序列中哪些指令是
首指令
(leaders),即某个基本块的第一个指令
- 指令序列的
第一个三地址指令
是一个首指令 - 任意一个条件或无条件
转移指令的目标指令
是一个首指令 - 紧跟在一个条件或无条件
转移指令之后的指令
是一个首指令
- 然后,每个首指令对应的基本块包括了从它自己开始,直到
下一个首指令
(不含)或者指令序列结尾
之间的所有指令
例
如上是快速排序法的部分源代码。根据跳转指令找首指令(如跳转指令后的一条指令)。
流图(Flow Graphs)
- 流图的
结点
是一些基本块
- 从基本块B到基本块C之间有一条
边
当且仅当基本块C的第一个指令可能
紧跟在B的最后一条指令之后执行
此时称B是C的
前驱
(predecessor) ,C是B的后继
(successor)。有两种方式可以确认这样的边:
- 有一个
从B的结尾跳转到C的开头
的条件或无条件跳转语句 - 按照原来的三地址语句序列中的顺序,C紧跟在之B后,且B的结尾不存在无条件跳转语句
例
感觉像是描述各个运算部分的关系。常用的代码优化方法(1)
优化的分类
- 机器无关优化:针对中间代码
- 机器相关优化:针对目标代码
- 局部代码优化:单个基本块范围内的优化
- 全局代码优化:面向多个基本块的优化
常用的优化方法
- 删除公共子表达式
- 删除无用代码
- 常量合并
- 代码移动
- 强度削弱
- 删除归纳变量
①删除公共子表达式
公共子表达式:
- 如果表达式
x op y
先前已被计算过,并且从先前的计算到现在,x op y
中变量的值没有改变,那么x op y
的这次出现就称为公共子表达式(common subexpression)
例
将 B3 重构如黄色区域。
由 B3 “逆流而上”,发现 4 ∗ i 4*i 4∗i 没有被修改过,则其是一个公共子表达式。
进行了再次的画家如上。
发现 a [ t 2 ] a[t_2] a[t2] 与 a [ t 4 ] a[t_4] a[t4] 也是公共子表达式。
a [ t 1 ] a[t_1] a[t1]能否作为公共子表达式?把 a [ t 1 ] a[t_1] a[t1]作为公共子表达式是不稳妥的,因为控制离开 B 1 B_1 B1进入 B 6 B_6 B6之前可能进入 B 5 B_5 B5,而 B 5 B_5 B5有对 a a a的赋值。
关键问题:如何自动识别公共子表达式?会在后面的课程详细介绍。
常用的代码优化方法(2)
②删除无用代码
复制传播:常用的
公共子表达式消除算法
和其它一些优化算法会引入一些复制语句
(形如x=y
的赋值语句)
复制传播:在复制语句x= y之后尽可能地用y代替x。
无用代码
(死代码Dead-Code):其计算结果永远不会被使用
的语句。例
程序员不大可能有意引入无用代码,无用代码通常是因为前面执行过的某些转换而造成的。如何自动识别无用代码?
也将在后文详细介绍。
如上,通过删除公共子表达式
与删除无用代码
,将 B5 与 B6 简化了不少。③常量合并(Constant Folding)
如果在
编译时刻
推导出一个表达式的值是常量
,就可以使用该常量来替代这个表达式。该技术被称为常量合并
。④代码移动(Code Motion)
这个转换处理的是那些
不管循环执行多少次都得到相同结果的表达式
(即循环不变计算
,loop-invariant computation) ,在进入循环之前就对它们求值。例
如何自动识别循环不变计算?循环不变计算的相对性
对于多重嵌套的循环,循环不变计算是相对于某个循环而言的。可能对于更加外层的循环,它就不是循环不变计算。
⑤强度削弱(Strength Reduction)
用较快的操作代替较慢的操作,如用加代替乘。
循环中的强度削弱
对于一个变量x ,如果存在一个正的或负的
常数
c使得每次x被赋值时它的值总增加c ,那么x就称为归纳变量
(Induction Variable)。例
归纳变量可以通过在每次循环迭代中进行一次简单的增量运算(加法
或减法
)来计算。⑥删除归纳变量
在沿着循环运行时,如果有
一组归纳变量
的值的变化保持步调一致
,常常可以将这组变量删除为只剩一个。
如上, i i i 与 j j j 都无用了。基本块的优化
很多重要的
局部优化技术
首先把一个基本块
转换成为一个无环有向图
(directed acyclic graph,DAG)。基本块的 DAG 表示
基本块中的每个
语句
s都对应一个内部结点
N:- 结点N的
标号
是s中的运算符
;同时还有一个定值变量表
被关联到N ,表示s是在此基本块内最晚对表中变量进行定值的语句 - N的
子结点
是基本块中在s之前、最后一个对s所使用的运算分量
进行定值的语句对应的结点
。如果s的某个运算分量在基本块内没有在s之前被定值,则这个运算分量对应的子结点就是代表该运算分量初始值的叶结点(为区别起见,叶节点
的定值变量表中的变量加上下脚标0) - 在为语句x=y+z构造结点N的时候,如果x已经在某结点M的定值变量表中,则从M的定值变量表中删除变量x
例,有基本块:
a = b + c b = a - d c = b + c d = a - d
对于形如 x=y+z 的三地址指令,如果已经有一个结点表示 y+z,就不往 DAG 中增加新的结点,而是给已经存在的结点附加定值变量
x。基于基本块的 DAG 删除无用代码
从一个DAG上删除所有
没有附加活跃变量
(活跃变量是指其值可能会在以后被使用的变量)的根结点
(即没有父结点的结点) 。重复应用这样的处理过程就可以从DAG中消除所有对应于无用代码的结点。
数组元素赋值指令的表示
如上,因为有可能出现 i = j i=j i=j ,因此不能轻易把 a [ i ] a[i] a[i] 算作公共子表达式。- 对于形如a[j] = y的三地址指令,创建一个运算符为“
[]=
”的结点,这个结点有3个子结点,分别表示a、j和y - 该结点没有定值变量表
- 该结点的创建将
杀死
所有已经建立的、其值依赖于a的结点 - 一个被杀死的结点
不能再获得任何定值变量
,也就是说,它不可能成为一个公共子表达式
根据基本块的DAG可以获得一些非常有用的信息
- 确定哪些变量的值在该基本块中赋值前被
引用
过:在DAG中创建了叶结点
的那些变量 - 确定哪些语句计算的值可以在基本块外被引用:在DAG构造过程中为语句s(该语句为变量x定值)创建的节点N,在DAG构造结束时x仍然是N的定值变量
从 DAG 到基本块的重组
对每个具有若干定值变量的节点,构造一个
三地址语句
来计算其中某个变量的值。倾向于把计算得到的结果赋给一个在基本块
出口处活跃
的变量(如果没有全局活跃变量的信息
作为依据,就要假设所有变量都在基本块出口处活跃,但是不包含编译器为处理表达式而生成的临时变量)。如果结点有
多个附加的活跃变量
,就必须引入复制语句
,以便给每一个变量都赋予正确的值。例
构建 DAG 如右边。常量直接标记出来。
最终,根据 DAG 得到优化后的基本块如下:D = A + C E = A * C F = E + D L = 15 + F
- 控制流只能从基本块的
-
编译原理学习笔记 14.2 基本块和流图
2020-12-16 17:08:15基本块定义 基本块中的代码是连续的语句序列。 程序的执行(控制流)只能从基本块的第一条语句进入。 程序的执行只能从基本块的最后一条语句离开。 14.1 基本块和流图 (1) prod := 0 (2) i := 1 (3) t1 := 4 * i ...前言
参考课上PPT内容。 该学习笔记目前仅打算个人使用。
后续会进一步整理,包括添加笔记内容,标明参考资料。更新中。。。
参考资料
- 《编译技术》
- 邵老师PPT
一、基本块
1、基本块定义
- 基本块中的代码是连续的语句序列。
- 程序的执行(控制流)只能从基本块的第一条语句(入口语句)进入,从基本块的最后一条语句离开。
例:函数foo的C语言源码和三地址中间代码
划分基本块属于同一个基本块的有
(1)~(6)
(3)~(8)
(7)~(13)分析
- 不利于优化,因为编译器:
- 得不到分支、路径等控制信息。
- 得不到数据流、控制流的信息。
2、基本块划分算法
输入:四元式序列
输出:基本块列表。每个四元式仅属于一个基本块
方法:
1、确定各个入口语句:
- 规则1:整个语句序列的第一条语句
- 规则2:能由条件/无条件跳转语句转移到的第一条语句
- 规则3:紧跟在跳转语句之后的第一条语句
2、每个入口语句直到下一个入口语句,或者程序结束,它们之间的所有语句都属于同一个基本块。
二、流图
1、定义
- 流图是一种有向图
- 结点:基本块
- 有向边:如果在某个执行序列中, B2的执行紧随在B1之后,则从B1到B2有一条有向边
紧随:满足下列条件中之一即称为紧随
- B1的最后一条语句条件/无条件转移到B2的第一条语句
- B1的最后一条语句条件转移判断失败后,进入到B2的第一条语句
- 按照程序的执行次序, B2紧跟在B1之后,并且B1没有无条件转移到其他基本块
前驱和后继:
- 设从B1到B2有一条有向边,则:
- B1为B2的前驱
- B2为B1的后继
三、基本块的有向无环图(DAG)
1、有向无环图(DAG)
- Directed Acyclic Graph
- 用来表示基本块内各中间代码之间的关系
- 可通过DAG图消除公共子表达式
定义
- 图的叶结点由变量名或常量所标记。
对于那些在基本块内先引用再赋值的变量,可以采用变量名加下标0的方式命名其初值。 - 图的中间结点由中间代码的操作符所标记,代表着基本块中一条或多条中间代码。
- 基本块中变量的最终计算结果都对应着图中的一个结点
具有初值的变量,其初值和最终值可以分别对应不同的结点。
例:基本块的DAG图表示
赋值语句:
a = b * (-c) + b * (-c)
中间代码
t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5
语法树
DAG图
注:
- 这里,由于变量 c 被赋值前曾经被引用,因此有 c 和 c0 两种不同的表示。
2、构建DAG图的算法
在消除局部公共子表达式处
-
慕课编译原理(第二十三章.局部优化-基本块划分)
2020-05-09 11:55:08局部优化-基本块划分0 目录23 优化123.2 局部优化-基本块划分23.2.1 课堂重点23.2.2 测试与作业24 下一章 0 目录 23 优化1 23.2 局部优化-基本块划分 23.2.1 课堂重点 23.2.2 测试与作业 24 下一... -
覆盖率 基础术语解释 基本块,基本块图,打桩,行覆盖率,分支覆盖率
2020-02-26 16:35:25基本块(Basic Block) ”A basic block is a sequence of instructions with only entry and only one exit. If any one of the instructions are executed, they will all be executed, and in sequence from ... -
BBV:实验基本块向量生成工具
2017-06-12 19:45:49使用基本块向量创建SimPoints12.3。BBV命令行选项12.4。基本块向量文件格式12.5。履行12.6。线程可执行支持12.7。验证12.8。性能 要使用此工具,必须--tool=exp-bbv在Valgrind命令行上指定 。 12.1。概观... -
C编译器剖析_5.4.2 中间代码生成及优化_基本块的合并
2015-04-24 17:05:205.4.2 基本块的合并 我们在第5.4.1节时给出了由基本块构成的双向链表和控制流图,为阅读方便,我们这里再次给出“图5.1.4 基本块的静态结构和动态结构”。在这一小节中,我们试图把双向链表中相邻的基本块进行... -
17.IDA-基本块的定义
2016-01-28 17:17:50基本块是一条或数条指令的组合,它拥有唯一一个指向块起始位置的入口点和唯一一个指向块结束位置的退出点,通常,为判定基本块,应忽略函数调用指令并未将控制权转交到当前函数这一事实,除非已知被调用的函数无法... -
llvm中如何利用分支概率和基本块频率估计
2013-08-09 11:06:31分支概率(branch probability)是指在程序的控制流图中,从控制流从一个基本块A到其任意后继基本块Si的概率。控制流从基本块A到其所有后继基本块的概率之和为1. 基本块频率(block frequency) -
在LLVM中如何判断二个基本块(Basic Block)的支配关系
2014-02-24 16:11:53在LLVM中我们可以使用如下代码判断基本块支配关系(需要包含头文件llvm/Analysis/Dominators.h)。 Function* F; ... DominatorTree*T=new DominatorTree(); T->runOnFunction(*F); T->print(errs());//打印出... -
使用Intel编译器(0)基础(2)基本块Basic Block
2011-12-09 10:37:32参考手册: ...所以,基本块的一个典型特点是:只要基本块中第一条指令被执行了,那么基本块内所有执行都会按照 顺序 仅 执行一次 。 基本块可以用源代码、汇编、指令等表示。 -
编译原理学习笔记---龙书第三版(精简习题版)
2019-01-20 10:27:447.基本块的DAG表示&DAG到基本块的重组 8.数据流分析&寄存器分配 推荐视频: https://www.bilibili.com/video/av17404276/?p=87 中科大华保健老师 概要 编译器(compiler)和解释器(interpreter) ... -
【编译原理】中间代码优化(二) 局部优化
2020-06-01 10:23:21对于一个给定的程序,我们可以把它划分为一系列的基本块。在各个基本块范围内,分别进行优化。局限于基本块范围内的优化称为基本块内的优化,或者称为局部优化。所谓基本块,是指程序中一个顺序执行的语句序列,其中... -
《编译原理》画 DAG 图与求优化后的 4 元式代码 - 例题解析
2021-05-23 01:36:50《编译原理》画 DAG 图与求优化后的 4 元式代码 - 例题解析DAG 图 (Directed Acyylic Graph) 无环路有向图(一)基本块基本块是指程序中一顺序执行的语句序列, 其中只有一个入口语句 (第一个语句) 和一个出口语句(最后... -
GCC Coverage代码分析-基本块图、插桩位置及桩代码执行分析
2011-05-27 22:09:00本博客... 基本块图及插桩点分析2.1 基本块图2.2 有效基本块图2.3 带桩点信息的有效基本块图2.4 插桩位置及桩代码执行情况分析3. 小结Appendix:源代码中对Basic Block的解释 0.序 由前面 -
《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析
2019-06-23 16:21:27DAG 叶结点上标记的标识符是在该基本块之前的基本块内被定值,并在该基本块内被引用的标识符。 DAG 各结点上的附加标识符是在基本块内被定值,并可以在基本块后被引用的标识符。 如果确认某结点的一个附加标记... -
Python的基本语法——语句块
2016-01-11 14:51:311.语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句; 2在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是同样的缩进量; 3.缩进:Python开发者有意让违反了缩进规则的... -
编译原理习题(含答案)——16-19代码优化——哈工大陈鄞配套版本
2018-06-14 11:54:40运行时间短且占用存储空间小 2 基本块内的优化为 ( )。A. 代码外提,删除归纳变量B. 删除多余运算,删除无用赋值C. 强度削弱,代码外提D. 循环展开,循环合并 3 对一个基本块来说,( )是正确的。A. 只有一个入口... -
编译原理(8):代码优化
2020-02-18 18:34:47声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记。...除了基本块的最后一个指令,控制流在离开基本块之前不会跳转或者停机 基本块划分算法 首先(1)指令是首指令,其次跟在... -
深度学习 残差块
2019-09-18 13:15:15恒等残差块——The identity block 卷积残差块——The convolutional block 恒等残差块——The identity block The identity block是ResNets中使用的标准块,对应于输入激活(例如 a [1])与输出激活具有... -
编译原理之代码优化
2017-12-18 10:43:49根据上面基本块的定义,我们将诸多基本块组装在一起,构建成程序循环图,如针对下面这个例子 ( 1 ) read x ( 2 ) read y ( 3 ) r∶=x mod y ( 4 ) if r= 0 goto ( 8 ) ( 5 ) x∶=y ( 6 ) ... -
编译原理——代码优化习题
2020-07-02 18:11:391)划分基本块,给每个基本块编号 2)画出代码的流图 3)若有循环,则列出构成每个循环的结点。 B=1 B=2 if w<=x goto L2 e=b goto L2 L1: goto L3 L2: c=3 b=4 c=6 L3: if y<=z goto L4 goto L5 ... -
C编译器剖析_5.1 中间代码生成及优化_简介
2015-04-08 19:41:24本节对UCC编译器的中间代码生成及优化进行简介,给出基本块BasicBlock、三地址码、控制流图CFG的相应数据结构,介绍有条件跳转、无条件跳转和间接跳转等概念。 -
编译实验(三)目标代码生成
2018-01-28 17:00:09//定义基本块的数据结构,定义代码表的基本结构,找到四元式的入口,划分基本块,遍历基本块进行代码生成(首先完成根据四元式地址找到基本块,完成操作符代码表),精化代码表用到寄存器分配 static int nameNum; ... -
编译原理第十章-优化
2019-06-17 16:38:46A 过程体 B 基本块 C 函数体 D 循环体 2 有关基本归纳变量的作用,错误的是(D ) A 自身定值 B 计算其它同族归纳变量 C 控制循环 D 记录循环的结果 3 在循环内可以实行的优化有(D ) A 代码外提 B 删除... -
编译原理 第十章复习题 优化
2019-06-19 10:27:23B 基本块 C 函数体 D 循环体 有关基本归纳变量的作用,错误的是(D)。 A 自身定值 B 计算其它同族归纳变量 C 控制循环 D 记录循环的结果 在循环内可以实行的优化有(D)。 A 代码外提 B 删除归纳变量 C 强度... -
控制流分析(Control Flow Analysis)
2021-06-06 14:28:27扩展基本块 1、扩展基本块(extended basic block): 从一个首领开始的最长指令序列,在这个指令序列中,除了第一个结点之外不含其他汇合结点 只有一个入口且可能有多个出口(可看作以入口基本块为根的一棵树) ... -
活跃变量分析
2015-01-27 09:03:21一个值被计算保存到一个寄存器中后,很有可能在基本块中被使用。如果它在基本块中是死的,就不必在结尾处保存这个值。另外在所有寄存器被占用时,如果还需申请寄存器的话,应该考虑使用一个存储了已死亡的值