Files
hakorune/docs/development/current/main/phases/phase-279/P0-COMPLETION.md
tomoaki f07c2e7874 feat(mir): Phase 279 P0 - Type propagation pipeline SSOT unification
Eliminate "2本のコンパイラ" problem by unifying type propagation into single SSOT entry.

SSOT implementation:
- src/mir/type_propagation/pipeline.rs - SSOT type propagation pipeline
- TypePropagationPipeline::run() - Single entry point for all routes

Pipeline steps (fixed order):
1. Copy propagation (initial)
2. BinOp re-propagation (numeric promotion: Int+Float→Float)
3. Copy propagation (propagate promoted types)
4. PHI type inference (private step - cannot bypass)

Callers (both routes now use SSOT):
- lifecycle.rs::finalize_module() - Builder lifecycle route
- joinir_function_converter.rs::propagate_types() - JoinIR bridge route

Fail-fast guard (structural guarantee):
- PHI type inference is private step inside TypePropagationPipeline
- lifecycle.rs and joinir_function_converter.rs cannot call PhiTypeResolver directly
- Only public API: TypePropagationPipeline::run()
- Order drift is structurally impossible (private encapsulation)

Code reduction:
- ~500 lines of duplicate BinOp re-propagation logic removed
- 2 implementations consolidated into 1 SSOT

Files changed:
- New: src/mir/type_propagation/mod.rs
- New: src/mir/type_propagation/pipeline.rs (~300 lines)
- Modified: src/mir/mod.rs
- Modified: src/mir/builder/lifecycle.rs (~400 lines removed)
- Modified: src/mir/join_ir_vm_bridge/joinir_function_converter.rs (~100 lines removed)

Regression testing:
 Lifecycle route (VM backend): Phase 275 fixture
 JoinIR route (VM backend): loop_min_while.hako
 LLVM harness: Phase 275 fixture

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 15:34:03 +09:00

2.8 KiB

Phase 279 P0: Type propagation pipeline SSOT unification — completion

Status: completed (2025-12-22)

Goal:

  • Eliminate "2本のコンパイラ" (two compilers) problem
  • Root fix for order drift where identical fixtures pass in one route but fail in another
  • Unify type propagation into single SSOT entry with fixed order

SSOT implementation:

  • src/mir/type_propagation/pipeline.rs - SSOT type propagation pipeline
  • TypePropagationPipeline::run() - Single entry point for all routes

Pipeline steps (fixed order):

  1. Copy propagation (initial)
  2. BinOp re-propagation (numeric promotion: Int+Float→Float)
  3. Copy propagation (propagate promoted types)
  4. PHI type inference (private step - cannot bypass)

Callers (both routes now use SSOT):

  • src/mir/builder/lifecycle.rs::finalize_module() - Builder lifecycle route
  • src/mir/join_ir_vm_bridge/joinir_function_converter.rs::propagate_types() - JoinIR bridge route

Fail-fast guard (structural guarantee):

  • PHI type inference is private step inside TypePropagationPipeline
  • lifecycle.rs and joinir_function_converter.rs cannot call PhiTypeResolver directly
  • Only public API: TypePropagationPipeline::run()
  • Order drift is structurally impossible (private encapsulation)

Environment variables (reused existing flags):

  • NYASH_PHI_GLOBAL_DEBUG=1 - PHI type inference debug output
  • NYASH_BINOP_REPROP_DEBUG=1 - BinOp re-propagation debug output
  • No new environment variables (Phase 279 P0 policy)

Files changed (6 total):

  • New: src/mir/type_propagation/mod.rs - Module definition
  • New: src/mir/type_propagation/pipeline.rs - SSOT pipeline (~300 lines)
  • Modified: src/mir/mod.rs - Add type_propagation module export
  • Modified: src/mir/builder/lifecycle.rs - Replace with SSOT call (~400 lines removed)
  • Modified: src/mir/join_ir_vm_bridge/joinir_function_converter.rs - Replace with SSOT call (~100 lines removed)
  • Modified: docs/development/current/main/phases/phase-279/README.md - Document SSOT entry

Code reduction:

  • ~500 lines of duplicate BinOp re-propagation logic removed
  • 2 implementations consolidated into 1 SSOT

Regression testing:

  • Lifecycle route (VM backend): Phase 275 fixture - exit=3
  • JoinIR route (VM backend): loop_min_while.hako - exit=0
  • LLVM harness: Phase 275 fixture - compiled and executed successfully

Acceptance criteria met:

  • Single SSOT entry for type propagation (TypePropagationPipeline::run())
  • Both routes call SSOT entry (lifecycle.rs + joinir_function_converter.rs)
  • No duplicate BinOp re-propagation logic
  • Fixed order: Copy → BinOp → Copy → PHI
  • Fail-fast guard prevents PHI-before-BinOp (structural guarantee)
  • All regression tests pass
  • Documentation reflects SSOT entry point

Next phase:

  • Phase 280 (planned): Further compiler unification work