glsl: Fix handling of function calls inside nested loops.
authorPaul Berry <stereotype441@gmail.com>
Thu, 28 Nov 2013 19:06:43 +0000 (11:06 -0800)
committerPaul Berry <stereotype441@gmail.com>
Mon, 9 Dec 2013 18:54:20 +0000 (10:54 -0800)
commitcb38a0dc0aaa0a5cbc2a5345ecee3c17d9d46987
treef3128e66e0d6ab2c4130d84ccfab24532b0701eb
parent877db5a792df7f5971c1906a3677b066926b9832
glsl: Fix handling of function calls inside nested loops.

Previously, when visiting an ir_call, loop analysis would only mark
the innermost enclosing loop as containing a call.  As a result, when
encountering a loop like this:

    for (i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        foo();
      }
    }

it would incorrectly conclude that the outer loop ran three times.
(This is not certain; if foo() modifies i, then the outer loop might
run more or fewer times).

Fixes piglit test "vs-call-in-nested-loop.shader_test".

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/loop_analysis.cpp