定義に到達する問題は、データ フロー分析における最も基本的な問題の 1 つです。変数の定義と用途を含む制御フロー グラフが与えられた場合、問題は、どの変数定義が特定の用途に達するかを計算することになります。
たとえば、フロー グラフを考えてみましょう。
____________
1:| x <- ... |
------------
| \
| __________
| 2:| x <- ... |
| -----------
| /
____________
3:| ... <- x |
------------
ブロック 3 での変数 x の使用は、ブロック 1 またはブロック 2 のいずれかの定義から到達できます。
どの定義が用途に達するかを計算するアルゴリズムは、古典的なデータ フローの問題です。ドラゴン コンパイラの本 (新版) の表記法を使用すると、定義に到達するデータ フローの問題は次のようになります。
ドメイン : 定義のセット (例: {x <- .., ...})
方向 : 順方向
伝達関数 : fb(x) = gen(B) U (x - kill(B)) ここで、gen(B) はブロック B が生成する一連の定義と kill(B) ブロック B が削除する一連の定義
Boundary : OUT[ENTRY] = {} つまり、関数へのエントリのための定義フローはありません
演算子に適合します: U(union)、つまり定義ブロックへのフローは、先行ブロックからの定義の結合です。
式 : OUT[B] = fb(IN[B]), IN[B] = U(P in pred)OUT[P]
初期化: OUT[B] = {}
ただし、すべての定義が同じというわけではありません。たとえば、ブロック 1 の定義は、ブロック 2 の定義によって殺される可能性があるため、ブロック 3 の使用に決して到達しない可能性があります。一方、ブロック 2 の定義は、実行された場合、ブロックで使用されるまでその値を保持します。 3.
定義から使用法へのどのパスにも強制終了定義がない使用法の到達定義を見つけたいです。私の質問は、同様のデータフローの問題が存在するかどうかです(おそらく伝播など)。データフロー分析の観点からどのように解決できるか。
この問題に対する解決策は 1 つ考えられますが、解決策が既に存在する場合、車輪の再発明はしたくありません。