On 04/18/2014 11:56 AM, Matt Turner wrote: > --- > src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-)
I originally thought this needed to go earlier in the patch series, since by this point you're emitting opcodes with more than 3 sources. However, CSE ignores SHADER_OPCODE_LOAD_PAYLOAD, so this code will never run for opcodes that could break. So, it's probably fine. > diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > index 94f657d..e40567f 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > @@ -94,10 +94,20 @@ is_expression_commutative(enum opcode op) > } > > static bool > -operands_match(enum opcode op, fs_reg *xs, fs_reg *ys) > +operands_match(fs_inst *a, fs_inst *b) > { > - if (!is_expression_commutative(op)) { > - return xs[0].equals(ys[0]) && xs[1].equals(ys[1]) && > xs[2].equals(ys[2]); > + fs_reg *xs = a->src; > + fs_reg *ys = b->src; > + > + if (!is_expression_commutative(a->opcode)) { > + bool match = true; > + for (int i = 0; i < a->sources; i++) { > + if (!xs[i].equals(ys[i])) { > + match = false; > + break; > + } > + } > + return match; > } else { > return (xs[0].equals(ys[0]) && xs[1].equals(ys[1])) || > (xs[1].equals(ys[0]) && xs[0].equals(ys[1])); It strikes me as a bit asymmetric to have the first block handle an arbitrary number of sources, and the second only check 0 and 1. It makes sense, since our commutative opcodes are all binops, but... How about adding /* All commutative opcodes are binary operations. */ assert(a->sources == 2 && b->sources == 2); here in the commutative case? > @@ -113,7 +123,8 @@ instructions_match(fs_inst *a, fs_inst *b) > a->predicate_inverse == b->predicate_inverse && > a->conditional_mod == b->conditional_mod && > a->dst.type == b->dst.type && > - operands_match(a->opcode, a->src, b->src); > + a->sources == b->sources && > + operands_match(a, b); > } > > bool >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev