diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-19 14:56:14 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-19 14:56:14 -0700 |
| commit | 7edca9823ec8ef0aed10c88fa07ef969792aab77 (patch) | |
| tree | d95e308cac7a9c5039a59be636d881982a9b4878 /chapter-interprocedural-sccp/README.ja.md | |
| parent | 3617495d8efbcce23bbc9f1754c7d27d34d30a52 (diff) | |
| download | Simple-7edca9823ec8ef0aed10c88fa07ef969792aab77.tar.gz Simple-7edca9823ec8ef0aed10c88fa07ef969792aab77.zip | |
Split from ch25, SCCP and interprocedural SCCPmain
Diffstat (limited to 'chapter-interprocedural-sccp/README.ja.md')
| -rw-r--r-- | chapter-interprocedural-sccp/README.ja.md | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/chapter-interprocedural-sccp/README.ja.md b/chapter-interprocedural-sccp/README.ja.md new file mode 100644 index 00000000..21a5a381 --- /dev/null +++ b/chapter-interprocedural-sccp/README.ja.md @@ -0,0 +1,33 @@ +# 関数間の SCCP + +[English](README.md) | 日本語 + +[前: 関数内の SCCP](../chapter-sccp/README.ja.md) | +[章の分割案](../docs/chapter-split.md) + +前の章では関数ごとに保守的な呼び出し境界で解析しました。この章では +呼び出し辺を発見しながら、同じワークリストで関数間の値を伝播します。 +最新の説明と検証方法は [英語版](README.md) を参照してください。 + +## 呼び出しグラフの発見 + +**Simple** では、ここでもほぼ何もせず、SCCP を手続き間で実行します。`CallNode` は `FunNode` を呼び、`ReturnNode` は `CallEndNode` に戻り、まったく通常の方法で型情報を渡します。ただし問題が1つあります。`Call` と `Fun`、および `Return` と `CallEnd` の間に辺がありません。そのような辺が [呼び出しグラフ](https://en.wikipedia.org/wiki/Call_graph) を構成します。 + +通常の SCCP を拡張し、`Call` の関数ポインタ入力が変わり、新しい関数対象を得る時点を監視します。対象の数は有限なので、前の章で説明した *関数インデックス* で正確に表します。分割コンパイルでは、このコンパイル単位の外で呼ばれる無限の未知関数に対して、特別なインデックスを追加します。 + +`Call` で新しい *fidx* を見つけたら、`Call` と `Fun`、`Return` と `CallEnd` を *リンク* します。このリンクは、`Call` から `Fun`、そして `Call` の引数から `Fun` の `ParmNode` へ CFG 辺を追加したかのように動きます。`FunNode` は `RegionNode` を、`ParmNode` は `PhiNode` を拡張するため、同じ意味規則を使います。`Fun` は呼ばれると到達可能になり、`Parm` はすべての呼び出し引数をマージ(*meet*)します。同様に `CallEnd` は、すべての `Return` の *meet* を計算して、呼ばれたすべての関数の結果をマージします。 + +この *リンク* 段階はアルゴリズムの内部ループにいくつかの検査を加え、正確な呼び出しグラフも構築し、SCCP の手続き間実行を可能にします。進行中に新しい辺を少し発見する以外は、中核アルゴリズムは変わりません。不動点解で停止することが保証され、たとえば特定の呼び出しパラメータが、すべての呼び出し経路で定数、あるいは非 null と発見できることがあります。 + +## 再帰もループ + +再帰には、Parm を通る引数の循環と、Return → CallEnd → 演算 → Phi → Return +という戻り値の循環があります。後者は Parm を通りません。ループの Phi に +加えて Parm と CallEnd にも整数範囲の拡大が必要です。 + +関数アドレスが直接呼び出し以外で使われる場合は、未知の呼び出し元を残します。 +メモリを通した公開範囲の解析は後の章で導入します。 + +このディレクトリで最初に `make lib`、続いて `make tests` を実行してください。 +リポジトリのルートでは +`make tests CHAPTERS=chapter-interprocedural-sccp` を使えます。 |
