i965/vec4: Let DCE eliminate dead writes in other basic blocks.
authorMatt Turner <mattst88@gmail.com>
Mon, 24 Mar 2014 20:23:13 +0000 (13:23 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 15 Apr 2014 16:24:09 +0000 (09:24 -0700)
We previously stopped searching for unread writes after encountering
control flow, but we can instead just search backwards until we hit
control flow.

instructions in affected programs:     22854 -> 22194 (-2.89%)

src/mesa/drivers/dri/i965/brw_vec4.cpp

index 740d9ff60339507c86a3f30c3df82c8ffded103b..c34eec4d7dc71f6245641961d1dccf46fca69f63 100644 (file)
@@ -378,7 +378,6 @@ bool
 vec4_visitor::dead_code_eliminate()
 {
    bool progress = false;
-   bool seen_control_flow = false;
    int pc = -1;
 
    calculate_live_intervals();
@@ -388,8 +387,6 @@ vec4_visitor::dead_code_eliminate()
 
       pc++;
 
-      seen_control_flow = inst->is_control_flow() || seen_control_flow;
-
       bool inst_writes_flag = false;
       if (inst->dst.file != GRF) {
          if (inst->dst.is_null() && inst->writes_flag()) {
@@ -415,7 +412,7 @@ vec4_visitor::dead_code_eliminate()
                     progress;
       }
 
-      if (seen_control_flow || inst->predicate || inst->prev == NULL)
+      if (inst->predicate || inst->prev == NULL)
          continue;
 
       int dead_channels;
@@ -443,6 +440,9 @@ vec4_visitor::dead_code_eliminate()
            node = prev, prev = prev->prev) {
          vec4_instruction *scan_inst = (vec4_instruction  *)node;
 
+         if (scan_inst->is_control_flow())
+            break;
+
          if (inst_writes_flag) {
             if (scan_inst->dst.is_null() && scan_inst->writes_flag()) {
                scan_inst->remove();