From: Matt Turner <matts...@gmail.com> 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. --- src/mesa/drivers/dri/i965/brw_fs.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) Here's a patch I cooked up that fixes all of the ip == block->start_ip assertion failures that have shown up in all kinds of programs on Sandybridge and earlier hardware. Those platforms are basically unusable without this patch. I put Matt's authorship on it, because it's basically his patch with the same name from his recent 20 patch series (awaiting review on the list), but in a form that we can apply now, without taking the other 19 patches (which could cause other regressions). It seems worth fixing the major problems now, and then evaluating the rest of the patches as usual. diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 5f98287..69982c5 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; } -- 2.0.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev