On Broadwell, this reduces the instruction to a single operation when NOT is used with a logical instruction.
Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com> --- .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp index e537895..5eb4eb4 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -42,9 +42,11 @@ struct copy_entry { }; static bool -is_direct_copy(vec4_instruction *inst) +can_propagate_from(struct brw_context *brw, vec4_instruction *inst) + { - return (inst->opcode == BRW_OPCODE_MOV && + return ((inst->opcode == BRW_OPCODE_MOV || + (inst->opcode == BRW_OPCODE_NOT && brw->gen >= 8)) && !inst->predicate && inst->dst.file == GRF && !inst->saturate && @@ -248,7 +250,11 @@ vec4_visitor::try_copy_propagation(vec4_instruction *inst, int arg, return false; if (brw->gen >=8) { - if (value.negate) { + if (entry->opcode == BRW_OPCODE_NOT) { + if (!is_logic_op(inst->opcode)) { + return false; + } + } else if (value.negate) { if (is_logic_op(inst->opcode)) { return false; } @@ -299,6 +305,10 @@ vec4_visitor::try_copy_propagation(vec4_instruction *inst, int arg, value.type = inst->src[arg].type; inst->src[arg] = value; + + if (brw->gen >=8 && entry->opcode == BRW_OPCODE_NOT) + inst->src[arg].negate ^= !value.negate; + return true; } @@ -380,10 +390,10 @@ vec4_visitor::opt_copy_propagation() * the value is the newly propagated source. Otherwise, we don't know * the new value, so clear it. */ - bool direct_copy = is_direct_copy(inst); + bool propagate = can_propagate_from(brw, inst); for (int i = 0; i < 4; i++) { if (inst->dst.writemask & (1 << i)) { - entries[reg].value[i] = direct_copy ? &inst->src[0] : NULL; + entries[reg].value[i] = propagate ? &inst->src[0] : NULL; entries[reg].opcode = inst->opcode; } } -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev