37 lines
2.0 KiB
Markdown
37 lines
2.0 KiB
Markdown
|
|
# 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 フォールバック維持)
|
|||
|
|
|
|||
|
|
### OK(Module 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 のフォールバックは意図的に残す。
|