<p dir="ltr"><br>
On Feb 2, 2015 10:59 PM, "Kenneth Graunke" <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>> wrote:<br>
><br>
> On Monday, February 02, 2015 10:28:22 PM Jason Ekstrand wrote:<br>
> > On Mon, Feb 2, 2015 at 9:08 PM, Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
> > wrote:<br>
> ><br>
> > > On Thursday, January 29, 2015 01:40:18 PM Jason Ekstrand wrote:<br>
> [snip]<br>
> > > > +static bool<br>
> > > > +is_phi_src_scalarizable(nir_phi_src *src,<br>
> > > > +                        struct lower_phis_to_scalar_state *state)<br>
> > > > +{<br>
> > > > +   /* Don't know what to do with non-ssa sources */<br>
> > > > +   if (!src->src.is_ssa)<br>
> > ><br>
> > > Can phi nodes with non-SSA sources even exist?  That sounds crazy.<br>
> > > Perhaps just assert(src->src.is_ssa)?<br>
> > ><br>
> ><br>
> > It's possible.  We should probably disallow it as we can't coalesce them<br>
> > anyway, but it can happen at the moment.<br>
><br>
> Really?  That sounds scary - what does phi(non-SSA values) even mean?</p>
<p dir="ltr">Yeah, I'll look into that and get it disallowed. We shouldn't be getting non-SSA phi sources.  I just seem to remember them happening for some reason.</p>
<p dir="ltr">> [snip]<br>
> > > Perhaps add:<br>
> > ><br>
> > >       case nir_intrinsic_load_uniform:<br>
> > >       case nir_intrinsic_load_const:<br>
> > >          return true;<br>
> > ><br>
> > > so that the pass could handle this same concept after nir_lower_io()?<br>
> > ><br>
> ><br>
> > I have a patch floating arround that adds load_const and it helps by a few<br>
> > instructions.  We should probably do the same for inputs and uniforms but I<br>
> > thought I had some reason not to.  Can't remember what it is now.<br>
><br>
> Huh.  I'm not sure why it'd break - you're already doing it for input<br>
> and uniform /variables/...</p>
<p dir="ltr">Right... Sure, I'll add that.</p>
<p dir="ltr">> [snip]<br>
> > ><br>
> > > > +    * won't automatically make us fail to scalarize.<br>
> > > > +    */<br>
> > > > +   entry = _mesa_hash_table_insert(state->phi_table, phi, (void<br>
> > > *)(intptr_t)1);<br>
> > ><br>
> > > This is weird.  Why are you using a hash table and not a set?  It sounds<br>
> > > like you're trying to store a tri-state: unknown (no entry in hash<br>
> > > table), known-not-scalarizable (entry in hash table, value of 0), and<br>
> > > known-scalarizable (entry in hash table, value of 1).<br>
> > ><br>
> > > However, I don't see any code that actually inserts or updates a value<br>
> > > to 0 - are you missing some code?<br>
> > ><br>
> > > Otherwise, this looks good to me...<br>
> > ><br>
> > > > +<br>
> > > > +   bool scalarizable = true;<br>
> > > > +<br>
> > > > +   nir_foreach_phi_src(phi, src) {<br>
> > > > +      scalarizable = is_phi_src_scalarizable(src, state);<br>
> > > > +      if (!scalarizable)<br>
> > > > +         break;<br>
> > > > +   }<br>
> > > > +<br>
> > > > +   entry->data = (void *)(intptr_t)scalarizable;<br>
> > ><br>
> ><br>
> > It's updated right here ^^<br>
><br>
> So it is!  I was expecting to see a search/remove/insert, and overlooked<br>
> the fact that you're getting a hash_entry pointer (rather than the<br>
> value) and editing the data.  That seems fine.<br>
><br>
> This is:<br>
> Reviewed-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>></p>
<p dir="ltr">Thanks!</p>
<p dir="ltr">> with the concern that non-SSA phi sources still sound bizarre.<br>
</p>