glsl2: Do ir_if_return on the way out, not the way in.
authorEric Anholt <eric@anholt.net>
Thu, 29 Jul 2010 22:49:14 +0000 (15:49 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 29 Jul 2010 22:56:17 +0000 (15:56 -0700)
commit0cf545ec696ab450c3f5ee65d7a0c2a5d9dca409
tree4333aa9913ce7f21811bc8a2dd82b1ad8d1404ce
parenta62ef12ef242ecd48887df2aa2052d2ecb0979f7
glsl2: Do ir_if_return on the way out, not the way in.

The problem with doing it on the way in is that for a function with
multiple early returns, we'll move an outer block in, then restart the
pass, then move the two inside returns out, then never move outer
blocks in again because the remaining early returns are inside an else
block and they don't know that there's a return just after their
block.  By going inside-out, we get the early returns stacked up so
that they all move out with a series of
move_returns_after_block().

Fixes (on i965):
glsl-fs-raytrace-bug27060
glsl-vs-raytrace-bug26691
src/glsl/ir_if_return.cpp