summaryrefslogtreecommitdiff
path: root/chapter25
diff options
context:
space:
mode:
Diffstat (limited to 'chapter25')
-rw-r--r--chapter25/README.ja.md35
-rw-r--r--chapter25/README.md13
2 files changed, 19 insertions, 29 deletions
diff --git a/chapter25/README.ja.md b/chapter25/README.ja.md
index b2ef41fb..4feaee93 100644
--- a/chapter25/README.ja.md
+++ b/chapter25/README.ja.md
@@ -9,7 +9,7 @@
この章では Simple のソースファイルを再利用可能なオブジェクトファイルへコンパイルし、その型と理想 IR を後のコンパイルに読み込み、別に構築したシステムライブラリとネイティブプログラムをリンクします。また、不完全な情報を扱うため、パーサー、型、メモリ SSA を大幅に再設計します。
-これらが現在のスナップショットの内容です。独立した正しさの修正を先に以前の章へ移します。大きな SSA 再設計を以前へ移すことや、この章の分割は延期します。[バックポート待ち一覧](../docs/chapter-backports.md) を参照してください。
+この番号付きスナップショットは比較用に残しています。章の分割は進行中で、型未確定時の SSA 構築、オブジェクトの構築、エスケープ解析、モジュールを名前付きの章に分けました。[分割計画](../docs/chapter-split.md) と [バックポート待ち一覧](../docs/chapter-backports.md) を参照してください。
第21〜24章のメモリ処理はここにも引き継ぎます。Load 検索は読み取りをループ外へ移す前にマージの全枝を証明し、Phi の因数分解はメモリ破壊を確認し、スケジューリングはメモリ集合体を通じてエイリアスをたどります。検索は `EscapeNode` から非公開または公開メモリへ進み、未解決の Store エイリアスを待ちます。配列長の読み取りには要素の境界検査がなく、配列要素の読み取りは制御を保持します。整数値の Phi は、既存の型付き変換機構で、ループの拡大を通じてもロード幅を保持します。New は引き続き非公開のコンストラクタメモリを生成し、公開は Escape が扱います。以前の章の割り当て入力設計は、これを置き換えません。
@@ -23,7 +23,7 @@
各単位は Start/Stop ノードを持ちます。関数がコンパイル単位に所有されることと、未知の外部呼び出し側を表す辺とは別です。出力のためにコードを保持することが、任意の呼び出し側から到達できることを意味してはいけません。
-ドライバは、プロジェクトルートの `--root`、出力の `-o`、外部 Simple オブジェクト検索パスの `-L` を受け付けます。検索パスにはオブジェクトファイルやディレクトリを指定できます。コンパイラはネイティブリンク用の外部 C シンボルも解決します。`_` で始まる名前は非公開性を制御し、公開到達性は外側の名前にも依存します。
+ドライバは入力パスからプロジェクトルートを推定し、出力の `-o` と外部 Simple オブジェクト検索パスの `-L` を受け付けます。検索パスにはオブジェクトファイルやディレクトリを指定できます。ヘルプには `--root` もありますが、この番号付きスナップショットでは未実装です。名前付きのモジュール章では使用できます。コンパイラはネイティブリンク用の外部 C シンボルも解決します。`_` で始まる名前と外側の名前は、未知の呼び出し元に公開するインターフェースを決めます。
明示的な数値型の C 宣言は、可変のネイティブ記憶領域へ直接束縛します。
@@ -98,26 +98,13 @@ return new Box(new i64[1]);
第21章の隣接コピー転送も引き継ぎます。次の命令だけで使うコピーは、オペランドがコピー元レジスタを受け入れ、命令の結果に結び付けられていなければ除去します。
-以下は、必須の `cs` フィールドに明示的なコンストラクタを与えて保存済み String ソース3件を修正した後の、完全な2026-10-02再実行です。過去の212項目すべてが成功します。これはフィクスチャ調整と最近のコンパイラ修正後の新たな基準値を確立します。以前の監査との割り当て器だけの比較ではありません。
+現在の比較は、固定したテスト群を行、コンパイラの章を列にした
+[英語版の測定表](README.md#regalloc-improvements-live-range-area-and-split-cost) を参照してください。
+各セルは ARM/RISC-V の実行命令数、そのうち割り当て器が生成したコピーなどの命令数、
+x86 のループ重み付き移動数を示します。これらは異なる指標です。
+対象、入力、除外項目は [測定方法](../docs/regalloc-spills.md) にあります。
+古い測定群の集計値と混ぜて比較しないでください。
-`make spill-stats` を実行してください。各行は **第25章のコンパイラ** を使います。最初の5行は以前の212のプログラム/対象項目を、この章の構文とライブラリ構成に適応して保持しています。[フィクスチャノート](src/test/java/com/seaofnodes/simple/spill/README.ja.md) にその調整と測定の制限を記載しています。最適化器のシードは123です。最後の行には、既存シードで記録した `Chapter25Test` の13割り当てと、ドライバのシード456での新規システムライブラリコンパイルを含みます。`sys.o` を再利用して、この大きな処理対象を測定から消してはいけません。この結果は Windows x86-64 のものです。以前の群には RISC-V/ARM SystemV と x86 SystemV も含みます。報告器は対象ごとの合計も表示します。
-
-| プログラム群 | コンパイル数 | 分割/移動数 | ループ重み付き数 |
-|---|---:|---:|---:|
-| 第20章 | 39 | 375 | 606 |
-| 第21章 | 52 | 479 | 1,172 |
-| 第22章 | 24 | 103 | 103 |
-| 第23章 | 30 | 129 | 353 |
-| 第24章 | 67 | 696 | 1,410 |
-| 第25章 | 14 | 786 | 1,815 |
-| **合計** | **226** | **2,568** | **5,459** |
-
-`_spills` はレジスタ間移動を含む残存 SplitNode を数え、`_spillScaled` はループ重みを適用します。どちらもメモリアクセスだけを測るものではありません。古い群はレジスタ合法性確認を伴う割り当ての再実行で、ネイティブハーネスの再実行ではありません。`Chapter25Test` の23テストすべてが、ネイティブ/結果確認を含め、スピル期待値の失敗なしに成功します。継承したエミュレータテストを含む章全体には `make -j 4 tests` を使ってください。
-
-### 測定についてのコメント
-
-以前の割り当て器監査では、一様な改善は見つかりませんでした。そのコンパイラのほかの部分を変えず、第24章の順位付けに置き換えると、221のクライアントコンパイルで5移動減りました(2,211/4,724に対し2,206/4,719)。しかしシステムライブラリを8ラウンド以内に割り当てられませんでした。したがって不完全な比較であり、有効なスイート全体の低い合計ではありません。既存の面積/コスト順位付けを保持し、ラウンド上限と正しさの確認も変えません。その監査でシステムライブラリ自体は386移動/855重み付き移動で、現在の再実行は373/828です。
-
-複数使用を持つすべての複製可能定数を優先する試行は、それらのクライアントで以前の順位付けより1移動減りましたが、やはり新規ライブラリビルドに失敗し、却下されました。これが、集計統計と完全なコンパイル・実行確認の両方が重要な理由です。有利な小計だけでは変更を正当化できません。
-
-その以前の監査では、過去の群の合計が第24章の1,332/2,956から、第25章の1,814/3,753へ増えました。第25章はクラス初期化子、モジュール所有権、異なる脱出解析、構文/ライブラリの調整を追加します。これらは異なるマシングラフなので、増加を割り当て器の品質だけに帰することはできません。章の表から結論を出す前に、1つのコンパイラと固定した入力集合でヒューリスティックを比較してください。
+クラス初期化、インライン化、エスケープ解析、ライブラリの変更もグラフを変えます。
+章をまたぐ差を割り当て器だけの品質差と解釈せず、同じ入力とコンパイラで
+ヒューリスティックを比較してください。
diff --git a/chapter25/README.md b/chapter25/README.md
index bbe0c50e..d6ab5666 100644
--- a/chapter25/README.md
+++ b/chapter25/README.md
@@ -27,10 +27,13 @@ Each unit has Start/Stop nodes. A function's ownership by a compilation unit is
distinct from an edge representing unknown external callers: retaining code
for emission must not imply that arbitrary callers can reach it.
-The driver accepts `--root` for the project root, `-o` for output, and `-L` for
-external Simple object search paths, including an object file or a directory.
+The driver infers the project root from the input path and accepts `-o` for
+output and `-L` for external Simple object search paths, including an object
+file or a directory. Its help advertises `--root`, but this numbered snapshot
+does not yet parse that option; the named modules snapshot does.
The compiler also resolves external C symbols for native linking. Names beginning
-with `_` control privacy; public reachability depends on enclosing names too.
+with `_` control the public interface; enclosing names also affect which
+entries are exposed to unknown callers.
Explicit numeric C declarations bind directly to mutable native storage:
@@ -255,10 +258,10 @@ metric; see the [measurement details](../docs/regalloc-spills.md) for coverage.
<!-- spill-matrix:end -->
-Chapter25 introduces several features, which when run on the older tests
+Chapter 25 introduces several features, which when run on the older tests
generate a lot more code, which in turn generates more spills.
Class initialization, inlining, escape analysis, and library adaptations
all change the graphs. To help with this, we adjust the inlining
-heursitics to try and get all the boilerplate to inline and optimize.
+heuristics to try to inline and optimize the boilerplate.