fix(loop/phi): loop header pinned receiver PHI の未定義ValueId解消
**問題**: TestArgs.process/1 で `Invalid value: use of undefined value ValueId(14)` - loop条件でのmethod call(args.length())がpin_to_slotで pinned receiver作成 - header PHIが未定義のValueIdを参照していた **根本原因**: - pinned変数のheader PHI作成時、`preheader_value = value` として header blockで作成された値を使用 - 正しくは preheader block の元値を参照すべき **修正内容**: 1. **find_copy_source ヘルパー追加** (src/mir/loop_builder.rs:50-80) - Copy命令を遡ってpreheaderの元値を特定 - NYASH_LOOP_TRACE=1 でデバッグ出力 2. **pinned変数PHI作成ロジック強化** (lines 368-410) - NEW pinned変数: find_copy_source()で正しいpreheader値取得 - INHERITED pinned変数: pre_vars_snapshot から値取得 - PHI inputs に正しい preheader_value を設定 3. **LoopFormOps::new_value修正** (lines 1122-1127) - value_gen.next() → next_value_id() に統一 - 関数ローカルアロケーター使用でValueId整合性確保 4. **next_value_id可視性拡大** (src/mir/builder/utils.rs:33) - pub(super) → pub(crate) でループビルダーから使用可能に **テスト結果**: ✅ Test1 (Direct VM): PASS ✅ Test3 (MIR verify): PASS ⚠️ Test2 (Stage-B): ValueId(17)はif-block PHI問題(別issue) **残存問題**: - Stage-B の ValueId(17) はループ前のif-blockで発生 - if-block PHI reassignment (%0 = phi [%2, bb3]) の構造的問題 - 別タスクで対処予定 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -30,7 +30,7 @@ impl super::MirBuilder {
|
||||
/// - Inside function: uses function-local allocator
|
||||
/// - Outside function: uses module-global allocator
|
||||
#[inline]
|
||||
pub(super) fn next_value_id(&mut self) -> super::ValueId {
|
||||
pub(crate) fn next_value_id(&mut self) -> super::ValueId {
|
||||
if let Some(ref mut f) = self.current_function {
|
||||
f.next_value_id() // Function context
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user