Loaded cached credentials. 承知いたしました。LoopSignal IRの技術レビューと実装計画について、ご指定のファイルを基に分析し、提案をまとめます。 --- ### LoopSignal IR: 技術レビューと実装計画 v1 #### 1. 仕様の確定案 ##### 1.1. `LoopSignal` 型の正格仕様 `LoopSignal` は、ループ内の制御フローを統一的に表現するための型であり、タグとオプションのペイロードで構成される。 * **型定義 (Rust風):** ```rust enum LoopSignal { Continue(T), // ループ継続 (ループ変数の更新値を運ぶ) Break(T), // ループ脱出 (ループの戻り値を運ぶ) Return(T), // 関数からのリターン (関数の戻り値を運ぶ) Yield(T), // ジェネレータのyield (yieldする値を運ぶ) // Await(Future), // 将来的な拡張: 非同期処理の中断 } ``` * **タグ値:** * `0`: Continue * `1`: Break * `2`: Return * `3`: Yield * **ABI/LLVM表現例:** ゼロコスト抽象を目指し、`Continue` が最も頻繁に発生することを前提に最適化する。LLVM IRでは、戻り値を `struct` で表現するのが一般的。 ```llvm ; LoopSignal の表現例 ; %Value はペイロードの型 (e.g., i64, %MyObject*) %LoopSignal = type { i8, %Value } ; { tag, payload } ; ゼロコスト表現の検討 ; 関数の戻り値として LoopSignal を直接返すのではなく、 ; ループ本体の関数はペイロードの値だけを返し、 ; シグナル自体は別の方法(例:ステータス引数への書き込み、複数のリターンブロック)で伝える。 ; しかし、LLVMの最適化能力を信じ、まずは上記のシンプルなstruct表現で実装し、 ; パフォーマンスが問題になる箇所で特殊化するのが現実的。 ; 多くの `Continue` はループ内で処理され、関数境界を越えないため、 ; レジスタ割り当てによりオーバーヘッドはほぼゼロになることが期待される。 ``` **ゼロコスト表現の可否:** **可能**である。ループが関数境界をまたがない限り、`LoopSignal` は物理的なメモリ確保を伴わず、仮想レジスタと条件分岐にコンパイルされる。`loop.branch` が `switch` 命令に変換され、`Continue` のケースが他のケースより優先的に配置(`default` 分岐など)されることで、最も高速なパスとなる。 ##### 1.2. MIR命令の厳密な意味論 * `loop.begin