diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index 6d40e185500..2b3987fa906 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -82,22 +82,21 @@ AluGroup::add_trans_instructions(AluInstr *instr) if (instr->dest() && instr->dest()->pin() == pin_free) { int used_slot = 3; auto dest = instr->dest(); - int free_mask = 0xf; + int possible_dest_channel_mask = m_free_slots ^ 0xf; for (auto p : dest->parents()) { auto alu = p->as_alu(); if (alu) - free_mask &= alu->allowed_dest_chan_mask(); + possible_dest_channel_mask &= alu->allowed_dest_chan_mask(); } for (auto u : dest->uses()) { - free_mask &= u->allowed_src_chan_mask(); - if (!free_mask) + possible_dest_channel_mask &= u->allowed_src_chan_mask(); + if (!possible_dest_channel_mask) return false; } - while (used_slot >= 0 && - (!m_slots[used_slot] || !(free_mask & (1 << used_slot)))) + while (used_slot >= 0 && (!(possible_dest_channel_mask & (1 << used_slot)))) --used_slot; // if we schedule a non-trans instr into the trans slot,