Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini
This commit is contained in:
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user