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:
2025-12-22 14:48:37 +09:00
parent 6e749b791e
commit 757193891f
74 changed files with 4178 additions and 575 deletions

View File

@ -8,21 +8,63 @@ Related:
## 直近JoinIR/selfhost
- **Phase 277 P0/P1planned, 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 278planned, 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 279planned, 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.1Pattern6✅ + P0.2Pattern7
- 入口: fixture/smoke を SSOT として固定Pattern6→Pattern7 の順で段階適用)
- 詳細: `phases/phase-272/README.md`
- **Phase 273planned, design-first: Pattern → Plan Extractorpure→ 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 274active, design-first: Type SSOT Alignmentlocal + dynamic runtime**
- 入口SSOT: `docs/reference/language/types.md`
- P1✅完了: Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く)
- P2✅完了: LLVM ラインllvmlite harness`TypeOp` を SSOT に合わせる
- P3decision: 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 のため不適合 → Pattern9AccumConstLoopを橋渡しとして追加
- 詳細: `phases/phase-270/README.md`
- **Phase 271planned, 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 P1in 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 適用**