到达-定义分析,以一个问题为例

下图中,可以到达基本块B3的入口处的定值集合是   

到达-定义分析,以一个问题为例_第1张图片

 

  1. 计算gen[B]和kill[B]

基本块

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.明确到达-定义的数据流方程

 

与程序点(基本块)关联的数据流值是:变量定义(赋值语句)。

out[B]=gen[B]\cup (in[B]-kill[B])

in[B]=\bigcup \limits_{P}out[P],P是B的前驱

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]

 

更新in: in[B]=\bigcup \limits_{P}out[P],P是B的前驱

保存旧out值:oldout = out[B];

更新out值:out[B]=gen[B]\cup (in[B]-kill[B])

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.

你可能感兴趣的:(编译原理,到达-定义,例题)