Avoid making solver variables for fixed input constraints.
When the coloring pass sees an instruction with a fixed input register constraint that is already satisfied, make sure to tell the solver about it anyway. There are situations where the solver wants to convert a value to a solver variable, and we can't allow that if the same value is also used for a fixed register operand. Fixes #221.
This commit is contained in:
@@ -499,14 +499,15 @@ impl<'a> Context<'a> {
|
||||
match op.kind {
|
||||
ConstraintKind::FixedReg(regunit) |
|
||||
ConstraintKind::FixedTied(regunit) => {
|
||||
if regunit != cur_reg {
|
||||
self.solver.reassign_in(
|
||||
value,
|
||||
op.regclass,
|
||||
cur_reg,
|
||||
regunit,
|
||||
);
|
||||
}
|
||||
// Add the fixed constraint even if `cur_reg == regunit`.
|
||||
// It is possible that we will want to convert the value to a variable later,
|
||||
// and this identity assignment prevents that from happening.
|
||||
self.solver.reassign_in(
|
||||
value,
|
||||
op.regclass,
|
||||
cur_reg,
|
||||
regunit,
|
||||
);
|
||||
}
|
||||
ConstraintKind::Reg |
|
||||
ConstraintKind::Tied(_) => {
|
||||
|
||||
Reference in New Issue
Block a user