[Mesa-dev] [PATCH 1/2] nir: Add a nir_opt_undef() to handle csels with undef.

Matt Turner mattst88 at gmail.com
Tue Aug 11 14:50:55 PDT 2015


On Tue, Aug 11, 2015 at 1:31 PM, Thomas Helland
<thomashelland90 at gmail.com> wrote:
> 2015-08-11 20:25 GMT+02:00 Eric Anholt <eric at anholt.net>:
>> We may find a cause to do more undef optimization in the future, but for
>> now this fixes up things after if flattening.  vc4 was handling this
>> internally most of the time, but a GLB2.7 shader that did a conditional
>> discard and assign gl_FragColor in the else was still emitting some extra
>> code.
>>
>> total instructions in shared programs: 100809 -> 100795 (-0.01%)
>> instructions in affected programs:     37 -> 23 (-37.84%)
>> ---
>>  src/gallium/drivers/vc4/vc4_program.c |  1 +
>>  src/glsl/Makefile.sources             |  1 +
>>  src/glsl/nir/nir.h                    |  2 +
>>  src/glsl/nir/nir_opt_undef.c          | 93 +++++++++++++++++++++++++++++++++++
>>  4 files changed, 97 insertions(+)
>>  create mode 100644 src/glsl/nir/nir_opt_undef.c
>>
>> diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
>> index e9120b7..4a3a277 100644
>> --- a/src/gallium/drivers/vc4/vc4_program.c
>> +++ b/src/gallium/drivers/vc4/vc4_program.c
>> @@ -1627,6 +1627,7 @@ vc4_optimize_nir(struct nir_shader *s)
>>                  progress = nir_opt_peephole_select(s) || progress;
>>                  progress = nir_opt_algebraic(s) || progress;
>>                  progress = nir_opt_constant_folding(s) || progress;
>> +                progress = nir_opt_undef(s) || progress;
>>          } while (progress);
>>  }
>>
>> diff --git a/src/glsl/Makefile.sources b/src/glsl/Makefile.sources
>> index a0e85ed..0b77244 100644
>> --- a/src/glsl/Makefile.sources
>> +++ b/src/glsl/Makefile.sources
>> @@ -56,6 +56,7 @@ NIR_FILES = \
>>         nir/nir_opt_peephole_ffma.c \
>>         nir/nir_opt_peephole_select.c \
>>         nir/nir_opt_remove_phis.c \
>> +       nir/nir_opt_undef.c \
>>         nir/nir_print.c \
>>         nir/nir_remove_dead_variables.c \
>>         nir/nir_search.c \
>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
>> index 9aae6d7..222a219 100644
>> --- a/src/glsl/nir/nir.h
>> +++ b/src/glsl/nir/nir.h
>> @@ -1704,6 +1704,8 @@ bool nir_opt_peephole_ffma(nir_shader *shader);
>>
>>  bool nir_opt_remove_phis(nir_shader *shader);
>>
>> +bool nir_opt_undef(nir_shader *shader);
>> +
>>  void nir_sweep(nir_shader *shader);
>>
>>  #ifdef __cplusplus
>> diff --git a/src/glsl/nir/nir_opt_undef.c b/src/glsl/nir/nir_opt_undef.c
>> new file mode 100644
>> index 0000000..89a75c4
>> --- /dev/null
>> +++ b/src/glsl/nir/nir_opt_undef.c
>> @@ -0,0 +1,93 @@
>> +/*
>> + * Copyright © 2015 Broadcom
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#include "nir.h"
>> +
>> +/** @file nir_opt_undef.c
>> + *
>> + * Handles optimization of operations involving ssa_undef.  For now, we just
>> + * make sure that csels between undef and some other value just give the other
>> + * value (on the assumption that the condition's going to be choosing the
>> + * defined value).  This reduces work after if flattening when each side of
>> + * the if is defining a variable.
>> + *
>> + * Some day, we may find some use for making other operations consuming an
>> + * undef arg output undef, but I don't know of any cases currently.
>> + */
>> +
>> +static bool
>> +opt_undef_alu(nir_alu_instr *instr)
>> +{
>> +   if (instr->op != nir_op_bcsel && instr->op != nir_op_fcsel)
>> +      return false;
>> +
>> +   assert(instr->dest.dest.is_ssa);
>> +
>> +   for (int i = 1; i <= 2; i++) {
>> +      if (!instr->src[i].src.is_ssa)
>> +         continue;
>> +
>> +      nir_instr *parent = instr->src[i].src.ssa->parent_instr;
>> +      if (parent->type != nir_instr_type_ssa_undef)
>> +         continue;
>> +
>> +      nir_alu_src_copy(&instr->src[0], &instr->src[i == 1 ? 2 : 1],
>> +                       ralloc_parent(instr));
>
> With this changed to:
>
> nir_instr_rewrite_src(&instr->instr, &instr->src[0].src,
>                                  instr->src[i == 1 ? 2 : 1].src);
>
> this patch is
>
> Reviewed-by: Thomas Helland <thomashelland90 at gmail.com>
>
> Shader-db without vec4 on i965 when hacking the pass into brw_nir.c:
>
> helped:   ./shaders/glamor/74.shader_test FS SIMD16:        46 -> 38 (-17.39%)
> helped:   ./shaders/glamor/73.shader_test FS SIMD16:        46 -> 38 (-17.39%)
> helped:   ./shaders/glamor/73.shader_test FS SIMD8:         44 -> 36 (-18.18%)
> helped:   ./shaders/glamor/74.shader_test FS SIMD8:         44 -> 36 (-18.18%)

I was surprised by this, but yeah these numbers seem valid.
gl_FragColor can be undefined under some likely impossible
circumstances.


More information about the mesa-dev mailing list