<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 29, 2016 at 12:01 PM, Francisco Jerez <span dir="ltr"><<a href="mailto:currojerez@riseup.net" target="_blank">currojerez@riseup.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> writes:<br>
<br>
> Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> writes:<br>
><br>
>> On Fri, May 27, 2016 at 7:05 PM, Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>><br>
>> wrote:<br>
>><br>
>>> This fixes the few code quality regressions from the previous series<br>
>>> enabling SIMD32 CS codegen in the back-end -- AFAICT by the end of the<br>
>>> series we can finally enable GL 4.3 on all Gen8+ hardware.<br>
>>><br>
>>> Patches 1-8 delay the SIMD lowering pass after the bulk of<br>
>>> optimization passes have been run, which should decrease the<br>
>>> compilation time of mainly SIMD32 shaders and improve the code quality<br>
>>> of SIMD32 shaders on all generations and shaders of any dispatch width<br>
>>> on older generations (up to and including IVB) that use SIMD lowering<br>
>>> more intensively to implement various workarounds.<br>
>>><br>
>>> Patches 9-14 rework the SIMD lowering pass to avoid emitting the copy<br>
>>> instructions used to zip and unzip register regions where possible,<br>
>>> since the register coalesce and copy propagation passes seem to<br>
>>> perform rather poorly at getting rid of them in some cases.  In the<br>
>>> long term we'll likely want to improve the register coalesce pass<br>
>>> irrespective of these changes.<br>
>>><br>
>>> Patches 15-20 improve the compute-to-mrf pass used on Gen4-6 to handle<br>
>>> cases where the source of a VGRF-to-MRF copy is initialized by the<br>
>>> shader using multiple single-GRF writes, which becomes far more common<br>
>>> with the additional SIMD lowering going on after this series.<br>
>>><br>
>>> Patches 21-24 are some other assorted changes improving code quality<br>
>>> on older gens.<br>
>>><br>
>>> I wanted to provide more detailed (e.g. per commit) shader-db stats<br>
>>> with this series, but kind of ran out of time.  Let me know if you<br>
>>> would like to see more evidence that any of the changes below is<br>
>>> improving code quality in case it's not clear from the commit alone.<br>
>>><br>
>>> [PATCH 01/25] i965/fs: Let CSE handle logical sampler sends as expressions.<br>
>>> [PATCH 02/25] i965/fs: Allow constant propagation into logical send<br>
>>> sources.<br>
>>> [PATCH 03/25] i965/fs: Add FS_OPCODE_FB_WRITE_LOGICAL to<br>
>>> has_side_effects().<br>
>>> [PATCH 04/25] i965/fs: Run SIMD and logical send lowering after the<br>
>>> optimization loop.<br>
>>> [PATCH 05/25] i965/fs: Take opt_redundant_discard_jumps out of the<br>
>>> optimization loop.<br>
>>> [PATCH 06/25] i965/fs: Fix UB list sentinel dereference in<br>
>>> opt_sampler_eot().<br>
>>> [PATCH 07/25] i965/fs: Implement opt_sampler_eot() in terms of logical<br>
>>> sends.<br>
>><br>
>> [PATCH 08/25] SQUASH: i965/fs: Add basic dataflow check to<br>
>>> opt_sampler_eot().<br>
>>><br>
>><br>
>><br>
>>> [PATCH 09/25] i965/fs: Refactor offset() into a separate function taking<br>
>>> the width as argument.<br>
>>> [PATCH 10/25] i965/fs: Generalize regions_overlap() from copy propagation<br>
>>> to handle non-VGRF files.<br>
>>> [PATCH 11/25] i965/fs: Factor out region zipping and unzipping from the<br>
>>> SIMD lowering pass.<br>
>>> [PATCH 12/25] i965/fs: Skip SIMD lowering source unzipping for regular<br>
>>> scalar regions.<br>
>>> [PATCH 13/25] i965/fs: Skip SIMD lowering destination zipping if possible.<br>
>>> [PATCH 14/25] i965/fs: Reindent emit_zip().<br>
>>><br>
>><br>
>> 9-14 Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
>><br>
>><br>
>>> [PATCH 15/25] i965/fs: Teach regions_overlap() about COMPR4 MRF regions.<br>
>>> [PATCH 16/25] i965/fs: Simplify and improve accuracy of compute_to_mrf()<br>
>>> by using regions_overlap().<br>
>>> [PATCH 17/25] i965/fs: Fix compute-to-mrf VGRF region coverage condition.<br>
>>> [PATCH 18/25] i965/fs: Refactor compute_to_mrf() to split search and<br>
>>> rewrite into separate loops.<br>
>>> [PATCH 19/25] i965/fs: Teach compute_to_mrf about the COMPR4 address<br>
>>> transformation.<br>
>>> [PATCH 20/25] i965/fs: Extend compute_to_mrf() to coalesce VGRFs<br>
>>> initialized by multiple single-GRF writes.<br>
>>> [PATCH 21/25] i965/fs: Extend remove_duplicate_mrf_writes() to handle<br>
>>> non-VGRF to MRF copies.<br>
>>><br>
>><br>
>> 15-21 scare me.  A lot.  They even make me think that forking the compiler<br>
>> between SNB and IVB may be a good idea. :-/  MRFs are annoying, but COMPR4<br>
>> is such a gross hack that I really want to teach as little of the compiler<br>
>> about it as possible.<br>
>><br>
> Heh, my impression (from writing the patches) is that COMPR4 was the<br>
> easiest part of it, it's not entirely unlike the usual Align1 source<br>
> regions -- with hard-wired width and vstride.  I agree it's kind of a<br>
> gross hardware feature but all it took to handle it in compute-to-mrf<br>
> was some simple arithmetic [it would get slightly more complex if<br>
> compute-to-mrf attempted to handle COMPR4 LOAD_PAYLOAD instructions, but<br>
> I don't think it would necessarily be an insane idea].<br>
><br>
> Honestly, what made patches 16-20 really hard to write (and maybe also<br>
> hard to review, I don't know), was disentangling the highly<br>
> special-cased and dubious dataflow logic of the compute-to-mrf pass<br>
> (patches 16 and 17 could qualify as bugfixes...), and that had little to<br>
<br>
</div></div>Uhm, I just noticed that patch 20 is effectively a bugfix too, because<br>
right now the compute-to-mrf pass only looks at and rewrites the *first*<br>
def it encounters of the VGRF it's coalescing away, so it will end up<br>
corrupting the program if there was more than one def of the VGRF region<br>
read by the copy instruction, because the copy instruction is removed.<br>
<br>
I don't see any reason why this bug wouldn't be possible on master<br>
already, but it definitely causes piglit regressions on Gen4-6 in<br>
combination with patch 11 just because the ordering in which the zipping<br>
instructions are emitted happens to change.  I'm afraid we need to land<br>
patches 16-20 before patch 11...<br></blockquote><div><br></div><div>Ok, I think the conclusion of the matter is that I don't like compute_to_mrf...  The patches look correct and I *think* they are strictly an improvement but compute_to_mrf looks like it will probably just fall over if it encounters a partial write.  Your plan of making register_coalesce handle MRFs is probably the best long-term plan.  For now,<br><br></div><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br><br></div><div>I just hope we aren't opening a giant can of worms...  (The can was already open)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
> do with COMPR4 or even with MRFs.  Compute-to-mrf is a crappy register<br>
> coalescing pass that can only handle a small subset of the cases where<br>
> one could possibly elide VGRF-to-MRF copies.<br>
><br>
> My suspicion is that the situation would improve (both in terms of code<br>
> generation quality on MRF platforms and codebase maintainability) if<br>
> instead of forking the driver we got rid of the compute-to-mrf pass<br>
> altogether and used the normal register coalesce pass to coalesce VGRFs<br>
> into MRFs (since the one difficult part about coalescing registers is<br>
> working out the dataflow and variable interference, COMPR4 is just the<br>
> surface).<br>
><br>
> BTW, do you have any objection against PATCH 21?  It should be fully<br>
> independent from the other MRF-related ones.<br>
><br>
>> So here's the million dollar question: Do we need them? and, more<br>
>> importantly, do we need them now?  I didn't see anything wrong in my brief<br>
>> skimming but don't call that a review.<br>
>><br>
> *Shrug*, nothing in this series is strictly necessary [heh, except of<br>
> course PATCH 25 ;)], but if we don't include them the overall shader-db<br>
> balance from the whole series (including parts 1-4 except for patches<br>
> 16-20 from this series) on SNB would be:<br>
><br>
>    total instructions in shared programs: 5721434 -> 5755717 (0.60%)<br>
>    instructions in affected programs: 2402892 -> 2437175 (1.43%)<br>
>    helped: 1284<br>
>    HURT: 12148<br>
><br>
> instead of the following (not excluding any changes):<br>
><br>
>    total instructions in shared programs: 5721284 -> 5708369 (-0.23%)<br>
>    instructions in affected programs: 489340 -> 476425 (-2.64%)<br>
>    helped: 1398<br>
>    HURT: 21<br>
><br>
>><br>
>>> [PATCH 22/25] i965/fs: Fix constant combining for instructions that cannot<br>
>>> accept source mods.<br>
>>> [PATCH 23/25] i965/fs: Allow scalar source regions on SNB math<br>
>>> instructions.<br>
>>> [PATCH 24/25] i965/fs: Skip gen4 pre/post-send dependency workaronds for<br>
>>> the first/last block.<br>
>>> [PATCH 25/25] i965: Expose GL 4.3 on Gen8+.<br>
>>><br>
>><br>
>> 22-25 are Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
>><br>
><br>
> Thanks.<br>
><br>
>><br>
>>> _______________________________________________<br>
>>> mesa-dev mailing list<br>
>>> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
>>> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
>>><br>
</div></div></blockquote></div><br></div></div>