Files
hakorune/src/mir/query.rs

166 lines
5.9 KiB
Rust
Raw Normal View History

feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
//! MirQuery - Read/Write/CFGビューを提供する共通窓口
//!
//! Box理論: MIR 全体の構造は MirQueryBox が保持し、他の箱ExitLiveness など)は
//! 「見せる窓」である MirQuery トレイト越しにしか触らないようにする。
//! これにより MIR 構造への依存を最小化し、テスタビリティと疎結合を保つ。
use crate::mir::{BasicBlockId, MirFunction, MirInstruction, ValueId};
/// MIR への読み取り専用ビュー
pub trait MirQuery {
/// ブロック内の命令列PHI を含む)を順序付きで返す
fn insts_in_block(&self, bb: BasicBlockId) -> &[MirInstruction];
/// ブロックの後続succsを決定的順序で返す
fn succs(&self, bb: BasicBlockId) -> Vec<BasicBlockId>;
/// 命令が読むuse するValueId のリスト
fn reads_of(&self, inst: &MirInstruction) -> Vec<ValueId>;
/// 命令が書くdef するValueId のリスト
fn writes_of(&self, inst: &MirInstruction) -> Vec<ValueId>;
}
/// MirQuery の標準実装MirFunction 全体を抱えつつビューを提供
pub struct MirQueryBox<'m> {
mir: &'m MirFunction,
}
impl<'m> MirQueryBox<'m> {
pub fn new(mir: &'m MirFunction) -> Self {
Self { mir }
}
}
impl<'m> MirQuery for MirQueryBox<'m> {
fn insts_in_block(&self, bb: BasicBlockId) -> &[MirInstruction] {
static EMPTY: &[MirInstruction] = &[];
self.mir
.blocks
.get(&bb)
.map(|bb| bb.instructions.as_slice())
.unwrap_or(EMPTY)
}
fn succs(&self, bb: BasicBlockId) -> Vec<BasicBlockId> {
let mut v: Vec<_> = self
.mir
.blocks
.get(&bb)
.map(|bb| bb.successors.iter().copied().collect())
.unwrap_or_else(Vec::new);
v.sort_by_key(|b| b.0);
v
}
fn reads_of(&self, inst: &MirInstruction) -> Vec<ValueId> {
use MirInstruction::*;
match inst {
Const { .. } | Nop => Vec::new(),
Copy { src, .. } => vec![*src],
UnaryOp { operand, .. } => vec![*operand],
BinOp { lhs, rhs, .. } | Compare { lhs, rhs, .. } => {
vec![*lhs, *rhs]
}
TypeOp { value, .. } | TypeCheck { value, .. } | Cast { value, .. } => {
vec![*value]
}
Load { ptr, .. } => vec![*ptr],
Store { ptr, value } => vec![*ptr, *value],
ArrayGet { array, index, .. } => vec![*array, *index],
ArraySet {
array,
index,
value,
..
} => vec![*array, *index, *value],
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
Call { args, .. }
| BoxCall { args, .. }
| PluginInvoke { args, .. }
| ExternCall { args, .. } => args.clone(),
Return { value } => value.iter().copied().collect(),
Branch { condition, .. } => vec![*condition],
Jump { .. } => Vec::new(),
Phi { inputs, .. } => inputs.iter().map(|(_, v)| *v).collect(),
NewBox { args, .. } => args.clone(),
Debug { value, .. } | Print { value, .. } => vec![*value],
DebugLog { values, .. } => values.clone(),
Throw { exception, .. } => vec![*exception],
Catch { .. } => Vec::new(),
NewClosure { captures, me, .. } => {
let mut v: Vec<ValueId> = captures.iter().map(|(_, v)| *v).collect();
if let Some(m) = me {
v.push(*m);
}
v
}
RefNew { box_val, .. } => vec![*box_val],
RefGet { reference, .. } => vec![*reference],
RefSet {
reference, value, ..
} => vec![*reference, *value],
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
WeakNew { box_val, .. } => vec![*box_val],
WeakLoad { weak_ref, .. } => vec![*weak_ref],
WeakRef { value, .. } => vec![*value],
BarrierRead { ptr } | BarrierWrite { ptr } | Barrier { ptr, .. } => {
vec![*ptr]
}
FutureNew { value, .. } => vec![*value],
FutureSet { future, value } => vec![*future, *value],
Await { future, .. } => vec![*future],
Safepoint => Vec::new(),
}
}
fn writes_of(&self, inst: &MirInstruction) -> Vec<ValueId> {
use MirInstruction::*;
match inst {
Const { dst, .. }
| UnaryOp { dst, .. }
| BinOp { dst, .. }
| Compare { dst, .. }
| TypeOp { dst, .. }
| Cast { dst, .. }
| Load { dst, .. }
| ArrayGet { dst, .. }
| Call { dst: Some(dst), .. }
| BoxCall { dst: Some(dst), .. }
| PluginInvoke { dst: Some(dst), .. }
| ExternCall { dst: Some(dst), .. }
| Phi { dst, .. }
| NewBox { dst, .. }
| RefNew { dst, .. }
| RefGet { dst, .. }
| WeakNew { dst, .. }
| WeakLoad { dst, .. }
| WeakRef { dst, .. }
| FutureNew { dst, .. }
| NewClosure { dst, .. }
| Await { dst, .. }
| Copy { dst, .. } => vec![*dst], // Copy writes to dst
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
// No writes
Nop
| Store { .. }
| ArraySet { .. }
| Call { dst: None, .. }
| BoxCall { dst: None, .. }
| PluginInvoke { dst: None, .. }
| ExternCall { dst: None, .. }
| Return { .. }
| Branch { .. }
| Jump { .. }
| Debug { .. }
| DebugLog { .. }
| Print { .. }
| Throw { .. }
| Catch { .. }
| BarrierRead { .. }
| BarrierWrite { .. }
| Barrier { .. }
| FutureSet { .. }
| Safepoint => Vec::new(),
_ => Vec::new(),
}
}
}