i965/cfg: Point to bblock_t containing associated control flow
authorMatt Turner <mattst88@gmail.com>
Wed, 16 Jul 2014 22:20:15 +0000 (15:20 -0700)
committerMatt Turner <mattst88@gmail.com>
Fri, 22 Aug 2014 17:23:34 +0000 (10:23 -0700)
... rather than pointing directly to the associated instruction. This
will let us set the block containing the IF statement's else-pointer to
NULL, when we delete a useless ELSE instruction, as in the case

   (+f0) if(8)
   ...
   else(8)
   endif(8)

Also, remove the pointer to the ENDIF, since it's unused, and it was
also potentially wrong, in the case of a basic block containing both an
ENDIF and an IF instruction:

   endif(8)
   cmp.ne.f0(8) ...
   (+f0) if(8)

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/dri/i965/brw_cfg.cpp
src/mesa/drivers/dri/i965/brw_cfg.h
src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp

index c39edad51c4e263e8605d4716353bfd1b2988bc0..3895469b0559e35320d8d1cfeb3833230bd51bee 100644 (file)
@@ -51,17 +51,14 @@ link(void *mem_ctx, bblock_t *block)
 }
 
 bblock_t::bblock_t(cfg_t *cfg) :
-   cfg(cfg), start_ip(0), end_ip(0), num(0)
+   cfg(cfg), start_ip(0), end_ip(0), num(0),
+   if_block(NULL), else_block(NULL)
 {
    start = NULL;
    end = NULL;
 
    parents.make_empty();
    children.make_empty();
-
-   if_inst = NULL;
-   else_inst = NULL;
-   endif_inst = NULL;
 }
 
 void
@@ -183,32 +180,25 @@ cfg_t::cfg_t(exec_list *instructions)
             set_next_block(&cur, cur_endif, ip - 1);
          }
 
-         backend_instruction *else_inst = NULL;
          if (cur_else) {
-            else_inst = (backend_instruction *)cur_else->end;
-
             cur_else->add_successor(mem_ctx, cur_endif);
          } else {
             cur_if->add_successor(mem_ctx, cur_endif);
          }
 
          assert(cur_if->end->opcode == BRW_OPCODE_IF);
-         assert(!else_inst || else_inst->opcode == BRW_OPCODE_ELSE);
-         assert(inst->opcode == BRW_OPCODE_ENDIF);
+         assert(!cur_else || cur_else->end->opcode == BRW_OPCODE_ELSE);
 
-         cur_if->if_inst = cur_if->end;
-         cur_if->else_inst = else_inst;
-         cur_if->endif_inst = inst;
+         cur_if->if_block = cur_if;
+         cur_if->else_block = cur_else;
 
         if (cur_else) {
-            cur_else->if_inst = cur_if->end;
-            cur_else->else_inst = else_inst;
-            cur_else->endif_inst = inst;
+            cur_else->if_block = cur_if;
+            cur_else->else_block = cur_else;
          }
 
-         cur->if_inst = cur_if->end;
-         cur->else_inst = else_inst;
-         cur->endif_inst = inst;
+         cur->if_block = cur_if;
+         cur->else_block = cur_else;
 
         /* Pop the stack so we're in the previous if/else/endif */
         cur_if = pop_stack(&if_stack);
index d6e11050ff90a5881c6c380b34f130344073e73c..ecbb996244e8481408a8b9638b2108f323449150 100644 (file)
@@ -76,15 +76,13 @@ struct bblock_t {
    struct exec_list children;
    int num;
 
-   /* If the current basic block ends in an IF, ELSE, or ENDIF instruction,
-    * these pointers will hold the locations of the other associated control
-    * flow instructions.
+   /* If the current basic block ends in an IF or ELSE instruction, these will
+    * point to the basic blocks containing the other associated instruction.
     *
     * Otherwise they are NULL.
     */
-   struct backend_instruction *if_inst;
-   struct backend_instruction *else_inst;
-   struct backend_instruction *endif_inst;
+   struct bblock_t *if_block;
+   struct bblock_t *else_block;
 };
 
 struct cfg_t {
index 5c79296f5a8150e1d057a918f91f33f73650f554..d64cd98343aa02b3c4b941f56b58638667a60a95 100644 (file)
@@ -137,10 +137,10 @@ fs_visitor::opt_peephole_sel()
       if (if_inst->opcode != BRW_OPCODE_IF)
          continue;
 
-      if (!block->else_inst)
+      if (!block->else_block)
          continue;
 
-      fs_inst *else_inst = (fs_inst *) block->else_inst;
+      fs_inst *else_inst = (fs_inst *) block->else_block->end;
       assert(else_inst->opcode == BRW_OPCODE_ELSE);
 
       fs_inst *else_mov[MAX_MOVS] = { NULL };