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:
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user