Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini

This commit is contained in:
nyash-codex
2025-12-11 20:54:33 +09:00
parent 59a985b7fa
commit af6f95cd4b
170 changed files with 4423 additions and 1897 deletions

View File

@ -5,8 +5,8 @@
//! - JoinIR fragment → host MIR への ID変換
//! - 決定性を重視した実装
use std::collections::BTreeMap; // Phase 222.5-E: HashMap → BTreeMap for determinism
use crate::mir::{BasicBlock, BasicBlockId, MirInstruction, ValueId};
use std::collections::BTreeMap; // Phase 222.5-E: HashMap → BTreeMap for determinism
/// JoinIR ID space を host MIR ID space に変換する
pub struct JoinIrIdRemapper {
@ -29,7 +29,9 @@ impl JoinIrIdRemapper {
/// Block ID mapping を取得
pub fn get_block(&self, func_name: &str, old_id: BasicBlockId) -> Option<BasicBlockId> {
self.block_map.get(&(func_name.to_string(), old_id)).copied()
self.block_map
.get(&(func_name.to_string(), old_id))
.copied()
}
/// Value ID mapping を取得
@ -70,7 +72,9 @@ impl JoinIrIdRemapper {
Compare { dst, lhs, rhs, .. } => vec![*dst, *lhs, *rhs],
Load { dst, ptr } => vec![*dst, *ptr],
Store { value, ptr } => vec![*value, *ptr],
Call { dst, func, args, .. } => {
Call {
dst, func, args, ..
} => {
let mut vals = vec![*func];
if let Some(d) = dst {
vals.push(*d);
@ -78,7 +82,9 @@ impl JoinIrIdRemapper {
vals.extend(args.iter().copied());
vals
}
BoxCall { dst, box_val, args, .. } => {
BoxCall {
dst, box_val, args, ..
} => {
let mut vals = vec![*box_val];
if let Some(d) = dst {
vals.push(*d);
@ -86,7 +92,9 @@ impl JoinIrIdRemapper {
vals.extend(args.iter().copied());
vals
}
PluginInvoke { dst, box_val, args, .. } => {
PluginInvoke {
dst, box_val, args, ..
} => {
let mut vals = vec![*box_val];
if let Some(d) = dst {
vals.push(*d);
@ -107,7 +115,9 @@ impl JoinIrIdRemapper {
vals.extend(args.iter().copied());
vals
}
NewClosure { dst, captures, me, .. } => {
NewClosure {
dst, captures, me, ..
} => {
let mut vals = vec![*dst];
vals.extend(captures.iter().map(|(_, v)| *v));
if let Some(m) = me {
@ -119,10 +129,14 @@ impl JoinIrIdRemapper {
Debug { value, .. } => vec![*value],
DebugLog { values, .. } => values.clone(),
Throw { exception, .. } => vec![*exception],
Catch { exception_value, .. } => vec![*exception_value],
Catch {
exception_value, ..
} => vec![*exception_value],
RefNew { dst, box_val } => vec![*dst, *box_val],
RefGet { dst, reference, .. } => vec![*dst, *reference],
RefSet { reference, value, .. } => vec![*reference, *value],
RefSet {
reference, value, ..
} => vec![*reference, *value],
WeakNew { dst, box_val } => vec![*dst, *box_val],
WeakLoad { dst, weak_ref } => vec![*dst, *weak_ref],
WeakRef { dst, value, .. } => vec![*dst, *value],
@ -136,7 +150,11 @@ impl JoinIrIdRemapper {
Cast { dst, value, .. } => vec![*dst, *value],
TypeOp { dst, value, .. } => vec![*dst, *value],
ArrayGet { dst, array, index } => vec![*dst, *array, *index],
ArraySet { array, index, value } => vec![*array, *index, *value],
ArraySet {
array,
index,
value,
} => vec![*array, *index, *value],
Jump { .. } | Nop | Safepoint => vec![],
ExternCall { dst, args, .. } => {
let mut vals = Vec::new();
@ -185,14 +203,27 @@ impl JoinIrIdRemapper {
value: remap(*value),
ptr: remap(*ptr),
},
Call { dst, func, callee, args, effects } => Call {
Call {
dst,
func,
callee,
args,
effects,
} => Call {
dst: dst.map(remap),
func: remap(*func),
callee: callee.clone(),
args: args.iter().map(|&a| remap(a)).collect(),
effects: *effects,
},
BoxCall { dst, box_val, method, method_id, args, effects } => BoxCall {
BoxCall {
dst,
box_val,
method,
method_id,
args,
effects,
} => BoxCall {
dst: dst.map(remap),
box_val: remap(*box_val),
method: method.clone(),
@ -200,7 +231,13 @@ impl JoinIrIdRemapper {
args: args.iter().map(|&a| remap(a)).collect(),
effects: *effects,
},
PluginInvoke { dst, box_val, method, args, effects } => PluginInvoke {
PluginInvoke {
dst,
box_val,
method,
args,
effects,
} => PluginInvoke {
dst: dst.map(remap),
box_val: remap(*box_val),
method: method.clone(),
@ -211,16 +248,29 @@ impl JoinIrIdRemapper {
dst: remap(*dst),
src: remap(*src),
},
NewBox { dst, box_type, args } => NewBox {
NewBox {
dst,
box_type,
args,
} => NewBox {
dst: remap(*dst),
box_type: box_type.clone(),
args: args.iter().map(|&a| remap(a)).collect(),
},
NewClosure { dst, params, body, captures, me } => NewClosure {
NewClosure {
dst,
params,
body,
captures,
me,
} => NewClosure {
dst: remap(*dst),
params: params.clone(),
body: body.clone(),
captures: captures.iter().map(|(n, v)| (n.clone(), remap(*v))).collect(),
captures: captures
.iter()
.map(|(n, v)| (n.clone(), remap(*v)))
.collect(),
me: me.map(remap),
},
Print { value, effects } => Print {
@ -239,7 +289,11 @@ impl JoinIrIdRemapper {
exception: remap(*exception),
effects: *effects,
},
Catch { exception_type, exception_value, handler_bb } => Catch {
Catch {
exception_type,
exception_value,
handler_bb,
} => Catch {
exception_type: exception_type.clone(),
exception_value: remap(*exception_value),
handler_bb: *handler_bb,
@ -248,12 +302,20 @@ impl JoinIrIdRemapper {
dst: remap(*dst),
box_val: remap(*box_val),
},
RefGet { dst, reference, field } => RefGet {
RefGet {
dst,
reference,
field,
} => RefGet {
dst: remap(*dst),
reference: remap(*reference),
field: field.clone(),
},
RefSet { reference, field, value } => RefSet {
RefSet {
reference,
field,
value,
} => RefSet {
reference: remap(*reference),
field: field.clone(),
value: remap(*value),
@ -271,12 +333,8 @@ impl JoinIrIdRemapper {
op: *op,
value: remap(*value),
},
BarrierRead { ptr } => BarrierRead {
ptr: remap(*ptr),
},
BarrierWrite { ptr } => BarrierWrite {
ptr: remap(*ptr),
},
BarrierRead { ptr } => BarrierRead { ptr: remap(*ptr) },
BarrierWrite { ptr } => BarrierWrite { ptr: remap(*ptr) },
Barrier { op, ptr } => Barrier {
op: *op,
ptr: remap(*ptr),
@ -293,12 +351,20 @@ impl JoinIrIdRemapper {
dst: remap(*dst),
future: remap(*future),
},
TypeCheck { dst, value, expected_type } => TypeCheck {
TypeCheck {
dst,
value,
expected_type,
} => TypeCheck {
dst: remap(*dst),
value: remap(*value),
expected_type: expected_type.clone(),
},
Cast { dst, value, target_type } => Cast {
Cast {
dst,
value,
target_type,
} => Cast {
dst: remap(*dst),
value: remap(*value),
target_type: target_type.clone(),
@ -314,12 +380,22 @@ impl JoinIrIdRemapper {
array: remap(*array),
index: remap(*index),
},
ArraySet { array, index, value } => ArraySet {
ArraySet {
array,
index,
value,
} => ArraySet {
array: remap(*array),
index: remap(*index),
value: remap(*value),
},
ExternCall { dst, iface_name, method_name, args, effects } => ExternCall {
ExternCall {
dst,
iface_name,
method_name,
args,
effects,
} => ExternCall {
dst: dst.map(remap),
iface_name: iface_name.clone(),
method_name: method_name.clone(),
@ -327,12 +403,13 @@ impl JoinIrIdRemapper {
effects: *effects,
},
// Phase 189 FIX: Remap PHI dst and input values (BlockId remapping is done in control_flow.rs)
Phi { dst, inputs, type_hint } => Phi {
Phi {
dst,
inputs,
type_hint,
} => Phi {
dst: remap(*dst),
inputs: inputs
.iter()
.map(|(bb, val)| (*bb, remap(*val)))
.collect(),
inputs: inputs.iter().map(|(bb, val)| (*bb, remap(*val))).collect(),
type_hint: type_hint.clone(),
},
// Pass through unchanged (Branch/Jump/Return handled separately)