i965/fs: Emit a MOV instead of a SEL if the sources are the same.
authorMatt Turner <mattst88@gmail.com>
Mon, 28 Oct 2013 00:09:41 +0000 (17:09 -0700)
committerMatt Turner <mattst88@gmail.com>
Thu, 5 Dec 2013 04:05:44 +0000 (20:05 -0800)
One program affected.

instructions in affected programs:     436 -> 428 (-1.83%)

Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp

index f274994581366f6b84cf1a9a82cc17721a42d05d..d314799802812d568faf49c5c5e0f94267a9509c 100644 (file)
@@ -169,26 +169,30 @@ fs_visitor::opt_peephole_sel()
             break;
          }
 
-         /* Only the last source register can be a constant, so if the MOV in
-          * the "then" clause uses a constant, we need to put it in a
-          * temporary.
-          */
-         fs_reg src0(then_mov[i]->src[0]);
-         if (src0.file == IMM) {
-            src0 = fs_reg(this, glsl_type::float_type);
-            src0.type = then_mov[i]->src[0].type;
-            mov_imm_inst[i] = MOV(src0, then_mov[i]->src[0]);
-         }
-
-         sel_inst[i] = SEL(then_mov[i]->dst, src0, else_mov[i]->src[0]);
-
-         if (brw->gen == 6 && if_inst->conditional_mod) {
-            /* For Sandybridge with IF with embedded comparison */
-            sel_inst[i]->predicate = BRW_PREDICATE_NORMAL;
+         if (!then_mov[i]->src[0].equals(else_mov[i]->src[0])) {
+            /* Only the last source register can be a constant, so if the MOV
+             * in the "then" clause uses a constant, we need to put it in a
+             * temporary.
+             */
+            fs_reg src0(then_mov[i]->src[0]);
+            if (src0.file == IMM) {
+               src0 = fs_reg(this, glsl_type::float_type);
+               src0.type = then_mov[i]->src[0].type;
+               mov_imm_inst[i] = MOV(src0, then_mov[i]->src[0]);
+            }
+
+            sel_inst[i] = SEL(then_mov[i]->dst, src0, else_mov[i]->src[0]);
+
+            if (brw->gen == 6 && if_inst->conditional_mod) {
+               /* For Sandybridge with IF with embedded comparison */
+               sel_inst[i]->predicate = BRW_PREDICATE_NORMAL;
+            } else {
+               /* Separate CMP and IF instructions */
+               sel_inst[i]->predicate = if_inst->predicate;
+               sel_inst[i]->predicate_inverse = if_inst->predicate_inverse;
+            }
          } else {
-            /* Separate CMP and IF instructions */
-            sel_inst[i]->predicate = if_inst->predicate;
-            sel_inst[i]->predicate_inverse = if_inst->predicate_inverse;
+            sel_inst[i] = MOV(then_mov[i]->dst, then_mov[i]->src[0]);
          }
       }