summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2014-03-24 13:23:13 -0700
committerMatt Turner <mattst88@gmail.com>2014-04-15 09:24:09 -0700
commit596737ee91cc199a8edff5dc440736471e28f297 (patch)
tree429346859a5469e5f4941f24d96f28b0a2cbcf30
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%)
-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();