DAG 图(Directed Acylic Graph)无环路有向图优化
基本块是指程序中一顺序执行的语句序列,其中只有一个入口语句(第一个语句)和一个出口语句(最后一个语句)3d
对于一个基本块来讲,执行时只能从其入口语句进入,从其出口语句退出blog
语句 | |
---|---|
出口语句 | 任何控制转移四元式 |
入口语句 | 所转向的目标语句 |
一、求四元式序列中各个基本块的入口语句。编译
二、对每一入口语句,构造所属的基本块,该基本块由:table
三、凡是未包含在某一基本块中的语句,都是程序中控制流程不可达的语句,可删除它们。class
对于下面给出的求最大公因子的程序,能够根据基本块的构造规则与其划分基本块编译原理
基本块构造步骤:变量
(1):由规则 (1) 中的 ① 可知语句 (1) 是一个入口语句
(2):由规则 (1) 中的 ② 可知,语句 (3) 和 (8) 均是人口语句
(3):由规则 (1) 中的 ③ 可知,语句 (5) 是二我的口语句,能够用 “+” 在人口语句的左侧做标记。
(4):由规则 (2) 能够划分该程序为四个基本块,它们分别是:原理
程序中在代码段左侧对各个基本块进行了标记。cli
定义: 以基本块为结点,控制程序流向做为有向边,画出的有向图称为流图。
特色:
若是一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点
一个控制流程图可表示成一个三元组:
G=(N,E,n0 )
N:全部结点(基本块)集;
E:全部有向边集;
n0 :首结点。
有向边:
当下述条件有一个成立时,从结点i有一有向边引向结点 j:
对程序基本块:
构造如下程序控制流图:
DAG Directed Acyclic Graph 无环路有向图
定义:
(1) 在一个有向图中,若结点 ni 有弧指向结点 nj,则 ni 是 nj 的父结点,nj 是 ni 的子结点;
(2) 若 n1,n2,…,nk 间存在有向弧 n1→n2→…→nk,则称 n1 到 nk 之间存在一条通路,如有 nk=n1,则称该通路为环路;
(3) 如有向图中任意通路都不是环路,则称该图为无环路有向图(DAG)
用来描述基本块的 DAG:
(1) 图的叶结点以一标识符或常数作标记,表示该结点表明该变量或常数的值。
(2) 图的内部结点以一运算符做为标记;
(3) 图中各个结点上可能附加一个或多个标识符,表示这些标识符具备该结点所表明的值,简称附标。
四元式对应的 DAG 结点形式
按其四元式对应结点的后继个数分红四种类型:0型、1型、2型、3型
对于基本块 P
(1)S0 := 2
(2)S4 := 2
(3)S1 := 1.5
(4)S2 := T-C
(5)S3 := T+C
(6)S5 := S3
(7)R := 2/S3
(8)S6 := R
(9)H := R*S2
(1)试用 DAG 进行优化并重写基本块
(2)假定只有 R,H 在基本块出口是活跃的,试写出优化后的 4 元式序列
(只须要还原活跃变量)
(1)画出 DAG 图以下:
画图的步骤就是:根据基本块,一部一部组装
(2)假定只有 R,H 在基本块出口是活跃的,试写出优化后的 4 元式序列
(只须要还原活跃变量)
优化后的 4 元式代码能够写为:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2
解释:
与原来的基本块相比较能够看出:
除了能够应用 DAG 进行上述的优化外,还能够从基本块的 DAG 中获得一些其余信息:
若是确认某结点的一个附加标记在基本块后不会被引用,则该标识符的定值语句能够做为死代码被删除。
假设上面例子中 S0~S6。在基本块后面都不会被引用只有 R, H 在基本块出口是活跃的则优化后的四元式序列能够写为:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2