From: Matt Turner Date: Thu, 4 Sep 2014 06:52:26 +0000 (-0700) Subject: i965/fs: Pass block to insert and remove functions missed earlier. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=248eaff63d9a5484df1105a0c484d20e086f5f83;p=mesa.git i965/fs: Pass block to insert and remove functions missed earlier. 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 --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index ab11a79dfa1..23a8f2ff80d 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -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; }