<div dir="ltr">On 31 October 2013 18:57, Matt Turner <span dir="ltr"><<a href="mailto:mattst88@gmail.com" target="_blank">mattst88@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Useful for finding the associated control flow instructions, given a<br>
block ending in one.<br>
---<br>
 src/mesa/drivers/dri/i965/brw_cfg.cpp | 34 ++++++++++++++++++++++++++++++----<br>
 src/mesa/drivers/dri/i965/brw_cfg.h   | 10 ++++++++++<br>
 2 files changed, 40 insertions(+), 4 deletions(-)<br></blockquote><div><br></div><div>Since this algorithm just uses a single global set of if_inst, else_inst, and endif_inst pointers, I don't think it will handle nested ifs properly.  We either need to make stacks for these new pointers, or we need to take richer advantage of the existing cur_if, cur_else, and cur_endif stacks.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp b/src/mesa/drivers/dri/i965/brw_cfg.cpp<br>
index e9d2bb8..7e0e9a9 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_cfg.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_cfg.cpp<br>
@@ -28,7 +28,7 @@<br>
 #include "brw_fs.h"<br>
 #include "brw_cfg.h"<br>
<br>
-/** @file brw_cfg_t.cpp<br>
+/** @file brw_cfg.cpp<br>
  *<br>
  * Walks the shader instructions generated and creates a set of basic<br>
  * blocks with successor/predecessor edges connecting them.<br>
@@ -52,6 +52,10 @@ bblock_t::bblock_t() :<br>
<br>
    parents.make_empty();<br>
    children.make_empty();<br>
+<br>
+   if_inst = NULL;<br>
+   else_inst = NULL;<br>
+   endif_inst = NULL;<br>
 }<br>
<br>
 void<br>
@@ -90,6 +94,7 @@ cfg_t::create(void *parent_mem_ctx, exec_list *instructions)<br>
    bblock_t *entry = new_block();<br>
    bblock_t *cur_if = NULL, *cur_else = NULL, *cur_endif = NULL;<br>
    bblock_t *cur_do = NULL, *cur_while = NULL;<br>
+   backend_instruction *if_inst = NULL, *else_inst = NULL, *endif_inst = NULL;<br>
    exec_list if_stack, else_stack, endif_stack, do_stack, while_stack;<br>
    bblock_t *next;<br>
<br>
@@ -121,6 +126,10 @@ cfg_t::create(void *parent_mem_ctx, exec_list *instructions)<br>
          */<br>
         cur_endif = new_block();<br>
<br>
+         if_inst = cur->end;<br>
+         else_inst = NULL;<br>
+         endif_inst = NULL;<br>
+<br>
         /* Set up our immediately following block, full of "then"<br>
          * instructions.<br>
          */<br>
@@ -134,6 +143,8 @@ cfg_t::create(void *parent_mem_ctx, exec_list *instructions)<br>
       case BRW_OPCODE_ELSE:<br>
         cur->add_successor(mem_ctx, cur_endif);<br>
<br>
+         else_inst = cur->end;<br>
+<br>
         next = new_block();<br>
         next->start = (backend_instruction *)inst->next;<br>
         cur_if->add_successor(mem_ctx, next);<br>
@@ -142,20 +153,35 @@ cfg_t::create(void *parent_mem_ctx, exec_list *instructions)<br>
         set_next_block(next);<br>
         break;<br>
<br>
-      case BRW_OPCODE_ENDIF:<br>
+      case BRW_OPCODE_ENDIF: {<br>
         cur_endif->start = (backend_instruction *)inst->next;<br>
         cur->add_successor(mem_ctx, cur_endif);<br>
+<br>
+         endif_inst = cur->end;<br>
         set_next_block(cur_endif);<br>
<br>
-        if (!cur_else)<br>
+         cur_if->if_inst = if_inst;<br>
+         cur_if->else_inst = else_inst;<br>
+         cur_if->endif_inst = endif_inst;<br>
+<br>
+        if (!cur_else) {<br>
            cur_if->add_successor(mem_ctx, cur_endif);<br>
+         } else {<br>
+            cur_else->if_inst = if_inst ;<br>
+            cur_else->else_inst = else_inst;<br>
+            cur_else->endif_inst = endif_inst;<br>
+         }<br>
+<br>
+         cur->if_inst = if_inst;<br>
+         cur->else_inst = else_inst;<br>
+         cur->endif_inst = endif_inst;<br>
<br>
         /* Pop the stack so we're in the previous if/else/endif */<br>
         cur_if = pop_stack(&if_stack);<br>
         cur_else = pop_stack(&else_stack);<br>
         cur_endif = pop_stack(&endif_stack);<br>
         break;<br>
-<br>
+      }<br>
       case BRW_OPCODE_DO:<br>
         /* Push our information onto a stack so we can recover from<br>
          * nested loops.<br>
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h b/src/mesa/drivers/dri/i965/brw_cfg.h<br>
index ec5a3a0..2ea492e 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_cfg.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_cfg.h<br>
@@ -56,6 +56,16 @@ public:<br>
    exec_list parents;<br>
    exec_list children;<br>
    int block_num;<br>
+<br>
+   /* If the current basic block ends in an IF, ELSE, or ENDIF instruction,<br>
+    * these pointers will hold the locations of the basic blocks ending in the<br>
+    * other associated control flow instructions.<br>
+    *<br>
+    * Otherwise they are NULL.<br>
+    */<br>
+   backend_instruction *if_inst;<br>
+   backend_instruction *else_inst;<br>
+   backend_instruction *endif_inst;<br>
 };<br>
<br>
 class cfg_t {<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.2<br>
<br>
</font></span></blockquote></div><br></div></div>