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:
Jakob Stoklund Olesen
2018-01-17 14:58:05 -08:00
parent 13af22b46b
commit 0a6500c99a
2 changed files with 38 additions and 8 deletions

View File

@@ -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(_) => {