1. 基于谓词的IF转换
1.1if转换的实现过程需要考虑两个方面的问题
(1)如何为每个基本块分配谓词
(2)将谓词定义指令放在程序的什么位置
程序段的代码都可以根据其自身的控制依赖,表示为相关的程序依赖图(PDG),图中每个顶点表示一个基本块,每条边,代表了一个可能的控制转移。因此每个基本块的谓词由它所在的分支路径和PDG中的分支条件决定,所以第一个问题就相当于如何为PDG中每个顶点指定谓词。第二个问题需要考虑分支转移的最早位置。
当前有关的if转换都是基于一个经典的IF转换算法,它能够将谓词的使用和谓词定义指令的数目最小化
1、 计算后必经节点;
2、 计算指令间的控制依赖;
3、 将控制依赖分解成R,K,函数;
4、 根据R,K函数分配谓词并用对应的限定谓词将指令转换为谓词指令;
5、 合并谓词定义指令;
6、 减少谓词数目
我们通过两个函数来解决,R规定了每个块的赋值命名和相关谓词,K规定了使用中的每个谓词的位置指示,而位置取决于(1)谓词操作的语义(2)执行风格
2. 计算后必经节点信息
必经节点:如果控制流图节点d是节点i的必经节点,记作d dom i,如果从entry节点到i的每一条可能执行的路径都包括d,显然d是自反的(每个节点都是自己的必经节点)、传递的(a dom b 且b dom c,则a dom c)、和反对称的(a dom b 且b dom a,则a=b),任何节点的必经节点是一个集合。
后必经节点:节点p是节点i的后必经节点记作p pdom i,如果从节点i到节点exit,每一条可能路径都包含节点p,即在逆转所有的遍并且交换entry节点和exit节点而得到的流图中,i dom p。若x pdom y ,且y !=x,则称x是y的严格后必经节点记作x spdom y。x pdom y,不存在节点z,使x pdom z,z pdom y,则x为y的直接后继,记作x ipdom y.
如下所示代码:
if(b<0)
{
if(c>0) b=b+1;
else b=c+1;
d=d+1;
}
else
e++;
a++;
3. 控制依赖
PDG(程序控制依赖图)将程序表示为一个图,其中节点是语句和谓词表达式(或运算符和操作数)以及与节点表示节点操作所依赖的两个数据值以及操作执行所依赖的控制条件。一个程序的所有依赖项的集合可以看作是一个程序中语句和谓词的偏序。
什么是控制依赖CD简单地说就是if语句中的block y是受if语句所在的block x 所控制的,此时CD(y)=x,称为y控制依赖于x.
基于控制流图和后必经节点的概念,控制依赖如下定义:
CFG中的两个节点X、Y,如果满足如下条件,则称节点Y控制依赖于节点X;
(1)Y是X的某些后继的后必经节点;
(2)Y不是X的所有后记的后必经节点
3.1计算CD的算法:
pdom(x) = {y in N: y pdom x}
ipdom(x) = {y in N: y ipdom x}
for [x,y,label] in E such that y not in pdom(x)
{
Lub = ipdom(x);
if !label
x = -x
t = y;
while(t!=Lub)
{
CD(t) = CD(t) U {x}//U表示求并集
t = ipdom(t);
}
}
3.2计算R&K
R是将N中的每个节点x映射到P的函数 P=R(x)
K是将每个类P映射到CD(x)的函数 K§->CD(x)
p = 1;
for x in N
t = CD(x);
if(t!=null)
{
if t in K
{
//性质2
R(x) = q such that K(q) = t;
}
else
{
K§ = t;
R(x) = p++;
}
}
性质1:每一个block x有且仅有一个对应的p = R(x)
性质2:对于两个不同的block,如果它们的控制依赖都为k§,则这两个block对应的寄存器都为p(对应上述算法中的if语句)
4. 谓词操作
4.1谓词操作的语义
我们假设体系结构提供了一组谓词寄存器,每个寄存器的长度为1位,以及两个定义操作:
Py=stuff(tx) &px,and (1)
Py=stuffbar(tx) &px (2)
其中Px是源谓词寄存器,Py是目标谓词寄存器,而tx“表示对块x的分支条件求值的结果”。
stuff操作的语义是使用自明表示法(一种公理化的风格):
if(px.old)py.new=tx.old
else py.new=py.old
tx.new=tx.old
px.new=px.old
4.2谓词操作的执行风格
位置问题(函数K)取决于这种风格的选择。为了便于我们的讨论,考虑图1中所示的图表。在图中,谓词对块的分配是用简写表示的:
Bx(tx)&Py:表示(1)block B与分支条件t相关联,(2)B的每个操作(包括谓词定义操作,如果有的话)都用谓词py来做谓语。例如,B3(t3) & p5声明将谓词寄存器p5分配给带有分支条件t3的块B3。
以这种方式消除控制流