On Sunday, December 21, 2014 03:37:25 PM Matt Turner wrote: > --- > No shader-db changes, unfortunately.
Unsurprising :) This patch doesn't implement what you meant.
1. instructions_match() checks a->conditional_mod == b->conditional_mod.
So you won't ever see mixed conditional mods in operands_match() or
is_expression_commutative(). I suspect this is why you see no changes.
2. It looks like your patch allows CSE of (a >= b) with (b >= a),
which are clearly different. So any changes would be wrong.
What you want is to use brw_swap_cmod. It's then trivial to handle /all/
comparitors, not just L/GE. I think what you want is:
static bool
instructions match(fs_inst *a, fs_inst *b)
{
bool match = a->opcode == b->opcode &&
a->saturate == b->saturate &&
a->predicate == b->predicate &&
a->predicate_inverse == b->predicate_inverse &&
a->dst.type == b->dst.type &&
a->sources == b->sources;
if (a->is_tex()) {
match = match &&
a->offset == b->offset &&
a->mlen == b->mlen &&
a->regs_written == b->regs_written &&
a->base_mrf == b->base_mrf &&
a->eot == b->eot &&
a->header_present == b->header_present &&
a->shadow_compare == b->shadow_compare);
}
if (!match)
return false;
/* Comparisons match if both the comparitor and operands are flipped. */
if (a->opcode == BRW_OPCODE_SEL &&
a->conditional_mod == brw_swap_cmod(b->conditional_mod)
a->src[0].equals(b->src[1]) && a->src[1].equals(b->src[0])) {
return true;
}
return a->conditional_mod == b->conditional_mod && operands_match(a, b);
}
I'm also not sure why you special case SEL - it seems like CMP would work fine
as well, and would probably help even more. Maybe just drop the opcode check.
FWIW, I haven't tested the above code.
--Ken
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
