glsl: Correctly return progress from lower_variable_index_to_cond_assign

lower_variable_index_to_cond_assign runs until it can't make any more
progress.  It then returns the result of the last pass which will
always be false.  This caused the lowering loop in
_mesa_ir_link_shader to end before doing one last round of
lower_if_to_cond_assign.  This caused several if-statements (resulting
from lower_variable_index_to_cond_assign) to be left in the IR.

In addition to this change, lower_variable_index_to_cond_assign should
take a flag indicating whether or not it should even generate
if-statements.  This is easily controlled by
switch_generator::linear_sequence_max_length.  This would generate
much better code on architectures without any flow contol.

Fixes i915 piglit regressions glsl-texcoord-array and
glsl-fs-vec4-indexing-temp-src.

Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Ian Romanick 2011-07-25 18:33:40 -07:00
parent 99fba503b1
commit c1e591eed4

View file

@ -525,10 +525,12 @@ lower_variable_index_to_cond_assign(exec_list *instructions,
* matrix columns of an array of matrix), each pass will only lower one * matrix columns of an array of matrix), each pass will only lower one
* level of indirection. * level of indirection.
*/ */
bool progress_ever = false;
do { do {
v.progress = false; v.progress = false;
visit_list_elements(&v, instructions); visit_list_elements(&v, instructions);
progress_ever = v.progress || progress_ever;
} while (v.progress); } while (v.progress);
return v.progress; return progress_ever;
} }