progress = true;
for (int i = 0; i < src_size; i++) {
- if (mov[i]) {
+ if (!mov[i])
+ continue;
+
+ if (mov[i]->conditional_mod == BRW_CONDITIONAL_NONE) {
mov[i]->opcode = BRW_OPCODE_NOP;
- mov[i]->conditional_mod = BRW_CONDITIONAL_NONE;
mov[i]->dst = reg_undef;
for (int j = 0; j < mov[i]->sources; j++) {
mov[i]->src[j] = reg_undef;
}
+ } else {
+ /* If we have a conditional modifier, rewrite the MOV to be a
+ * MOV.cmod from the coalesced register. Hopefully, cmod
+ * propagation will clean this up and move it to the instruction
+ * that writes the register. If not, this keeps things correct
+ * while still letting us coalesce.
+ */
+ assert(mov[i]->opcode == BRW_OPCODE_MOV);
+ assert(mov[i]->sources == 1);
+ mov[i]->src[0] = mov[i]->dst;
+ mov[i]->dst = retype(brw_null_reg(), mov[i]->dst.type);
}
}