i965/fs: Fix basic block tracking in try_rep_send().
authorMatt Turner <mattst88@gmail.com>
Fri, 5 Sep 2014 03:08:16 +0000 (20:08 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 5 Sep 2014 16:53:21 +0000 (09:53 -0700)
The 'start' instruction is always in the current block, except for the
case of shader time, which emits code in a pattern seen no where else.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs.cpp

index 23a8f2f..20acafa 100644 (file)
@@ -2314,6 +2314,7 @@ fs_visitor::try_rep_send()
 {
    int i, count;
    fs_inst *start = NULL;
+   bblock_t *mov_block;
 
    /* From the Ivybridge PRM, Volume 4 Part 1, section 3.9.11.2
     * ("Message Descriptor - Render Target Write"):
@@ -2343,15 +2344,19 @@ fs_visitor::try_rep_send()
     */
    count = 0;
    foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
-      if (count == 0)
+      if (count == 0) {
          start = inst;
+         mov_block = block;
+      }
       if (inst->opcode == BRW_OPCODE_MOV &&
          inst->dst.file == MRF &&
           inst->dst.reg == start->dst.reg + 2 * count &&
           inst->src[0].file == HW_REG &&
           inst->src[0].reg_offset == start->src[0].reg_offset + count) {
-         if (count == 0)
+         if (count == 0) {
             start = inst;
+            mov_block = block;
+         }
          count++;
       }
 
@@ -2381,9 +2386,9 @@ fs_visitor::try_rep_send()
          mov->dst.type = BRW_REGISTER_TYPE_F;
 
          /* Replace the four MOVs with the new vec4 MOV. */
-         start->insert_before(block, mov);
+         start->insert_before(mov_block, mov);
          for (i = 0; i < 4; i++)
-            ((fs_inst *) mov->next)->remove(block);
+            ((fs_inst *) mov->next)->remove(mov_block);
 
          /* Finally, adjust the message length and set the opcode to
           * REP_FB_WRITE for the send, so that the generator will use the