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.
---
This patch made a much bigger difference when pulling instructions from the
ends of the "then" and "else" blocks, because often we were able to compute
to MRF.

 src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
index 9626751..c875487 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
@@ -142,7 +142,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);
 
@@ -161,7 +160,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;
          }
 
@@ -188,7 +187,7 @@ fs_visitor::opt_peephole_sel()
          }
       }
 
-      if (malformed_mov_found)
+      if (movs == 0)
          continue;
 
       /* Emit a CMP if our IF used the embedded comparison */
-- 
1.8.3.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to