phase15: implement Phase S root treatment for break control flow
🔧 **Phase S (Immediate Stabilization) Implementation** - Create control flow utilities module (src/mir/utils/) - Refactor loop_builder.rs duplicated code to utilities - Fix PHI incoming predecessor capture per ChatGPT Pro analysis 📊 **AI Collaborative Analysis Complete** - Task agent: Root cause identification - Gemini: Strategic 3-phase approach - codex: Advanced type inference solution (archived) - ChatGPT Pro: Definitive staged treatment strategy 🗂️ **Documentation & Archive** - Strategy document: docs/development/strategies/break-control-flow-strategy.md - codex solutions: archive/codex-solutions/ (100+ lines changes) - Update CLAUDE.md with 2025-09-23 progress ⚡ **Expected Impact** - Resolve collect_prints null return issue - Eliminate code duplication (4 locations unified) - Foundation for Phase M (PHI unification) and Phase L (BuildOutcome) 🎯 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
168
docs/development/strategies/break-control-flow-strategy.md
Normal file
168
docs/development/strategies/break-control-flow-strategy.md
Normal file
@ -0,0 +1,168 @@
|
||||
# Break制御フロー問題 - 根本解決戦略
|
||||
|
||||
**問題**: break文がvoid値を返し、メソッドの正常なreturn値を阻害する
|
||||
**影響**: collect_printsメソッドでnull値が返される問題
|
||||
|
||||
## 🎯 ChatGPT Pro最強モード分析結果
|
||||
|
||||
### **TL;DR(戦略概要)**
|
||||
|
||||
* **短期(フェーズS)**: ブロック終端の厳密検出 + PHI生成時の実到達ブロック捕捉(案A徹底)
|
||||
* **中期(フェーズM)**: MIRをPHI前提で一本化、no_phi_mode撤廃でコード大幅削減
|
||||
* **長期(フェーズL)**: build_statementの返り値をBuildOutcomeに根本修正(案B強化版)
|
||||
|
||||
## 📊 現在の実装分析
|
||||
|
||||
### 1. break/continue処理の問題点
|
||||
- **現状**: Jump発行後、新規ブロックに切替え、`Const(Void)`を合成して返す
|
||||
- **問題**: PHI incomingで「入口ブロック」vs「実到達ブロック」のズレ
|
||||
- **結果**: 早すぎるコピーが走り、古い値が選ばれる
|
||||
|
||||
### 2. PHI実装の現状
|
||||
- **良い点**: if/else、loopは既にPHI前提の設計
|
||||
- **問題点**: no_phi_mode分岐が残存し、複雑性を増している
|
||||
- **方向性**: PHI一本化が現実的
|
||||
|
||||
## 🚀 段階的実装プラン
|
||||
|
||||
### **フェーズS: 即効の止血(1〜2コミット)**
|
||||
|
||||
**優先度**: 🔥 最高(Phase 15ブロック解除)
|
||||
|
||||
#### 1. PHI incoming predecessor修正
|
||||
```rust
|
||||
// 修正前(問題あり)
|
||||
let then_bb = self.new_block();
|
||||
self.emit_branch(cond_val, then_bb, else_bb)?;
|
||||
// ... then処理 ...
|
||||
self.emit_jump(merge_bb)?;
|
||||
incomings.push((then_bb, then_val)); // ← 入口ブロック(間違い)
|
||||
|
||||
// 修正後(正しい)
|
||||
let then_bb = self.new_block();
|
||||
self.emit_branch(cond_val, then_bb, else_bb)?;
|
||||
// ... then処理 ...
|
||||
let cur_id = self.current_block()?; // ← 実到達ブロック捕捉
|
||||
if need_jump {
|
||||
self.emit_jump(merge_bb)?;
|
||||
incomings.push((cur_id, then_val)); // ← 実到達ブロック(正しい)
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 終端ガード徹底
|
||||
```rust
|
||||
for statement in statements {
|
||||
last_value = Some(self.build_expression(statement)?);
|
||||
if self.is_current_block_terminated() {
|
||||
break; // ← これを全箇所で徹底
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. break/continue後のincoming除外
|
||||
```rust
|
||||
// break/continue後は到達不能なのでincomingに含めない
|
||||
if terminated_by_break_or_continue {
|
||||
// incoming作成をスキップ
|
||||
}
|
||||
```
|
||||
|
||||
### **フェーズM: PHI一本化(中期・数週間)**
|
||||
|
||||
**優先度**: ⭐⭐⭐ 高(80k→20k圧縮貢献)
|
||||
|
||||
#### 1. no_phi_mode分岐撤廃
|
||||
- `if self.no_phi_mode`分岐を全削除
|
||||
- edge_copy関連コードを削除
|
||||
- **期待削減**: 数百行規模
|
||||
|
||||
#### 2. Builder API軽ダイエット
|
||||
- build_blockの終端処理統一
|
||||
- build_statement呼び出しに寄せる
|
||||
- 「式と文の下ろし先混在」を減らす
|
||||
|
||||
### **フェーズL: 根本解決(後期・Phase 15後半)**
|
||||
|
||||
**優先度**: ⭐⭐ 中(設計完成)
|
||||
|
||||
#### BuildOutcome導入
|
||||
```rust
|
||||
struct BuildOutcome {
|
||||
value: Option<ValueId>,
|
||||
terminated: bool,
|
||||
term: Option<TerminatorKind>, // Return/Jump/Branch等
|
||||
}
|
||||
|
||||
// 段階的移行
|
||||
impl MirBuilder {
|
||||
fn build_statement_new(&mut self, stmt: ASTNode) -> Result<BuildOutcome, String> {
|
||||
// 新実装
|
||||
}
|
||||
|
||||
fn build_statement(&mut self, stmt: ASTNode) -> Result<ValueId, String> {
|
||||
// 既存API互換(アダプタ)
|
||||
let outcome = self.build_statement_new(stmt)?;
|
||||
outcome.value.unwrap_or_else(|| {
|
||||
let void_id = self.new_value();
|
||||
self.emit_const(void_id, ConstValue::Void).unwrap();
|
||||
void_id
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📈 効果試算
|
||||
|
||||
### コード削減効果
|
||||
- **no_phi_mode撤廃**: 数百行削除
|
||||
- **if/loop PHI正規化**: 条件分岐20-30%削減
|
||||
- **Builder API統一**: 重複処理削除
|
||||
|
||||
### Phase 15への貢献
|
||||
- **80k→20k圧縮**: 大きく貢献(数%単位)
|
||||
- **安定性向上**: 分岐地獄解消でバグ減少
|
||||
- **保守性向上**: 設計がクリーンに
|
||||
|
||||
## 🛡️ リスク対策
|
||||
|
||||
### 短期リスク
|
||||
- **既存コード互換性**: フェーズSは挙動変更なし
|
||||
- **テスト回帰**: 最小再現ケースでユニットテスト追加
|
||||
|
||||
### 長期リスク
|
||||
- **API変更波及**: 段階的移行でコンパイル時制御
|
||||
- **variable_mapスナップショット**: continue順序問題への対策
|
||||
|
||||
## 🧪 検証計画
|
||||
|
||||
### フェーズS検証
|
||||
```bash
|
||||
# 最小再現テスト
|
||||
echo 'loop(true) { if(cond1) { if(cond2) { x=1 } else { x=2 } break } }' > test.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash test.nyash
|
||||
|
||||
# collect_prints修正確認
|
||||
NYASH_DISABLE_PLUGINS=1 NYASH_RESOLVE_FIX_BRACES=1 ./target/release/nyash apps/selfhost/vm/collect_empty_args_using_smoke.nyash
|
||||
```
|
||||
|
||||
### PHI検証
|
||||
- predecessor⇔CFG一致チェック
|
||||
- break/continue後の未定義値検出
|
||||
|
||||
## 🎯 次のアクション
|
||||
|
||||
1. **即座実行**: フェーズS修正(loop_builder.rs重点)
|
||||
2. **ユニットテスト**: 最小再現ケース追加
|
||||
3. **ベンチマーク**: 修正効果の定量評価
|
||||
|
||||
## 📚 関連する解決策
|
||||
|
||||
### AI各種のアプローチ比較
|
||||
- **task先生**: 根本原因分析(完璧)
|
||||
- **Gemini**: 短期案A + 長期案B戦略
|
||||
- **codex**: 実装重視の型推論強化(高度だがビルド失敗)
|
||||
- **ChatGPT Pro**: 段階的戦略(最も現実的)
|
||||
|
||||
### 推奨採用方針
|
||||
**フェーズS(ChatGPT Pro戦略)を最優先で実行**
|
||||
理由: Phase 15セルフホスティング完了への最短経路
|
||||
Reference in New Issue
Block a user