summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2014-03-24 13:23:13 -0700
committerMatt Turner <[email protected]>2014-04-15 09:24:09 -0700
commit596737ee91cc199a8edff5dc440736471e28f297 (patch)
tree429346859a5469e5f4941f24d96f28b0a2cbcf30 /src
parent4dcfb924176eea4f0ac892c8ec8d38090dd59d2a (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')
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp8
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();