From 596737ee91cc199a8edff5dc440736471e28f297 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Mon, 24 Mar 2014 13:23:13 -0700 Subject: [PATCH] i965/vec4: Let DCE eliminate dead writes in other basic blocks. We previously stopped searching for unread writes after encountering control flow, but we can instead just search backwards until we hit control flow. instructions in affected programs: 22854 -> 22194 (-2.89%) --- src/mesa/drivers/dri/i965/brw_vec4.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 740d9ff..c34eec4 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -378,7 +378,6 @@ bool vec4_visitor::dead_code_eliminate() { bool progress = false; - bool seen_control_flow = false; int pc = -1; calculate_live_intervals(); @@ -388,8 +387,6 @@ vec4_visitor::dead_code_eliminate() pc++; - seen_control_flow = inst->is_control_flow() || seen_control_flow; - bool inst_writes_flag = false; if (inst->dst.file != GRF) { if (inst->dst.is_null() && inst->writes_flag()) { @@ -415,7 +412,7 @@ vec4_visitor::dead_code_eliminate() progress; } - if (seen_control_flow || inst->predicate || inst->prev == NULL) + if (inst->predicate || inst->prev == NULL) continue; int dead_channels; @@ -443,6 +440,9 @@ vec4_visitor::dead_code_eliminate() node = prev, prev = prev->prev) { vec4_instruction *scan_inst = (vec4_instruction *)node; + if (scan_inst->is_control_flow()) + break; + if (inst_writes_flag) { if (scan_inst->dst.is_null() && scan_inst->writes_flag()) { scan_inst->remove(); -- 2.7.4