i965/fs: skip copy-propate for logical instructions with negated src entries
authorAbdiel Janulgue <abdiel.janulgue@linux.intel.com>
Thu, 5 Jun 2014 18:05:29 +0000 (11:05 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 9 Jun 2014 18:19:45 +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_fs_copy_propagation.cpp

index d3d59aa1bc9e8eb1e13ef3d8208c92095e26dcb9..158d0bad507f7fc7346d347a8575f4a2fe1ec069 100644 (file)
@@ -272,6 +272,15 @@ fs_copy_prop_dataflow::dump_block_data() const
    }
 }
 
+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
 fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
 {
@@ -330,6 +339,14 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
    if (has_source_modifiers && entry->dst.type != inst->src[arg].type)
       return false;
 
+   if (brw->gen >= 8) {
+      if (entry->src.negate) {
+         if (is_logic_op(inst->opcode)) {
+            return false;
+         }
+      }
+   }
+
    inst->src[arg].file = entry->src.file;
    inst->src[arg].reg = entry->src.reg;
    inst->src[arg].reg_offset = entry->src.reg_offset;