glsl_to_tgsi: remove unnecessary dead code elimination pass

With the more advanced dead code elimination pass already being run,
eliminate_dead_code was making no difference in instruction count, and had
an undesirable O(n^2) runtime. So remove it and rename
eliminate_dead_code_advanced to eliminate_dead_code.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
This commit is contained in:
Bryan Cain 2014-05-05 22:23:38 -05:00
parent 1646f4d0fb
commit 4e974a9cf3
1 changed files with 5 additions and 45 deletions

View File

@ -459,8 +459,7 @@ public:
int get_last_temp_write(int index);
void copy_propagate(void);
void eliminate_dead_code(void);
int eliminate_dead_code_advanced(void);
int eliminate_dead_code(void);
void merge_registers(void);
void renumber_registers(void);
@ -3672,7 +3671,8 @@ glsl_to_tgsi_visitor::copy_propagate(void)
}
/*
* Tracks available PROGRAM_TEMPORARY registers for dead code elimination.
* On a basic block basis, tracks available PROGRAM_TEMPORARY registers for dead
* code elimination.
*
* The glsl_to_tgsi_visitor lazily produces code assuming that this pass
* will occur. As an example, a TXP production after copy propagation but
@ -3685,48 +3685,9 @@ glsl_to_tgsi_visitor::copy_propagate(void)
* and after this pass:
*
* 0: TXP TEMP[2], INPUT[4].xyyw, texture[0], 2D;
*
* FIXME: assumes that all functions are inlined (no support for BGNSUB/ENDSUB)
* FIXME: doesn't eliminate all dead code inside of loops; it steps around them
*/
void
glsl_to_tgsi_visitor::eliminate_dead_code(void)
{
int i;
for (i=0; i < this->next_temp; i++) {
int last_read = get_last_temp_read(i);
int j = 0;
foreach_list_safe(node, &this->instructions) {
glsl_to_tgsi_instruction *inst = (glsl_to_tgsi_instruction *) node;
if (inst->dst.file == PROGRAM_TEMPORARY && inst->dst.index == i &&
j > last_read)
{
inst->remove();
delete inst;
}
j++;
}
}
}
/*
* On a basic block basis, tracks available PROGRAM_TEMPORARY registers for dead
* code elimination. This is less primitive than eliminate_dead_code(), as it
* is per-channel and can detect consecutive writes without a read between them
* as dead code. However, there is some dead code that can be eliminated by
* eliminate_dead_code() but not this function - for example, this function
* cannot eliminate an instruction writing to a register that is never read and
* is the only instruction writing to that register.
*
* The glsl_to_tgsi_visitor lazily produces code assuming that this pass
* will occur.
*/
int
glsl_to_tgsi_visitor::eliminate_dead_code_advanced(void)
glsl_to_tgsi_visitor::eliminate_dead_code(void)
{
glsl_to_tgsi_instruction **writes = rzalloc_array(mem_ctx,
glsl_to_tgsi_instruction *,
@ -5270,9 +5231,8 @@ get_mesa_program(struct gl_context *ctx,
/* Perform optimizations on the instructions in the glsl_to_tgsi_visitor. */
v->simplify_cmp();
v->copy_propagate();
while (v->eliminate_dead_code_advanced());
while (v->eliminate_dead_code());
v->eliminate_dead_code();
v->merge_registers();
v->renumber_registers();