i965/vec4: do not trim dead channels on gen6 for math
authorTapani Pälli <tapani.palli@intel.com>
Wed, 2 Apr 2014 08:46:58 +0000 (11:46 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Wed, 2 Apr 2014 16:50:48 +0000 (19:50 +0300)
Do not set a writemask on Gen6 for math instructions, those are
executed using align1 mode that does not support a destination mask.

v2: cleanups, better comment (Matt)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76883

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_vec4.cpp

index 32a38920dd261f5138338d433b1ff97c4029c992..a86d42c925d906804ea13fec71f751f3adba57cb 100644 (file)
@@ -322,7 +322,8 @@ src_reg::equals(src_reg *r)
 }
 
 static bool
-try_eliminate_instruction(vec4_instruction *inst, int new_writemask)
+try_eliminate_instruction(vec4_instruction *inst, int new_writemask,
+                          const struct brw_context *brw)
 {
    if (new_writemask == 0) {
       /* Don't dead code eliminate instructions that write to the
@@ -351,7 +352,10 @@ try_eliminate_instruction(vec4_instruction *inst, int new_writemask)
       case VS_OPCODE_PULL_CONSTANT_LOAD_GEN7:
          break;
       default:
-         if (!inst->is_tex()) {
+         /* Do not set a writemask on Gen6 for math instructions, those are
+          * executed using align1 mode that does not support a destination mask.
+          */
+         if (!(brw->gen == 6 && inst->is_math()) && !inst->is_tex()) {
             inst->dst.writemask = new_writemask;
             return true;
          }
@@ -407,7 +411,8 @@ vec4_visitor::dead_code_eliminate()
             }
          }
 
-         progress = try_eliminate_instruction(inst, write_mask) || progress;
+         progress = try_eliminate_instruction(inst, write_mask, brw) ||
+                    progress;
       }
 
       if (seen_control_flow || inst->predicate || inst->prev == NULL)
@@ -456,7 +461,7 @@ vec4_visitor::dead_code_eliminate()
          if (inst->dst.reg == scan_inst->dst.reg) {
             int new_writemask = scan_inst->dst.writemask & ~dead_channels;
 
-            progress = try_eliminate_instruction(scan_inst, new_writemask) ||
+            progress = try_eliminate_instruction(scan_inst, new_writemask, brw) ||
                        progress;
          }