The negation source modifier on src registers has changed meaning in Broadwell 
when
used with logical operations.

On the vec4 backend, make sure copy propagation occurs only for original 
statements that
does not have negated source registers and destination instruction is not a 
logical op.
Since 'NOT' is now  a potentially propagate-able instruction, don't propagate it
either when the destination instruction is not a logical op.

Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com>
---
 src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

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 ab50d00..3a76997 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
@@ -201,6 +201,15 @@ try_constant_propagation(vec4_instruction *inst, int arg, 
src_reg *values[4])
    return false;
 }
 
+static bool
+is_logic_op(enum opcode opcode)
+{
+   return (opcode == BRW_OPCODE_AND ||
+           opcode == BRW_OPCODE_OR  ||
+           opcode == BRW_OPCODE_XOR ||
+           opcode == BRW_OPCODE_NOT);
+}
+
 bool
 vec4_visitor::try_copy_propagation(vec4_instruction *inst, int arg,
                                    struct copy_entry *entry)
@@ -239,6 +248,11 @@ vec4_visitor::try_copy_propagation(vec4_instruction *inst, 
int arg,
        value.file != ATTR)
       return false;
 
+   if (brw->gen >=8 &&
+       ((value.negate && is_logic_op(inst->opcode)) ||
+        (entry->opcode == BRW_OPCODE_NOT && !is_logic_op(inst->opcode))))
+      return false;
+
    if (inst->src[arg].abs) {
       value.negate = false;
       value.abs = true;
-- 
1.9.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to