下图中,可以到达基本块B3的入口处的定值集合是 。
基本块 |
gen[B] |
kill[B] |
B1 |
{d1,d2} |
{d6,d7} |
B2 |
{d3,d4} |
{d5} |
B3 |
{d5,d6} |
{d1,d3} |
B4 |
{d7} |
{d2} |
gen[B]和kill[B]是要作为已知量带入方程的。
1.明确到达-定义的数据流方程
与程序点(基本块)关联的数据流值是:变量定义(赋值语句)。
in[B]: 紧靠基本块B之前的有效定义的变量。
out[B]: 紧随基本块B之后的有效变量定义。
gen[B]: 在基本块B中,生产的新的变量定义。
kill[B]: 在基本块B中,被新的变量定义注销的变量定义。
2.到达-定义数据流方程的求解算法
输入:已经计算出每个基本块B的kill[B]和gen[B]的流图
输出:每个基本块B的in[B]和out[B]
步骤:算法框架如下
初始化:in[B]=∅, out[B]=gen[B]
保存旧out值:oldout = out[B];
更新out值:
isChange标记循环过程中out集合是否改变,如改变,再次进行迭代,直至out集合不再改变。
3.该例子中的计算示例
1)初始化
基本块 |
in[B] |
out[B] |
B1 |
∅ |
{d1,d2} |
B2 |
∅ |
{d3,d4} |
B3 |
∅ |
{d5,d6} |
B4 |
∅ |
{d7} |
2)第一次迭代
B1没有前驱;更新out[B1]={d1,d2}∪(∅-kill[B1])={d1,d2}
B2的前驱有B1和B4,
In[B2]=out[B1]∪out[B4]={d1,d2}∪{d7}={d1,d2,d7}
out[B2]={d3,d4}∪({d1,d2,d7}-{d5})={ d1,d2,d3,d4,d7}, isChange=true
B3的前驱是B2
In[B3]=out[B2]={ d1,d2,d3,d4,d7}
out[B3]={d5,d6}∪({ d1,d2,d3,d4,d7}-{d1,d3})={d2,d4,d5,d6,d7}
B4的前驱是B2和B3
In[B4]=out[B2]∪out[B3]={ d1,d2,d3,d4,d7}∪{d2,d4,d5,d6,d7}={d1,d2,d3,d4,d5,d6,d7}
out[B4]={d7}∪({d1,d2,d3,d4,d5,d6,d7}-{d2})={d1,d3,d4,d5,d6,d7}
基本块 |
in[B] |
out[B] |
B1 |
∅ |
{d1,d2} |
B2 |
{d1,d2,d7} |
{ d1,d2,d3,d4,d7} |
B3 |
{ d1,d2,d3,d4,d7} |
{d2,d4,d5,d6,d7} |
B4 |
{d1,d2,d3,d4,d5,d6,d7} |
{d1,d3,d4,d5,d6,d7} |
3)第二次迭代
B1没有前驱;更新out[B1]={d1,d2}∪(∅-kill[B1])={d1,d2}
B2的前驱有B1和B4,
In[B2]=out[B1]∪out[B4]={d1,d2}∪{d1,d3,d4,d5,d6,d7}={d1,d2,d3,d4,d5,d6,d7}
out[B2]={d3,d4}∪({d1,d2,d3,d4,d5,d6,d7}-{d5})={d1,d2,d3,d4,d6,d7}, isChange=true
B3的前驱是B2
In[B3]=out[B2]={d1,d2,d3,d4,d6,d7}
out[B3]={d5,d6}∪({d1,d2,d3,d4,d6,d7}-{d1,d3})={d2,d4,d5,d6,d7}
B4的前驱是B2和B3
In[B4]=out[B2]∪out[B3]={d1,d2,d3,d4,d5,d6,d7}
out[B4]={d7}∪({d1,d2,d3,d4,d5,d6,d7}-{d2})={d1,d3,d4,d5,d6,d7}
基本块 |
in[B] |
out[B] |
B1 |
∅ |
{d1,d2} |
B2 |
{d1,d2,d3,d4,d5,d6,d7} |
{d1,d2,d3,d4,d6,d7} |
B3 |
{d1,d2,d3,d4,d6,d7} |
{d2,d4,d5,d6,d7} |
B4 |
{d1,d2,d3,d4,d5,d6,d7} |
{d1,d3,d4,d5,d6,d7} |
第四次迭代
B1没有前驱;更新out[B1]={d1,d2}∪(∅-kill[B1])={d1,d2}
B2的前驱有B1和B4,
In[B2]=out[B1]∪out[B4]={d1,d2}∪{d1,d3,d4,d5,d6,d7}={d1,d2,d3,d4,d5,d6,d7}
out[B2]={d3,d4}∪({d1,d2,d3,d4,d5,d6,d7}-{d5})={d1,d2,d3,d4,d6,d7}
B3的前驱是B2
In[B3]=out[B2]={d1,d2,d3,d4,d6,d7}
out[B3]={d5,d6}∪({d1,d2,d3,d4,d6,d7}-{d1,d3})={d2,d4,d5,d6,d7}
B4的前驱是B2和B3
In[B4]=out[B2]∪out[B3]={d1,d2,d3,d4,d5,d6,d7}
out[B4]={d7}∪({d1,d2,d3,d4,d5,d6,d7}-{d2})={d1,d3,d4,d5,d6,d7}
基本块 |
in[B] |
out[B] |
B1 |
∅ |
{d1,d2} |
B2 |
{d1,d2,d3,d4,d5,d6,d7} |
{d1,d2,d3,d4,d6,d7} |
B3 |
{d1,d2,d3,d4,d6,d7} |
{d2,d4,d5,d6,d7} |
B4 |
{d1,d2,d3,d4,d5,d6,d7} |
{d1,d3,d4,d5,d6,d7} |
out[B]集合不再改变
终止.
迭代次数不会超过基本块的次数,此题中为4.