i965/vec4: Detect and delete useless MOVs.
authorMatt Turner <mattst88@gmail.com>
Mon, 21 Sep 2015 20:58:19 +0000 (13:58 -0700)
committerMatt Turner <mattst88@gmail.com>
Wed, 23 Sep 2015 04:20:29 +0000 (21:20 -0700)
With NIR:

instructions in affected programs:     111508 -> 109193 (-2.08%)
helped:                                507

Without NIR:

instructions in affected programs:     28763 -> 28474 (-1.00%)
helped:                                186

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4.cpp

index ed49cd38987ae73ce778cc21ccce383f4838d929..6e52d79e05357e0831db077f75c4397525ed17e8 100644 (file)
@@ -1021,6 +1021,28 @@ vec4_visitor::opt_register_coalesce()
          inst->src[0].abs || inst->src[0].negate || inst->src[0].reladdr)
         continue;
 
+      /* Remove no-op MOVs */
+      if (inst->dst.file == inst->src[0].file &&
+          inst->dst.reg == inst->src[0].reg &&
+          inst->dst.reg_offset == inst->src[0].reg_offset) {
+         bool is_nop_mov = true;
+
+         for (unsigned c = 0; c < 4; c++) {
+            if ((inst->dst.writemask & (1 << c)) == 0)
+               continue;
+
+            if (BRW_GET_SWZ(inst->src[0].swizzle, c) != c) {
+               is_nop_mov = false;
+               break;
+            }
+         }
+
+         if (is_nop_mov) {
+            inst->remove(block);
+            continue;
+         }
+      }
+
       bool to_mrf = (inst->dst.file == MRF);
 
       /* Can't coalesce this GRF if someone else was going to