[Mesa-dev] [PATCH 2/3] nir: Try commutative sources in CSE

Connor Abbott cwabbott0 at gmail.com
Tue Apr 14 12:33:10 PDT 2015


On Tue, Apr 14, 2015 at 11:43 AM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Shader-db results:
>
> GM45 NIR:
> total instructions in shared programs: 4082044 -> 4081919 (-0.00%)
> instructions in affected programs:     27609 -> 27484 (-0.45%)
> helped:                                44
>
> Iron Lake NIR:
> total instructions in shared programs: 5678776 -> 5678646 (-0.00%)
> instructions in affected programs:     27406 -> 27276 (-0.47%)
> helped:                                45
>
> Sandy Bridge NIR:
> total instructions in shared programs: 7329995 -> 7329096 (-0.01%)
> instructions in affected programs:     142035 -> 141136 (-0.63%)
> helped:                                406
> HURT:                                  19
>
> Ivy Bridge NIR:
> total instructions in shared programs: 6769314 -> 6768359 (-0.01%)
> instructions in affected programs:     140820 -> 139865 (-0.68%)
> helped:                                423
> HURT:                                  2
>
> Haswell NIR:
> total instructions in shared programs: 6183693 -> 6183298 (-0.01%)
> instructions in affected programs:     96538 -> 96143 (-0.41%)
> helped:                                303
> HURT:                                  4
>
> Broadwell NIR:
> total instructions in shared programs: 7501711 -> 7498170 (-0.05%)
> instructions in affected programs:     266403 -> 262862 (-1.33%)
> helped:                                705
> HURT:                                  5
> GAINED:                                4
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/nir/nir_opt_cse.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/src/glsl/nir/nir_opt_cse.c b/src/glsl/nir/nir_opt_cse.c
> index 03039cf..bd994a8 100644
> --- a/src/glsl/nir/nir_opt_cse.c
> +++ b/src/glsl/nir/nir_opt_cse.c
> @@ -73,10 +73,20 @@ nir_instrs_equal(nir_instr *instr1, nir_instr *instr2)
>        if (alu1->dest.dest.ssa.num_components != alu2->dest.dest.ssa.num_components)
>           return false;
>
> -      for (unsigned i = 0; i < nir_op_infos[alu1->op].num_inputs; i++) {
> -         if (!nir_alu_srcs_equal(alu1->src[i], alu2->src[i],
> -                                 (1 << alu1->dest.dest.ssa.num_components) - 1))
> -            return false;
> +      if (nir_op_infos[alu1->op].num_inputs == 2 &&
> +          (nir_op_infos[alu1->op].algebraic_properties & NIR_OP_IS_COMMUTATIVE)) {
> +         const uint8_t read_mask = (1 << alu1->dest.dest.ssa.num_components) - 1;

I was going to recommend that you move this above the if statement,
but then I realized that this code is actually bogus since for
not-per-component things like dot product the "read mask" isn't always
the same as the write mask. I'll send out a bugfix and then you should
rebase on top of it. The other two patches have my r-b though.

> +
> +         return (nir_alu_srcs_equal(alu1->src[0], alu2->src[0], read_mask) &&
> +                 nir_alu_srcs_equal(alu1->src[1], alu2->src[1], read_mask)) ||
> +                (nir_alu_srcs_equal(alu1->src[0], alu2->src[1], read_mask) &&
> +                 nir_alu_srcs_equal(alu1->src[1], alu2->src[0], read_mask));
> +      } else {
> +         for (unsigned i = 0; i < nir_op_infos[alu1->op].num_inputs; i++) {
> +            if (!nir_alu_srcs_equal(alu1->src[i], alu2->src[i],
> +                                    (1 << alu1->dest.dest.ssa.num_components) - 1))
> +               return false;
> +         }
>        }
>        return true;
>     }
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list