Properly handle multiple same-fixed-reg constraints to the same vreg in one inst.

This commit is contained in:
Chris Fallin
2021-05-06 01:01:27 -07:00
parent ab828b6c86
commit 80cdd0c5ac

View File

@@ -944,6 +944,7 @@ impl<'a, F: Function> Env<'a, F> {
} }
fn add_liverange_to_preg(&mut self, range: CodeRange, reg: PReg) { fn add_liverange_to_preg(&mut self, range: CodeRange, reg: PReg) {
log::debug!("adding liverange to preg: {:?} to {}", range, reg);
let preg_idx = PRegIndex::new(reg.index()); let preg_idx = PRegIndex::new(reg.index());
let lr = self.create_liverange(range); let lr = self.create_liverange(range);
self.pregs[preg_idx.index()] self.pregs[preg_idx.index()]
@@ -1413,10 +1414,22 @@ impl<'a, F: Function> Env<'a, F> {
if let Some(idx) = seen_fixed_for_vreg.iter().position(|r| *r == op.vreg()) if let Some(idx) = seen_fixed_for_vreg.iter().position(|r| *r == op.vreg())
{ {
let orig_preg = first_preg[idx]; let orig_preg = first_preg[idx];
log::debug!(" -> duplicate; switching to policy Reg"); if orig_preg != preg_idx {
fixups.push((pos, orig_preg, preg_idx, slot)); log::debug!(" -> duplicate; switching to policy Reg");
*op = Operand::new(op.vreg(), OperandPolicy::Reg, op.kind(), op.pos()); fixups.push((pos, orig_preg, preg_idx, slot));
extra_clobbers.push((preg, pos.inst)); *op = Operand::new(
op.vreg(),
OperandPolicy::Reg,
op.kind(),
op.pos(),
);
log::debug!(
" -> extra clobber {} at inst{}",
preg,
pos.inst.index()
);
extra_clobbers.push((preg, pos.inst));
}
} else { } else {
seen_fixed_for_vreg.push(op.vreg()); seen_fixed_for_vreg.push(op.vreg());
first_preg.push(preg_idx); first_preg.push(preg_idx);
@@ -2716,7 +2729,7 @@ impl<'a, F: Function> Env<'a, F> {
if self.minimal_bundle(bundle) { if self.minimal_bundle(bundle) {
self.dump_state(); self.dump_state();
} }
debug_assert!(!self.minimal_bundle(bundle)); assert!(!self.minimal_bundle(bundle));
self.split_and_requeue_bundle( self.split_and_requeue_bundle(
bundle, bundle,