feat(llvm/phi): Phase 277 P1 - fail-fast validation for PHI strict mode
## Summary Implemented fail-fast validation for PHI ordering and value resolution in strict mode. ## Changes ### P1-1: Strict mode for "PHI after terminator" - File: `src/llvm_py/phi_wiring/wiring.py::ensure_phi` - Behavior: `NYASH_LLVM_PHI_STRICT=1` → RuntimeError if PHI created after terminator - Default: Warning only (no regression) ### P1-2: Strict mode for "fallback 0" - File: `src/llvm_py/phi_wiring/wiring.py::wire_incomings` - Behavior: Strict mode forbids silent fallback to 0 (2 locations) - Location 1: Unresolvable incoming value - Location 2: Type coercion failure - Error messages point to next debug file: `llvm_builder.py::_value_at_end_i64` ### P1-3: Connect verify_phi_ordering() to execution path - File: `src/llvm_py/builders/function_lower.py` - Behavior: Verify PHI ordering after all instructions emitted - Debug mode: Shows "✅ All N blocks have correct PHI ordering" - Strict mode: Raises RuntimeError with block list if violations found ## Testing ✅ Test 1: strict=OFF - passes without errors ✅ Test 2: strict=ON - passes without errors (no violations in test fixtures) ✅ Test 3: debug mode - verify_phi_ordering() connected and running ## Scope - LLVM harness (Python) changes only - No new environment variables (uses existing 3 from Phase 277 P2) - No JoinIR/Rust changes (root fix is Phase 279) - Default behavior unchanged (strict mode opt-in) ## Next Steps - Phase 278: Remove deprecated env var support - Phase 279: Root fix - unify "2本のコンパイラ" pipelines 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -8,21 +8,63 @@ Related:
|
||||
|
||||
## 直近(JoinIR/selfhost)
|
||||
|
||||
- **Phase 277 P0/P1(planned, docs+validation): PHI型推論ドキュメント整備 + PHI順序検証強化**
|
||||
- 入口: `docs/development/current/main/phases/phase-277/README.md`
|
||||
- 目的:
|
||||
- Phase 275/276 で入った PHI 型推論の “導線/責務/SSOT” を docs に固定する
|
||||
- PHI 配置順序(PHI → non-PHI → terminator)違反を fail-fast で検出しやすくする
|
||||
|
||||
- **Phase 278(planned, cleanup): PHI旧環境変数の後方互換性削除**
|
||||
- 目的: Phase 277 P2 で deprecated 扱いにした旧 env var を削除し、1セットに収束させる
|
||||
- 入口: `docs/development/current/main/phases/phase-278/README.md`
|
||||
- 実装ガイド: `docs/development/current/main/phases/phase-278/P0-INSTRUCTIONS.md`
|
||||
|
||||
- **Phase 279(planned, impl): Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消)**
|
||||
- 目的: 型伝播(Copy/BinOp/PHI/Compare など)の “順序/入口” を 1 本に固定し、経路差による二重バグを根絶する
|
||||
- 入口: `docs/development/current/main/phases/phase-279/README.md`
|
||||
- 実装ガイド: `docs/development/current/main/phases/phase-279/P0-INSTRUCTIONS.md`
|
||||
|
||||
- **Phase 272(✅ complete): Pattern6/7 を Frag+emit_frag へ吸収(段階適用)**
|
||||
- 目的: scan系 loop の CFG 構築を `Frag/ExitKind` 合成へ寄せ、pattern列挙の増殖を止める
|
||||
- 完了: P0.1(Pattern6)✅ + P0.2(Pattern7)✅
|
||||
- 入口: fixture/smoke を SSOT として固定(Pattern6→Pattern7 の順で段階適用)
|
||||
- 詳細: `phases/phase-272/README.md`
|
||||
|
||||
- **Phase 273(planned, design-first): Pattern → Plan Extractor(pure)→ PlanLowerer で収束**
|
||||
- 目的: pattern の裾広がりを止め、`Plan → Frag → emit_frag()` の本線へ一本化する(terminator SSOT は維持)
|
||||
- 相談メモ: `docs/development/current/main/investigations/phase-272-frag-plan-architecture-consult.md`
|
||||
- 受け入れ(最小):
|
||||
- extractor が builder を触らない(ID採番/PHI挿入禁止)
|
||||
- Plan 語彙を固定(`seq/if/loop/exit/effect/let`)
|
||||
- PlanLowerer が block/value/phi を作る唯一の箱になる
|
||||
|
||||
|
||||
- **Phase 274(active, design-first): Type SSOT Alignment(local + dynamic runtime)**
|
||||
- 入口SSOT: `docs/reference/language/types.md`
|
||||
- P1(✅完了): Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く)
|
||||
- P2(✅完了): LLVM ライン(llvmlite harness)の `TypeOp` を SSOT に合わせる
|
||||
- P3(decision): truthiness / equality / compare / `+` の coercion を SSOT として固定(必要なら “仕様変更フェーズ” を追加)
|
||||
- 詳細: `phases/phase-274/README.md`
|
||||
|
||||
- **Phase 270(✅ 完了): JoinIR-only minimal loop SSOT**
|
||||
- `apps/tests/phase270_p0_loop_min_const.hako` + VM smoke で “最小 const loop” を固定(exit=3)
|
||||
- Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加
|
||||
- 詳細: `phases/phase-270/README.md`
|
||||
|
||||
- **Phase 271(planned, docs-only): Bridge pattern 撤去条件SSOT**
|
||||
- **Phase 271(✅ 完了, docs-only): Bridge pattern 撤去条件SSOT**
|
||||
- 対象: bridge pattern(例: `Pattern9_AccumConstLoop`)
|
||||
- 目的: 「汎用化しない」「Frag 合成へ吸収して削除する」を SSOT 化
|
||||
- 成果物:
|
||||
- `docs/development/current/main/design/edgecfg-fragments.md` の `Bridge patterns(撤去条件SSOT)` に “bridge contract” テンプレを追加
|
||||
- `Pattern9_AccumConstLoop` の撤去条件(fixture/smoke/手順)を同セクションに明文化
|
||||
- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
|
||||
- **Phase 269 P1(in progress): Pattern8 を EdgeCFG で実装(SSA を閉じる)**
|
||||
- **Phase 269 P1(✅ 完了): Pattern8 を EdgeCFG で実装(SSA を閉じる)**
|
||||
- 方針: emission 入口で Frag 構築(break/continue 無しなので `compose::loop_()` は使わず手配線)
|
||||
- 残件: header に `i` の PHI を追加して SSA を閉じる(`i_current = phi [i_init, preheader], [i_next, step]`)
|
||||
- 完了: header に `i` の PHI を追加して SSA を閉じた(`i_current = phi [i_init, preheader], [i_next, step]`)
|
||||
- early-exit の `return false` は Return wire、`return true` は loop 後 AST に任せる
|
||||
- Pattern8 の返り値は当面 `void`(loop-statement 扱い)
|
||||
- 補足(DONE): static box の `this/me` は MethodCall 共通入口で static call に正規化済み(Pattern8 は現状 static box 文脈を対象外)
|
||||
- 詳細: `phases/phase-269/README.md`
|
||||
|
||||
- **Phase 270+(planned): Pattern6/7 への Frag 適用**
|
||||
|
||||
Reference in New Issue
Block a user