i965/vec4: skip copy-propate for logical instructions with negated src entries
authorAbdiel Janulgue <abdiel.janulgue@linux.intel.com>
Thu, 5 Jun 2014 18:05:31 +0000 (11:05 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 9 Jun 2014 18:19:48 +0000 (11:19 -0700)
The negation source modifier on src registers has changed meaning in Broadwell when
used with logical operations. Don't copy propagate when negate src modifier is set
and when the destination instruction is a logical op.

Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp

index 83cf19114bed9fd5817264ab1c7aa94f62d051e9..3242c3a0dd065580b9b31dfb1041387ee337a6dc 100644 (file)
@@ -195,6 +195,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,
                                    src_reg *values[4])
@@ -233,6 +242,14 @@ vec4_visitor::try_copy_propagation(vec4_instruction *inst, int arg,
        value.file != ATTR)
       return false;
 
+   if (brw->gen >= 8) {
+      if (value.negate) {
+         if (is_logic_op(inst->opcode)) {
+            return false;
+         }
+      }
+   }
+
    if (inst->src[arg].abs) {
       value.negate = false;
       value.abs = true;