コンパイラ理論において、依存関係解析は文/命令間の実行順序制約を生成します。大まかに言えば、文S2は、 S1がS2より先に実行されなければならない場合にS1に依存します。依存関係には、制御依存関係とデータ依存関係の2種類があります。
依存関係分析は、ステートメントの順序を変更したり並列化したりすることが安全かどうかを判断する。
制御依存性とは、プログラムの命令が、前の命令が実行可能な形で評価された場合にのみ実行される状況のことである。
ステートメントS2はS1の制御に依存しています(記述)S2 の実行がS1によって条件付きで保護されている場合に限り、 S2はS1に制御依存している。どこ声明のポスト優位フロンティア以下に、そのような制御依存関係の例を示します。
S1 x > 2 の場合、L1 へ移動 S2 y := 3 S3 L1: z := y + 1
ここでは、S1の述語が偽の場合にのみS2が実行されます。
データ依存性は、同じリソースにアクセスまたは変更する2つのステートメントから生じます。
ステートメントS2はS1のフローに依存します(記述)S1 がS2が読み取るリソースを変更し、かつS1 がS2より先に実行される場合に限り、フロー依存性が発生します。以下はフロー依存性の例です (RAW: Read After Write):
S1 x := 10 S2 y := x + c
ステートメントS2はS1に反依存している(記述すると)S2がS1が読み取るリソースを変更し、かつS1がS2より先に実行される場合に限り、依存関係は成立します。以下は、アンチ依存関係(WAR:Write After Read)の例です。
S1 x := y + c S2 y := 10
ここで、S2 はの値を設定しますyが、S1 はの以前の値を読み取りますy。
ステートメントS2はS1の出力に依存します(記述)S1とS2が同じリソースを変更し、かつS1がS2より先に実行される場合に限り、出力依存関係(WAW:Write After Write)の例を以下に示します。
S1 x := 10 S2 x := 20
ここで、S2とS1は両方とも変数を設定しますx。
ステートメントS2はS1の入力に依存します(記述)S1とS2が同じリソースを読み込み、かつS1がS2より先に実行される場合に限り、この条件が満たされます。以下は入力依存関係(RAR:Read-After-Read)の例です。
S1 y := x + 3 S2 z := x + 5
ここでは、S2とS1の両方が変数にアクセスしますx。この依存関係は順序の変更を妨げません。
ループ内の依存関係を計算するという、重要かつ複雑な問題は、ここで提示する依存関係のフレームワークを拡張したループ依存性分析によって解決されます。