Files
hakorune/docs/development/current/main/phases/phase-136/README.md
nyash-codex 455d511187 feat(mir): Phase 136 P0 - ValueId allocator SSOT 徹底(関数内経路から value_gen.next() 掃討)
## Summary
Eliminates remaining `value_gen.next()` calls from function-context code paths,
unifying all ValueId allocation through `MirBuilder::next_value_id()` SSOT allocator.

## Changes

### 1. Fixed `new_typed_value()` (src/mir/builder.rs:1068)
**Before**: `let id = self.value_gen.next();` (bypasses function context)
**After**: `let id = self.next_value_id();` (respects function context)

This is a public API used in function context, so must use SSOT allocator
to avoid collisions with reserved PHI dsts and function params.

### 2. Fixed test code (src/mir/builder.rs)
**test_shadowing_binding_restore** (lines 1161, 1171):
- Simulates function scope with `push_lexical_scope()`
- Changed to `builder.next_value_id()` for function scope simulation

**test_valueid_binding_parallel_allocation** (lines 1196-1216):
- Tests ValueId/BindingId independence
- Changed to `builder.next_value_id()` with note that Module context fallback preserves test intent

### 3. Verified Module context fallbacks (OK, no change needed)
These already check `current_function.is_some()` and use `value_gen.next()` only as Module context fallback:
- `src/mir/builder/utils.rs:43` - next_value_id() SSOT implementation
- `src/mir/builder/utils.rs:436` - pin_to_slot()
- `src/mir/builder/utils.rs:467` - materialize_local()
- `src/mir/utils/phi_helpers.rs:69` - insert_phi_unified()

## Verification
```bash
rg -n "value_gen\.next\(" src/mir --type rust | grep -v "Module context" | grep -v "//"
# Result: Only comments/docs remain
```

## Acceptance
 cargo test --release --lib - 997 passed
 phase135_trim_mir_verify.sh - PASS
 phase132_exit_phi_parity.sh - 3/3 PASS
 All function-context `value_gen.next()` eliminated

## Effect
- **Collision prevention**: No more ValueId collisions between function-level allocations and reserved PHI dsts
- **SSOT compliance**: All ValueId allocation flows through single allocator
- **Contract enforcement**: Phase 135 P1 contract_checks will catch violations immediately

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 19:37:30 +09:00

2.0 KiB
Raw Blame History

Phase 136: ValueId allocator SSOT 徹底(残存 value_gen.next() 掃討)

Status

  • 状態: P0 完了
  • スコープ: 関数内 ValueId 発行を MirBuilder::next_value_id() に一本化し、予約PHI/引数/ローカルとの衝突余地を消す

Problem

Phase 135 で契約allocator SSOTは固まったが、一部のコードで builder.value_gen.next() を直接使用していた。 これは関数内で走る場合、予約PHI dst や関数引数との ValueId 衝突を引き起こす可能性がある。

Fix

SSOT 化対象

  1. src/mir/builder.rs:new_typed_value() - 型付きValueId発行API

    • Before: let id = self.value_gen.next();
    • After: let id = self.next_value_id(); (関数コンテキストを尊重)
  2. テストコード内の value_gen.next() - 関数スコープをシミュレート

    • test_shadowing_binding_restore: 関数スコープシミュレーションで next_value_id() を使用
    • test_valueid_binding_parallel_allocation: SSOT allocator を使用Module context フォールバック維持)

OKModule context フォールバック)

以下は既に if current_function.is_some() で関数コンテキストを判定しており、Module context のフォールバックとして value_gen.next() を使用OK

  • src/mir/builder/utils.rs:next_value_id() - SSOT allocator 自体43行目
  • src/mir/builder/utils.rs:pin_to_slot() - 436行目
  • src/mir/builder/utils.rs:materialize_local() - 467行目
  • src/mir/utils/phi_helpers.rs:insert_phi_unified() - 69行目

Acceptance

  • rg -n "value_gen\.next\(" src/mir で関数内経路から消える
  • cargo test --release --lib - 997 passed
  • phase135_trim_mir_verify.sh - PASS
  • phase132_exit_phi_parity.sh - 3/3 PASS

Remaining Tasks残課題

なし。全ての関数内経路から value_gen.next() を排除完了。Module context のフォールバックは意図的に残す。