wip(recv): emit_unified_call で最終LocalSSA試行(未完)
- builder_calls.rs の emit_unified_call 末尾で recv 再materialize - しかし MIR に Copy が反映されない問題が残る - 次: emit_instruction 側に責務を移す構造的修正へ
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
use crate::mir::builder::MirBuilder;
|
||||
use crate::mir::{ValueId, Callee};
|
||||
use crate::mir::ValueId;
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
|
||||
pub enum LocalKind {
|
||||
@ -38,6 +38,12 @@ pub fn ensure(builder: &mut MirBuilder, v: ValueId, kind: LocalKind) -> ValueId
|
||||
return loc;
|
||||
}
|
||||
|
||||
// Ensure the current basic block exists in the function before emitting a Copy.
|
||||
// Stage-B 経路などでは current_block が割り当て済みでも、ブロック自体が
|
||||
// function にまだ追加されていない場合があり、そのまま emit_instruction すると
|
||||
// Copy が黙って落ちてしまう。ここで best-effort で作成しておく。
|
||||
let _ = builder.ensure_block_exists(bb);
|
||||
|
||||
// CRITICAL FIX: If `v` is from a pinned slot, check if there's a PHI value for that slot
|
||||
// in the current block's variable_map. If so, use the PHI value directly instead of
|
||||
// emitting a Copy from the old value (which might not be defined in this block).
|
||||
@ -96,19 +102,6 @@ pub fn field_base(builder: &mut MirBuilder, v: ValueId) -> ValueId { ensure(buil
|
||||
#[inline]
|
||||
pub fn cmp_operand(builder: &mut MirBuilder, v: ValueId) -> ValueId { ensure(builder, v, LocalKind::CompareOperand) }
|
||||
|
||||
/// Finalize a callee+args just before emitting a Call instruction:
|
||||
/// - If Method: ensure receiver is in the current block
|
||||
/// - All args: ensure in the current block
|
||||
pub fn finalize_callee_and_args(builder: &mut MirBuilder, callee: &mut Callee, args: &mut Vec<ValueId>) {
|
||||
if let Callee::Method { receiver: Some(r), box_name, method, certainty } = callee.clone() {
|
||||
let r_local = recv(builder, r);
|
||||
*callee = Callee::Method { box_name, method, receiver: Some(r_local), certainty };
|
||||
}
|
||||
for a in args.iter_mut() {
|
||||
*a = arg(builder, *a);
|
||||
}
|
||||
}
|
||||
|
||||
/// Finalize only the args (legacy Call paths)
|
||||
pub fn finalize_args(builder: &mut MirBuilder, args: &mut Vec<ValueId>) {
|
||||
for a in args.iter_mut() {
|
||||
|
||||
Reference in New Issue
Block a user