glsl: fix glsl optimization infinite loop from copy_propagation_elements
authorAndy Clayton <q3aiml@gmail.com>
Fri, 6 Jan 2012 03:17:53 +0000 (21:17 -0600)
committerEric Anholt <eric@anholt.net>
Mon, 9 Jan 2012 21:05:21 +0000 (13:05 -0800)
commit6c29452f38dacace4f234e9526bfdc1e23fb5051
tree50f95c36005f725928a8c4d60b7297be2a944666
parent6afa7cdf93906a9151a6de2f312ab5795c0ce9ec
glsl: fix glsl optimization infinite loop from copy_propagation_elements

The trick was to produce an assignment in the IR along the lines of:

      (assign  (xyzw) (var_ref R0)  (swiz wwww (var_ref R0) ))

which occurs only rarely even in code that looks like it should do
this, because of the assignment temporaries generated in ast_to_hir.

From the IR above, this optimization pass would then propagate
references of R0 into R0.wwww (seems reasonable), but without this
patch, a later reference of R0.wwww would see R0 first, turning that
into R0.wwww.wwww, which triggered opt_swizzle_swizzle, and then we
looped back to this code to do it again.  Avoid that by skipping over
the usual ir_rvalue visitor's ir_swizzle hook, so that we get
handle_rvalue() on the ir_swizzle itself, not its referenced value.
Looking at only the swizzle will always optimize away at least as much
as looking at the swizzle's refererenced value.

We now still claim to propagate r0.w into r0.w, but at least we don't
trigger the loop.

v2: Rewrite commit message (changes by anholt)

Fixes piglit glsl-copy-propagation-self-1
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=34006
src/glsl/opt_copy_propagation_elements.cpp