diff options
author | Matt Turner <[email protected]> | 2014-09-03 23:52:26 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2014-09-05 09:52:50 -0700 |
commit | 248eaff63d9a5484df1105a0c484d20e086f5f83 (patch) | |
tree | d51d3e4997bd4e5030c4aef89718e9e8ad521c66 | |
parent | 6ff5bb24658c55c28e462c657816fda2d8e53a65 (diff) |
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 <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
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; } |