diff --git a/src/ion/data_structures.rs b/src/ion/data_structures.rs index 711755e..748d846 100644 --- a/src/ion/data_structures.rs +++ b/src/ion/data_structures.rs @@ -331,7 +331,7 @@ pub struct Env<'a, F: Function> { // was to the approprate PReg. // // (progpoint, copy-from-preg, copy-to-preg, to-slot) - pub multi_fixed_reg_fixups: Vec<(ProgPoint, PRegIndex, PRegIndex, usize)>, + pub multi_fixed_reg_fixups: Vec<(ProgPoint, PRegIndex, PRegIndex, VRegIndex, usize)>, pub inserted_moves: Vec, diff --git a/src/ion/liveranges.rs b/src/ion/liveranges.rs index 4637318..de100c9 100644 --- a/src/ion/liveranges.rs +++ b/src/ion/liveranges.rs @@ -1167,6 +1167,7 @@ impl<'a, F: Function> Env<'a, F> { ProgPoint, PRegIndex, PRegIndex, + VRegIndex, usize, )>| { if last_point.is_some() && Some(pos) != last_point { @@ -1189,7 +1190,7 @@ impl<'a, F: Function> Env<'a, F> { let orig_preg = first_preg[idx]; if orig_preg != preg_idx { log::trace!(" -> duplicate; switching to constraint Reg"); - fixups.push((pos, orig_preg, preg_idx, slot)); + fixups.push((pos, orig_preg, preg_idx, vreg_idx, slot)); *op = Operand::new( op.vreg(), OperandConstraint::Reg, diff --git a/src/ion/moves.rs b/src/ion/moves.rs index f382821..2b562f7 100644 --- a/src/ion/moves.rs +++ b/src/ion/moves.rs @@ -685,21 +685,22 @@ impl<'a, F: Function> Env<'a, F> { } // Handle multi-fixed-reg constraints by copying. - for (progpoint, from_preg, to_preg, slot) in + for (progpoint, from_preg, to_preg, to_vreg, slot) in std::mem::replace(&mut self.multi_fixed_reg_fixups, vec![]) { log::trace!( - "multi-fixed-move constraint at {:?} from p{} to p{}", + "multi-fixed-move constraint at {:?} from p{} to p{} for v{}", progpoint, from_preg.index(), - to_preg.index() + to_preg.index(), + to_vreg.index(), ); self.insert_move( progpoint, InsertMovePrio::MultiFixedReg, Allocation::reg(self.pregs[from_preg.index()].reg), Allocation::reg(self.pregs[to_preg.index()].reg), - None, + Some(self.vreg_regs[to_vreg.index()]), ); self.set_alloc( progpoint.inst(),