Skip to content

Commit 80cdd0c

Browse files
committed
Properly handle multiple same-fixed-reg constraints to the same vreg in one inst.
1 parent ab828b6 commit 80cdd0c

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/ion/mod.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,7 @@ impl<'a, F: Function> Env<'a, F> {
944944
}
945945

946946
fn add_liverange_to_preg(&mut self, range: CodeRange, reg: PReg) {
947+
log::debug!("adding liverange to preg: {:?} to {}", range, reg);
947948
let preg_idx = PRegIndex::new(reg.index());
948949
let lr = self.create_liverange(range);
949950
self.pregs[preg_idx.index()]
@@ -1413,10 +1414,22 @@ impl<'a, F: Function> Env<'a, F> {
14131414
if let Some(idx) = seen_fixed_for_vreg.iter().position(|r| *r == op.vreg())
14141415
{
14151416
let orig_preg = first_preg[idx];
1416-
log::debug!(" -> duplicate; switching to policy Reg");
1417-
fixups.push((pos, orig_preg, preg_idx, slot));
1418-
*op = Operand::new(op.vreg(), OperandPolicy::Reg, op.kind(), op.pos());
1419-
extra_clobbers.push((preg, pos.inst));
1417+
if orig_preg != preg_idx {
1418+
log::debug!(" -> duplicate; switching to policy Reg");
1419+
fixups.push((pos, orig_preg, preg_idx, slot));
1420+
*op = Operand::new(
1421+
op.vreg(),
1422+
OperandPolicy::Reg,
1423+
op.kind(),
1424+
op.pos(),
1425+
);
1426+
log::debug!(
1427+
" -> extra clobber {} at inst{}",
1428+
preg,
1429+
pos.inst.index()
1430+
);
1431+
extra_clobbers.push((preg, pos.inst));
1432+
}
14201433
} else {
14211434
seen_fixed_for_vreg.push(op.vreg());
14221435
first_preg.push(preg_idx);
@@ -2716,7 +2729,7 @@ impl<'a, F: Function> Env<'a, F> {
27162729
if self.minimal_bundle(bundle) {
27172730
self.dump_state();
27182731
}
2719-
debug_assert!(!self.minimal_bundle(bundle));
2732+
assert!(!self.minimal_bundle(bundle));
27202733

27212734
self.split_and_requeue_bundle(
27222735
bundle,

0 commit comments

Comments
 (0)