利用可能な式

ポインタ解析
•
•
•
•
中田育男著
コンパイラの構成と最適化
朝倉書店, 1999年
第12章第2節12
ポインタ解析
• 別名、別名解析
– 別名(alias)とは、形(名前や式)が違うものが
同じものを指していること。
– 実引数と仮引数
– ポインタ
int *p;
int n;
p = &n;
フロー解析のための代入文の制限
• ポインタ変数への代入文は次のようなもの
p = &a;
aが配列の場合は p = &a+c; も許され
る。
p = q+c;
p = q-c;
p = q;
p = null;
• **p という使い方は考えない。
フロー解析
• IN(B) = { (p,a) | ブロックBの入口で
ポインタ変数pが変数aを
指す可能性がある }
• OUT(B) = { (p,a) | ブロックBの出口で
ポインタ変数pが変数aを
指す可能性がある }
代入文Sによる変化
• Sが p = &a; または p = &a+c;
TS(A) = (A – {(p,b) | bは任意の変数})∪{(p,a)}
• Sが p = q + c; または p = q – c;
TS(A) = (A – {(p,b) | bは任意の変数})∪
{(p,a) | (q,a)∈Aでaは配列}
• Sが p = q;
TS(A) = (A – {(p,b) | bは任意の変数})∪
{(p,a) | (q,a)∈A}
• Sが p = null;
TS(A) = (A – {(p,b) | bは任意の変数})
• Sがポインタへの代入でないとき、 TS(A) = A
データフロー解析
• ブロックBが文S1、S2、…、Skからなるとき、
そのブロックによる変化TBは、
TB (A) = TSk(TSk-1(…(TS2(TS1(A)))…))
• データの流れの等式
OUT(B) = TB(IN(B))
IN(B) = ∪ OUT(P)
P∈pred(B)
例
{
B1: p = &r;
if (…)
B2:
q = p;
else
B3:
q = &s
B4: …;
B5: q = &t;
}
(p,r)
(p,r) (q,r)
(p,r) (q,s)
(p,r) (q,r) (q,s)
(p,r) (q,t)