[Mesa-dev] [PATCH 1/2] nir: optimize min(min(a, b), c) to min3(a, b, c) under an option

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu May 31 09:38:27 UTC 2018



On 05/31/2018 11:35 AM, Timothy Arceri wrote:
> 
> 
> On 31/05/18 19:26, Samuel Pitoiset wrote:
>>
>>
>> On 05/31/2018 11:25 AM, Bas Nieuwenhuizen wrote:
>>> On Thu, May 31, 2018 at 11:13 AM, Samuel Pitoiset
>>> <samuel.pitoiset at gmail.com> wrote:
>>>>
>>>>
>>>> On 05/31/2018 01:55 AM, Timothy Arceri wrote:
>>>>>
>>>>> On 31/05/18 03:06, Samuel Pitoiset wrote:
>>>>>>
>>>>>> Similar for max().
>>>>>>
>>>>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>>>>> ---
>>>>>>    src/compiler/nir/nir.h                | 3 +++
>>>>>>    src/compiler/nir/nir_opt_algebraic.py | 8 ++++++++
>>>>>>    2 files changed, 11 insertions(+)
>>>>>>
>>>>>> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
>>>>>> index f6086bd6c0..04991b7d04 100644
>>>>>> --- a/src/compiler/nir/nir.h
>>>>>> +++ b/src/compiler/nir/nir.h
>>>>>> @@ -1897,6 +1897,9 @@ typedef struct nir_shader_compiler_options {
>>>>>>       /* lower b2f to iand */
>>>>>>       bool lower_b2f;
>>>>>> +   /* lower min(min(a, b), c) to min3(a, b, c) (same for max()). */
>>>>>> +   bool lower_minmax3;
>>>>>> +
>>>>>>       /* Does the native fdot instruction replicate its result for 
>>>>>> four
>>>>>>        * components?  If so, then opt_algebraic_late will turn all 
>>>>>> fdotN
>>>>>>        * instructions into fdot_replicatedN instructions.
>>>>>> diff --git a/src/compiler/nir/nir_opt_algebraic.py
>>>>>> b/src/compiler/nir/nir_opt_algebraic.py
>>>>>> index 909ea3daf4..1d67e2d88c 100644
>>>>>> --- a/src/compiler/nir/nir_opt_algebraic.py
>>>>>> +++ b/src/compiler/nir/nir_opt_algebraic.py
>>>>>> @@ -224,6 +224,14 @@ optimizations = [
>>>>>>       (('imax', a, a), a),
>>>>>>       (('umin', a, a), a),
>>>>>>       (('umax', a, a), a),
>>>>>> +
>>>>>> +   (('fmin', ('fmin', a, b), c), ('fmin3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>> +   (('imin', ('imin', a, b), c), ('imin3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>> +   (('umin', ('umin', a, b), c), ('umin3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>> +   (('fmax', ('fmax', a, b), c), ('fmax3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>> +   (('imax', ('imax', a, b), c), ('imax3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>> +   (('umax', ('umax', a, b), c), ('umax3', a, b, c),
>>>>>> 'options->lower_minmax3'),
>>>>>
>>>>>
>>>>> These look like they would be better suited in late_optimizations 
>>>>> rather
>>>>> than optimizations?
>>>>
>>>>
>>>> Totals from affected shaders:
>>>> SGPRS: 104 -> 104 (0.00 %)
>>>> VGPRS: 64 -> 64 (0.00 %)
>>>> Spilled SGPRs: 0 -> 0 (0.00 %)
>>>> Spilled VGPRs: 0 -> 0 (0.00 %)
>>>> Private memory VGPRs: 0 -> 0 (0.00 %)
>>>> Scratch size: 0 -> 0 (0.00 %) dwords per thread
>>>> Code Size: 4652 -> 4644 (-0.17 %) bytes
>>>> LDS: 4 -> 4 (0.00 %) blocks
>>>> Max Waves: 24 -> 24 (0.00 %)
>>>> Wait states: 0 -> 0 (0.00 %)
>>>>
>>>> When moved to late_optimizations.
>>>
>>> Is that compared to no min3/max3 lowering at all or compared to doing
>>> those non-late?
>>
>> Compared to "default" for both.
> 
> It might be worth looking at the difference in the shaders. It would be 
> interesting to understand why we need to do this early and if it means 
> there are other opportunities for lowering these that this pattern 
> doesn't find.

We don't call late_optimizations actually... The little difference is 
because I updated my local mesa without updating my pipeline-db base. In 
other words, shader results are wrong.

> 
>>
>>>>
>>>>
>>>>>
>>>>>
>>>>>> +
>>>>>>       (('fmin', a, ('fneg', a)), ('fneg', ('fabs', a))),
>>>>>>       (('imin', a, ('ineg', a)), ('ineg', ('iabs', a))),
>>>>>>       (('fmin', a, ('fneg', ('fabs', a))), ('fneg', ('fabs', a))),
>>>>>>
>>>> _______________________________________________
>>>> mesa-dev mailing list
>>>> mesa-dev at lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list