ポインタ解析 • • • • 中田育男著 コンパイラの構成と最適化 朝倉書店, 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)
© Copyright 2024 ExpyDoc