Always call reassign_in for register ABI arguments.
Even if an argument is already in the correct register, make sure that we detect conflicts by registering the no-op move. This also means that the ABI argument register won't be turned into a variable for the solver.
This commit is contained in:
@@ -430,18 +430,16 @@ impl<'a> Context<'a> {
|
||||
locations: &EntityMap<Value, ValueLoc>) {
|
||||
for (abi, &value) in abi_types.iter().zip(dfg.inst_variable_args(inst)) {
|
||||
if let ArgumentLoc::Reg(reg) = abi.location {
|
||||
let cur_reg = self.divert.reg(value, locations);
|
||||
if reg != cur_reg {
|
||||
if let Affinity::Reg(rci) =
|
||||
self.liveness
|
||||
.get(value)
|
||||
.expect("ABI register must have live range")
|
||||
.affinity {
|
||||
let rc = self.reginfo.rc(rci);
|
||||
self.solver.reassign_in(value, rc, cur_reg, reg);
|
||||
} else {
|
||||
panic!("ABI argument {} should be in a register", value);
|
||||
}
|
||||
if let Affinity::Reg(rci) =
|
||||
self.liveness
|
||||
.get(value)
|
||||
.expect("ABI register must have live range")
|
||||
.affinity {
|
||||
let rc = self.reginfo.rc(rci);
|
||||
let cur_reg = self.divert.reg(value, locations);
|
||||
self.solver.reassign_in(value, rc, cur_reg, reg);
|
||||
} else {
|
||||
panic!("ABI argument {} should be in a register", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -364,13 +364,15 @@ impl Solver {
|
||||
}
|
||||
self.regs_in.free(rc, from);
|
||||
self.regs_out.take(rc, to);
|
||||
self.assignments
|
||||
.insert(Assignment {
|
||||
value,
|
||||
rc,
|
||||
from,
|
||||
to,
|
||||
});
|
||||
if from != to {
|
||||
self.assignments
|
||||
.insert(Assignment {
|
||||
value,
|
||||
rc,
|
||||
from,
|
||||
to,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// Add a variable representing an input side value with an existing register assignment.
|
||||
|
||||
Reference in New Issue
Block a user