i965/fs: Lower 32x32 bit multiplication on BXT.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_dead_control_flow.cpp
index 557c3ad75063d54759364e668a6262302c674876..61f25811cb2e51baa3fb1a560183275a3a5ae5ed 100644 (file)
  *   - if/else/endif
  */
 bool
-dead_control_flow_eliminate(backend_visitor *v)
+dead_control_flow_eliminate(backend_shader *s)
 {
    bool progress = false;
 
-   foreach_block_safe (block, v->cfg) {
+   foreach_block_safe (block, s->cfg) {
       bblock_t *if_block = NULL, *else_block = NULL, *endif_block = block;
       bool found = false;
 
@@ -52,20 +52,20 @@ dead_control_flow_eliminate(backend_visitor *v)
          continue;
 
       backend_instruction *if_inst = NULL, *else_inst = NULL;
-      backend_instruction *prev_inst = ((bblock_t *)endif_block->link.prev)->end();
+      backend_instruction *prev_inst = endif_block->prev()->end();
       if (prev_inst->opcode == BRW_OPCODE_ELSE) {
          else_inst = prev_inst;
-         else_block = (bblock_t *)endif_block->link.prev;
+         else_block = endif_block->prev();
          found = true;
 
          if (else_block->start_ip == else_block->end_ip)
-            prev_inst = ((bblock_t *)else_block->link.prev)->end();
+            prev_inst = else_block->prev()->end();
       }
 
       if (prev_inst->opcode == BRW_OPCODE_IF) {
          if_inst = prev_inst;
-         if_block = else_block != NULL ? (bblock_t *)else_block->link.prev
-                                       : (bblock_t *)endif_block->link.prev;
+         if_block = else_block != NULL ? else_block->prev()
+                                       : endif_block->prev();
          found = true;
       } else {
          /* Don't remove the ENDIF if we didn't find a dead IF. */
@@ -77,7 +77,7 @@ dead_control_flow_eliminate(backend_visitor *v)
 
          if (if_inst) {
             if (if_block->start_ip == if_block->end_ip) {
-               earlier_block = (bblock_t *)if_block->link.prev;
+               earlier_block = if_block->prev();
             } else {
                earlier_block = if_block;
             }
@@ -85,13 +85,12 @@ dead_control_flow_eliminate(backend_visitor *v)
          }
 
          if (else_inst) {
-            else_block->if_block->else_block = NULL;
             else_inst->remove(else_block);
          }
 
          if (endif_inst) {
             if (endif_block->start_ip == endif_block->end_ip) {
-               later_block = (bblock_t *)endif_block->link.next;
+               later_block = endif_block->next();
             } else {
                later_block = endif_block;
             }
@@ -102,19 +101,12 @@ dead_control_flow_eliminate(backend_visitor *v)
          if (earlier_block && earlier_block->can_combine_with(later_block)) {
             earlier_block->combine_with(later_block);
 
-            foreach_block (block, v->cfg) {
-               if (block->if_block == later_block)
-                  block->if_block = earlier_block;
-               if (block->else_block == later_block)
-                  block->else_block = earlier_block;
-            }
-
             /* If ENDIF was in its own block, then we've now deleted it and
              * merged the two surrounding blocks, the latter of which the
              * __next block pointer was pointing to.
              */
             if (endif_block != later_block) {
-               __next = (bblock_t *)earlier_block->link.next;
+               __next = earlier_block->next();
             }
          }
 
@@ -123,7 +115,7 @@ dead_control_flow_eliminate(backend_visitor *v)
    }
 
    if (progress)
-      v->invalidate_live_intervals();
+      s->invalidate_live_intervals();
 
    return progress;
 }