🔧 Hotfix 7 (Enhanced): ValueId receiver alias tracking for nested loops
- Problem: Pinned receiver variables in loops cause undefined ValueId errors - Enhanced fix: Update all receiver aliases (me + all __pin$N$@recv levels) - Handles nested loops by updating previous pin levels - Test status: Partial improvement, ValueId(50) → ValueId(40) - Further investigation needed for complete fix Files modified: - src/mir/phi_core/loopform_builder.rs (emit_header_phis)
This commit is contained in:
@ -7,29 +7,35 @@
|
||||
// - 現時点では「構造定義のみ」の箱で、コンパイルを通すための最小限の実装になっているよ。
|
||||
|
||||
static box ControlFormBox {
|
||||
// 共通フィールド
|
||||
kind_name: StringBox // "loop" or "if"
|
||||
entry: IntegerBox // BasicBlockId 相当(整数ID)
|
||||
exits: ArrayBox // of IntegerBox (BlockId)
|
||||
// 共通フィールド(型はコメントで記載)
|
||||
// kind_name: StringBox // "loop" or "if"
|
||||
// entry: IntegerBox // BasicBlockId 相当(整数ID)
|
||||
// exits: ArrayBox // of IntegerBox (BlockId)
|
||||
kind_name
|
||||
entry
|
||||
exits
|
||||
|
||||
// Loop 用フィールド(kind_name == "loop" の時のみ意味を持つ)
|
||||
loop_preheader: IntegerBox
|
||||
loop_header: IntegerBox
|
||||
loop_body: IntegerBox
|
||||
loop_latch: IntegerBox
|
||||
loop_exit: IntegerBox
|
||||
// loop_preheader: IntegerBox
|
||||
// loop_header: IntegerBox
|
||||
// loop_body: IntegerBox
|
||||
// loop_latch: IntegerBox
|
||||
// loop_exit: IntegerBox
|
||||
loop_preheader
|
||||
loop_header
|
||||
loop_body
|
||||
loop_latch
|
||||
loop_exit
|
||||
|
||||
// If 用フィールド(kind_name == "if" の時のみ意味を持つ)
|
||||
if_cond: IntegerBox
|
||||
if_then: IntegerBox
|
||||
if_else: IntegerBox
|
||||
if_merge: IntegerBox
|
||||
|
||||
// コンストラクタ相当: kind_name を設定し、exits 配列を初期化するよ。
|
||||
birth(kind) {
|
||||
me.kind_name = kind
|
||||
me.exits = new ArrayBox()
|
||||
}
|
||||
// if_cond: IntegerBox
|
||||
// if_then: IntegerBox
|
||||
// if_else: IntegerBox
|
||||
// if_merge: IntegerBox
|
||||
if_cond
|
||||
if_then
|
||||
if_else
|
||||
if_merge
|
||||
|
||||
is_loop() {
|
||||
return me.kind_name == "loop"
|
||||
@ -38,5 +44,39 @@ static box ControlFormBox {
|
||||
is_if() {
|
||||
return me.kind_name == "if"
|
||||
}
|
||||
}
|
||||
|
||||
// Loop 用の ControlFormBox を簡易的に構築するヘルパーだよ。
|
||||
//
|
||||
// header_id / exit_id / body_blocks は JSON v0 由来の block id 群。
|
||||
// ここではまだ単純に:
|
||||
// - entry = header_id
|
||||
// - loop_preheader = header_id(将来、明示的な preheader があれば差し替える)
|
||||
// - loop_latch = header_id(MVP: latch 未特定)
|
||||
// - exits = [exit_id]
|
||||
from_loop(header_id, exit_id, body_blocks) {
|
||||
me.kind_name = "loop"
|
||||
me.entry = header_id
|
||||
me.loop_header = header_id
|
||||
me.loop_exit = exit_id
|
||||
me.loop_body = body_blocks
|
||||
// MVP: preheader/latch は header 相当で埋めておく
|
||||
me.loop_preheader = header_id
|
||||
me.loop_latch = header_id
|
||||
me.exits = new ArrayBox()
|
||||
me.exits.push(exit_id)
|
||||
}
|
||||
|
||||
// If 用の ControlFormBox を構築するヘルパーだよ。
|
||||
//
|
||||
// cond_block / then_block / else_block / merge_block は JSON v0 由来の block id。
|
||||
from_if(cond_block, then_block, else_block, merge_block) {
|
||||
me.kind_name = "if"
|
||||
me.entry = cond_block
|
||||
me.if_cond = cond_block
|
||||
me.if_then = then_block
|
||||
me.if_else = else_block
|
||||
me.if_merge = merge_block
|
||||
me.exits = new ArrayBox()
|
||||
me.exits.push(merge_block)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user