diff options
author | Matt Turner <[email protected]> | 2014-03-24 13:23:13 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2014-04-15 09:24:09 -0700 |
commit | 596737ee91cc199a8edff5dc440736471e28f297 (patch) | |
tree | 429346859a5469e5f4941f24d96f28b0a2cbcf30 /src/mesa | |
parent | 4dcfb924176eea4f0ac892c8ec8d38090dd59d2a (diff) |
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%)
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 8 |
1 files 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 740d9ff6033..c34eec4d7dc 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(); |