Hi,<div><br></div><div>opt_constant_variable was marking a variable as constant as long as there was exactly one constant assignment to it, but did not take into account that this assignment might be in a dynamic branch or a loop.</div>
<div><br></div><div>Was happening on a fragment shader like this:</div><div><br></div><div><div>uniform float mode;</div><div>float func (float c) {</div><div>    if (mode == 2.0)</div><div>        return c; // was returning 0.1 after optimization!</div>
<div>    if (mode == 3.0)</div><div>    <span class="Apple-tab-span" style="white-space:pre">   </span>discard;</div><div>    if (mode == 10.0)</div><div>        c = 0.1;</div><div>    return c;</div><div>}</div><div>void main() {</div>
<div>    vec4 c = gl_FragCoord;</div><div>    c.x = func(c.x);</div><div>    gl_FragColor = c;</div><div>}</div><div><br><br>Now, looking further this optimization pass should also not mark variables as const if there was a dereference of them before that first assignment. I had code to do this (a hashtable that would track dereferences before assignment is done). But couldn't come up with a test case that would break the whole set of optimizations that Mesa does (lower jumps, or inlining, ... were getting in the way and hide the bug).</div>
<div><br></div><div><br></div>-- <br>Aras Pranckevičius<br>work: <a href="http://unity3d.com">http://unity3d.com</a><br>home: <a href="http://aras-p.info">http://aras-p.info</a>
<br><br></div>