From: Matt Turner Date: Mon, 25 Aug 2014 02:27:09 +0000 (-0700) Subject: i965/vec4: Preserve the CFG in a few more places. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b0b64c85e4a0dafbb46405e4b3c17be24b63347f;p=mesa.git i965/vec4: Preserve the CFG in a few more places. Reviewed-by: Topi Pohjolainen --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index d5180263010..b38577a9ae1 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -426,7 +426,7 @@ try_eliminate_instruction(vec4_instruction *inst, int new_writemask, if (inst->writes_accumulator || inst->writes_flag()) { inst->dst = dst_reg(retype(brw_null_reg(), inst->dst.type)); } else { - inst->remove(); + inst->opcode = BRW_OPCODE_NOP; } return true; @@ -465,7 +465,7 @@ vec4_visitor::dead_code_eliminate() calculate_live_intervals(); - foreach_in_list_safe(vec4_instruction, inst, &instructions) { + foreach_block_and_inst(block, vec4_instruction, inst, cfg) { pc++; bool inst_writes_flag = false; @@ -526,7 +526,7 @@ vec4_visitor::dead_code_eliminate() if (inst_writes_flag) { if (scan_inst->dst.is_null() && scan_inst->writes_flag()) { - scan_inst->remove(); + scan_inst->opcode = BRW_OPCODE_NOP; progress = true; continue; } else if (scan_inst->reads_flag()) { @@ -556,8 +556,15 @@ vec4_visitor::dead_code_eliminate() } } - if (progress) - invalidate_live_intervals(); + if (progress) { + foreach_block_and_inst_safe (block, backend_instruction, inst, cfg) { + if (inst->opcode == BRW_OPCODE_NOP) { + inst->remove(block); + } + } + + invalidate_live_intervals(false); + } return progress; } @@ -693,7 +700,9 @@ vec4_visitor::opt_algebraic() { bool progress = false; - foreach_in_list(vec4_instruction, inst, &instructions) { + calculate_cfg(); + + foreach_block_and_inst(block, vec4_instruction, inst, cfg) { switch (inst->opcode) { case BRW_OPCODE_ADD: if (inst->src[1].is_zero()) { @@ -733,7 +742,7 @@ vec4_visitor::opt_algebraic() } if (progress) - invalidate_live_intervals(); + invalidate_live_intervals(false); return progress; }