[Mesa-dev] [PATCH 06/11] glsl: Refactor logic for determining whether to lower return statements.

Paul Berry stereotype441 at gmail.com
Fri Jul 8 09:04:31 PDT 2011

On 7 July 2011 10:53, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On 07/07/2011 09:56 AM, Paul Berry wrote:
>> On 7 July 2011 01:16, Kenneth Graunke <kenneth at whitecape.org> wrote:
>>> What exactly is the difference between lowering returns in "main" and
>>> lowering them in other subroutines?  void vs. non-void is definitely
>>> different, but I don't see why main is special.  Looking at the code, it
>>> doesn't actually seem to use lower_main_return anywhere...
>> There's no difference in how returns are lowered in "main" and in
>> subroutines.  The difference is in whether or not we lower returns.
>> For instance, when _mesa_ir_link_shader() calls do_lower_jumps(), it
>> always asks it to lower returns in subroutines (presumably to
>> facilitate inlining), but it only asks it to lower returns in main if
>> options->EmitNoMainReturn is true.
> You're right of course, sorry...I somehow missed that
> lower_main_return/lower_sub_return were options to the lowering pass.
> I didn't realize that lower_jumps was needed for inlining (though it
> sure makes sense).  opt_function_inlining.cpp has its own code for
> this---the "replace_return_with_assignment" function.  Looking at that
> again, it's fairly limited...it doesn't do any guarding in the case of
> conditional returns...so it's really only useful for replacing the
> canonical jump at the end of a non-void function.
> Yet, we're using visit_tree with replace_return_with_assignment.  I
> believe that this means we're actually walking over the whole IR tree
> for the function (including all the expression trees!) looking for
> returns.  That seems wasteful---if we're using lower_jumps, we know
> exactly where it is...it's the last instruction.
> Furthermore, I think can_inline probably ought to be altered.  Right now
> it returns true if there's only one "return".  But it doesn't seem to be
> checking that it's the _canonical_ return.
> Without lower_jumps, I think the following code would be incorrectly
> inlined:
> uniform bool b;
> float foo() {
>    if (b)
>        return 0.0;
>    gl_FragColor = vec4(1, 0, 0, 1);
>    return 1.0;
> }
> IOW, opt_function_inlining has broken code, but we're not seeing any
> ill-effects because we run lower_jumps first, which fixes things.  We
> should probably make that dependency explicitly clear.

That's a good point.  I'll make a note to have a look at that when I'm
finished working on lower_jumps.

More information about the mesa-dev mailing list