i965/fs: Extend SEL peephole to handle only matching MOVs.
authorMatt Turner <mattst88@gmail.com>
Wed, 30 Oct 2013 04:39:52 +0000 (21:39 -0700)
committerMatt Turner <mattst88@gmail.com>
Thu, 5 Dec 2013 04:05:44 +0000 (20:05 -0800)
Before this patch, the following code would not be optimized even though
the first two instructions were common to the then and else blocks:

   (+f0) IF
   MOV dst0 ...
   MOV dst1 ...
   MOV dst2 ...
   ELSE
   MOV dst0 ...
   MOV dst1 ...
   MOV dst3 ...
   ENDIF

This commit extends the peephole to handle this case.

No shader-db changes.

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

index 52be1b772e4570e33a974f66a3328b3457b90ac1..f274994581366f6b84cf1a9a82cc17721a42d05d 100644 (file)
@@ -147,7 +147,6 @@ fs_visitor::opt_peephole_sel()
 
       fs_inst *else_mov[MAX_MOVS] = { NULL };
       fs_inst *then_mov[MAX_MOVS] = { NULL };
-      bool malformed_mov_found = false;
 
       int movs = count_movs_from_if(then_mov, else_mov, if_inst, else_inst);
 
@@ -166,7 +165,7 @@ fs_visitor::opt_peephole_sel()
          if (!then_mov[i]->dst.equals(else_mov[i]->dst) ||
              then_mov[i]->is_partial_write() ||
              else_mov[i]->is_partial_write()) {
-            malformed_mov_found = true;
+            movs = i;
             break;
          }
 
@@ -193,7 +192,7 @@ fs_visitor::opt_peephole_sel()
          }
       }
 
-      if (malformed_mov_found)
+      if (movs == 0)
          continue;
 
       /* Emit a CMP if our IF used the embedded comparison */