[Mesa-dev] [PATCH 092/133] nir: Add a pass to lower local variables to registers

Jason Ekstrand jason at jlekstrand.net
Wed Jan 14 14:13:15 PST 2015


On Wed, Jan 14, 2015 at 1:10 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:

> On Fri, Jan 9, 2015 at 8:27 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> >
> >
> > On Fri, Jan 9, 2015 at 4:38 PM, Connor Abbott <cwabbott0 at gmail.com>
> wrote:
> >>
> >> >>>> +      case nir_intrinsic_copy_var:
> >> >>>> +         unreachable("There should be no copies whatsoever at this
> >> >>>> point");
> >> >>>> +         break;
> >> >>>
> >> >>>
> >> >>> Are you sure about this? My impression is that lower_variables will
> >> >>> lower
> >> >>> copies involving things that aren't indirectly referenced, but if
> you
> >> >>> have
> >> >>> something like:
> >> >>>
> >> >>> foo[i] = ...
> >> >>> bar[*] = foo[*];
> >> >>> ... = bar[i];
> >> >>>
> >> >>> then the copy in the middle won't get lowered, unless there's
> >> >>> something
> >> >>> else I'm missing that will lower it.
> >> >>
> >> >>
> >> >> Yeah, there may be something missing there.  I have a pass lying
> around
> >> >> somewhere that lowers all copies.  Unfortunately, I've never actually
> >> >> seen
> >> >> this happen in the wild so It's untested.  I'll try and cook
> something
> >> >> up
> >> >> that I think is reliable.
> >> >
> >> >
> >> > Ok, more info.  Right now, GLSL IR is lowering all truely indirect
> >> > accesses
> >> > to if-ladders right now so we can never hit this.  Once we can handle
> >> > indirects in the backends or generate the if-ladders in NIR, we will
> >> > need
> >> > this.  Until then, let's leave it as-is to reduce the ammount of
> >> > untested
> >> > code.
> >> > --Jason
> >>
> >> Huh, that's weird... it lowers input/output indirect accesses to
> >> if-ladders, but not temporary indirect references, right? So wouldn't
> >> something like:
> >
> >
> > It appears to lower locals as well.
> >
> >>
> >>
> >> uniform int i;
> >> uniform bool f; /* false */
> >> in vec4 in_array[20];
> >> out vec4 color;
> >>
> >> void main()
> >> {
> >>    vec4 foo[20], bar[20], temp[20];
> >>    foo = in_array;
> >>    foo[i] = 0.0f;
> >>    while (f) {
> >>       temp = foo;
> >>       temp[i] = 1.0f;
> >>       foo = bar;
> >>       bar = temp;
> >>    }
> >>    bar[i] = 2.0f;
> >>    color = bar[0];
> >> }
> >>
> >> where GLSL IR can't eliminate the copies and doesn't turn the indirect
> >> references into if-ladders, and we can't lower them to SSA values,
> >> trigger the bug? If GLSL did turn everything into if-ladders, then
> >> this entire pass as well as half of lower_variables would be dead
> >> code...
> >
> >
> > I think we have a lot of dead code...
> >
>
> That's for sure! I thought about this a little more, and while you may
> not like it, I think we should still have the code to lower the
> remaining wildcard copies, even if it's dead code for now. Right now,
> I'd say more than half of the variable lowering code is currently
> dead, so I'm not so swayed by the "but it's more dead code!" argument
> -- we already have a *lot* of dead code, so let's at least fix a known
> bug in it rather than making it even more confusing. I think that the
> only way it would make sense to not go all the way is if we stripped
> out everything else, but that doesn't make that much sense after I
> went through all this work to review it all.
>

Agreed.  I'll put a pass together.  It shouldn't take me long.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150114/162f43f7/attachment-0001.html>


More information about the mesa-dev mailing list