Mesa (master): i965/fs: Use a helper function for checking for flow control instructions.

Eric Anholt anholt at kemper.freedesktop.org
Thu Feb 14 02:38:29 UTC 2013


Module: Mesa
Branch: master
Commit: bf91f0b03942d966cf453201dc52c4aa4049f8fa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bf91f0b03942d966cf453201dc52c4aa4049f8fa

Author: Eric Anholt <eric at anholt.net>
Date:   Tue Feb  5 15:36:18 2013 -0800

i965/fs: Use a helper function for checking for flow control instructions.

In 2 of our checks, we were missing BREAK and CONTINUE.

NOTE: Candidate for the stable branches.
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp               |   35 +++++++++++--------
 src/mesa/drivers/dri/i965/brw_fs.h                 |    1 +
 .../dri/i965/brw_fs_schedule_instructions.cpp      |    9 +----
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 8e57eb0..8dab431 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -328,6 +328,23 @@ fs_inst::is_math()
 }
 
 bool
+fs_inst::is_control_flow()
+{
+   switch (opcode) {
+   case BRW_OPCODE_DO:
+   case BRW_OPCODE_WHILE:
+   case BRW_OPCODE_IF:
+   case BRW_OPCODE_ELSE:
+   case BRW_OPCODE_ENDIF:
+   case BRW_OPCODE_BREAK:
+   case BRW_OPCODE_CONTINUE:
+      return true;
+   default:
+      return false;
+   }
+}
+
+bool
 fs_inst::is_send_from_grf()
 {
    return (opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7 ||
@@ -2070,16 +2087,12 @@ fs_visitor::compute_to_mrf()
 	    break;
 	 }
 
-	 /* We don't handle flow control here.  Most computation of
+	 /* We don't handle control flow here.  Most computation of
 	  * values that end up in MRFs are shortly before the MRF
 	  * write anyway.
 	  */
-	 if (scan_inst->opcode == BRW_OPCODE_DO ||
-	     scan_inst->opcode == BRW_OPCODE_WHILE ||
-	     scan_inst->opcode == BRW_OPCODE_ELSE ||
-	     scan_inst->opcode == BRW_OPCODE_ENDIF) {
+	 if (scan_inst->is_control_flow() && scan_inst->opcode != BRW_OPCODE_IF)
 	    break;
-	 }
 
 	 /* You can't read from an MRF, so if someone else reads our
 	  * MRF's source GRF that we wanted to rewrite, that stops us.
@@ -2163,16 +2176,8 @@ fs_visitor::remove_duplicate_mrf_writes()
    foreach_list_safe(node, &this->instructions) {
       fs_inst *inst = (fs_inst *)node;
 
-      switch (inst->opcode) {
-      case BRW_OPCODE_DO:
-      case BRW_OPCODE_WHILE:
-      case BRW_OPCODE_IF:
-      case BRW_OPCODE_ELSE:
-      case BRW_OPCODE_ENDIF:
+      if (inst->is_control_flow()) {
 	 memset(last_mrf_move, 0, sizeof(last_mrf_move));
-	 continue;
-      default:
-	 break;
       }
 
       if (inst->opcode == BRW_OPCODE_MOV &&
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index d332502..88fecb9 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -178,6 +178,7 @@ public:
    bool overwrites_reg(const fs_reg &reg);
    bool is_tex();
    bool is_math();
+   bool is_control_flow();
    bool is_send_from_grf();
 
    fs_reg dst;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
index 3fbca6c..c125928 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
@@ -816,15 +816,8 @@ fs_visitor::schedule_instructions(bool post_reg_alloc)
 	 next_block_header = (fs_inst *)next_block_header->next;
 
 	 sched.add_inst(inst);
-	 if (inst->opcode == BRW_OPCODE_IF ||
-	     inst->opcode == BRW_OPCODE_ELSE ||
-	     inst->opcode == BRW_OPCODE_ENDIF ||
-	     inst->opcode == BRW_OPCODE_DO ||
-	     inst->opcode == BRW_OPCODE_WHILE ||
-	     inst->opcode == BRW_OPCODE_BREAK ||
-	     inst->opcode == BRW_OPCODE_CONTINUE) {
+         if (inst->is_control_flow())
 	    break;
-	 }
       }
       sched.calculate_deps();
       sched.schedule_instructions(next_block_header);




More information about the mesa-commit mailing list