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 <kenneth@whitecape.org>
This commit is contained in:
committed by
Kenneth Graunke
parent
6ff5bb2465
commit
248eaff63d
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user