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.
This commit is contained in:
Eric Anholt
2011-08-17 10:50:17 -07:00
parent 3dadc1e3cc
commit 8174945d33
3 changed files with 38 additions and 0 deletions
+31
View File
@@ -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 */
+1
View File
@@ -381,6 +381,7 @@ public:
void reg_allocate();
void move_grf_array_access_to_scratch();
void calculate_live_intervals();
bool dead_code_eliminate();
bool virtual_grf_interferes(int a, int b);
vec4_instruction *emit(enum opcode opcode);
@@ -558,6 +558,12 @@ vec4_visitor::run()
*/
move_grf_array_access_to_scratch();
bool progress;
do {
progress = false;
progress = dead_code_eliminate() || progress;
} while (progress);
if (failed)
return false;