diff options
author | Eric Anholt <[email protected]> | 2011-08-17 10:50:17 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2011-08-19 17:06:29 -0700 |
commit | 8174945d3346dc049ae56dcb4bf1eab39f5c88aa (patch) | |
tree | f90feb78c9d39371a3baa63d6b9d04ca4c20350b /src/mesa/drivers/dri/i965/brw_vec4.cpp | |
parent | 3dadc1e3cceac80a1b63cad2e10f0e0f8904531b (diff) |
i965/vs: Add simple dead code elimination.
This is copied right from the fragment shader. It is needed for real
register allocation to work correctly.
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_vec4.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index a3ed31a9da0..760bc1f7acd 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -127,4 +127,35 @@ vec4_visitor::virtual_grf_interferes(int a, int b) return start < end; } +/** + * Must be called after calculate_live_intervales() to remove unused + * writes to registers -- register allocation will fail otherwise + * because something deffed but not used won't be considered to + * interfere with other regs. + */ +bool +vec4_visitor::dead_code_eliminate() +{ + bool progress = false; + int pc = 0; + + calculate_live_intervals(); + + foreach_list_safe(node, &this->instructions) { + vec4_instruction *inst = (vec4_instruction *)node; + + if (inst->dst.file == GRF && this->virtual_grf_use[inst->dst.reg] <= pc) { + inst->remove(); + progress = true; + } + + pc++; + } + + if (progress) + live_intervals_valid = false; + + return progress; +} + } /* namespace brw */ |