i965/fs: Pass block to insert and remove functions missed earlier.
authorMatt Turner <mattst88@gmail.com>
Thu, 4 Sep 2014 06:52:26 +0000 (23:52 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 5 Sep 2014 16:52:50 +0000 (09:52 -0700)
Otherwise, the basic block start/end IPs don't get updated properly,
leading to a broken CFG.  This usually results in the following
assertion failure:

brw_fs_live_variables.cpp:141:
void brw::fs_live_variables::setup_def_use():
Assertion `ip == block->start_ip' failed.

Fixes KWin, WebGL demos, and a score of Piglit tests on Sandybridge and
earlier hardware.

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

index ab11a79dfa19653f54ee946ab4f89d3909392418..23a8f2ff80dbb7e85c47fb80da35f8bf4ce1c8ee 100644 (file)
@@ -2151,7 +2151,7 @@ fs_visitor::compute_to_mrf()
 
    calculate_live_intervals();
 
-   foreach_in_list_safe(fs_inst, inst, &instructions) {
+   foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
       int ip = next_ip;
       next_ip++;
 
@@ -2229,7 +2229,7 @@ fs_visitor::compute_to_mrf()
               scan_inst->dst.file = MRF;
               scan_inst->dst.reg = inst->dst.reg;
               scan_inst->saturate |= inst->saturate;
-              inst->remove();
+              inst->remove(block);
               progress = true;
            }
            break;
@@ -2342,7 +2342,7 @@ fs_visitor::try_rep_send()
     * destination registers in our block of MOVs.
     */
    count = 0;
-   foreach_in_list_safe(fs_inst, inst, &this->instructions) {
+   foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
       if (count == 0)
          start = inst;
       if (inst->opcode == BRW_OPCODE_MOV &&
@@ -2381,9 +2381,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(mov);
+         start->insert_before(block, mov);
          for (i = 0; i < 4; i++)
-            mov->next->remove();
+            ((fs_inst *) mov->next)->remove(block);
 
          /* Finally, adjust the message length and set the opcode to
           * REP_FB_WRITE for the send, so that the generator will use the
@@ -3147,14 +3147,14 @@ fs_visitor::opt_drop_redundant_mov_to_flags()
 {
    bool flag_mov_found[2] = {false};
 
-   foreach_in_list_safe(fs_inst, inst, &instructions) {
+   foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
       if (inst->is_control_flow()) {
          memset(flag_mov_found, 0, sizeof(flag_mov_found));
       } else if (inst->opcode == FS_OPCODE_MOV_DISPATCH_TO_FLAGS) {
          if (!flag_mov_found[inst->flag_subreg])
             flag_mov_found[inst->flag_subreg] = true;
          else
-            inst->remove();
+            inst->remove(block);
       } else if (inst->writes_flag()) {
          flag_mov_found[inst->flag_subreg] = false;
       }