diff options
author | Eric Anholt <eric@anholt.net> | 2012-06-05 11:42:25 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2013-10-10 15:54:16 -0700 |
commit | 3093085847db0455a88e45f20e29660b2b7f8515 (patch) | |
tree | b5c164dbe0dc928b36388ba13c30f06afa6686b4 /src | |
parent | b4d676d71006e5e85893d7b44740860b1b2c3425 (diff) |
i965/fs: Use the new per-channel live ranges for dead code elimination.
v2 (Kenneth Graunke): Rebase on s/live_variables/live_intervals/g.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 17 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_live_variables.h | 2 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index a046c3ca2c..74cc9cefb6 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -47,6 +47,7 @@ extern "C" { } #include "brw_fs.h" #include "main/uniforms.h" +#include "brw_fs_live_variables.h" #include "glsl/glsl_types.h" void @@ -1841,8 +1842,18 @@ fs_visitor::dead_code_eliminate() fs_inst *inst = (fs_inst *)node; if (inst->dst.file == GRF) { - assert(this->virtual_grf_end[inst->dst.reg] >= pc); - if (this->virtual_grf_end[inst->dst.reg] == pc) { + bool dead = true; + + for (int i = 0; i < inst->regs_written; i++) { + int var = live_intervals->var_from_vgrf[inst->dst.reg]; + assert(live_intervals->end[var + inst->dst.reg_offset + i] >= pc); + if (live_intervals->end[var + inst->dst.reg_offset + i] != pc) { + dead = false; + break; + } + } + + if (dead) { /* Don't dead code eliminate instructions that write to the * accumulator as a side-effect. Instead just set the destination * to the null register to free it. @@ -1855,9 +1866,9 @@ fs_visitor::dead_code_eliminate() break; default: inst->remove(); + progress = true; break; } - progress = true; } } diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h index 694ad9edc6..fa14eecd89 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h +++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h @@ -28,6 +28,8 @@ #include "brw_fs.h" #include "main/bitset.h" +class cfg_t; + namespace brw { struct block_data { |