Am Mi., 2. Mai 2018 um 09:50 Uhr schrieb Alyssa Rosenzweig < [email protected]>:
> This pass is required by the Midgard compiler; our instruction set uses > NIR-style booleans (~0 for true) but lacks a dedicated b2f instruction. > Normally, this lowering pass would be implemented in a backend-specific > algebraic pass, but this conflicts with the existing iand->b2f pass in > nir_opt_algebraic.py, hanging the compiler. This patch thus makes the > existing pass optional (default on -- all other backends should remain > unaffected), adding an optional pass for lowering the opposite > direction. > v2: Defer lowering until late algebraic optimisations to allow > optimising the b2f instruction itself. > Signed-off-by: Alyssa Rosenzweig <[email protected]> LGTM - will push it for you that it don't get lost. Reviewed-by: Christian Gmeiner <[email protected]> > --- > src/compiler/nir/nir.h | 3 +++ > src/compiler/nir/nir_opt_algebraic.py | 5 ++++- > 2 files changed, 7 insertions(+), 1 deletion(-) > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > index 5b28c727c8..fe0887865c 100644 > --- a/src/compiler/nir/nir.h > +++ b/src/compiler/nir/nir.h > @@ -1862,6 +1862,9 @@ typedef struct nir_shader_compiler_options { > /** enables rules to lower idiv by power-of-two: */ > bool lower_idiv; > + /* lower b2f to iand */ > + bool lower_b2f; > + > /* 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 c9575e6be4..99b5e57f30 100644 > --- a/src/compiler/nir/nir_opt_algebraic.py > +++ b/src/compiler/nir/nir_opt_algebraic.py > @@ -318,7 +318,7 @@ optimizations = [ > (('imul', ('b2i', a), ('b2i', b)), ('b2i', ('iand', a, b))), > (('fmul', ('b2f', a), ('b2f', b)), ('b2f', ('iand', a, b))), > (('fsat', ('fadd', ('b2f', a), ('b2f', b))), ('b2f', ('ior', a, b))), > - (('iand', 'a@bool', 1.0), ('b2f', a)), > + (('iand', 'a@bool', 1.0), ('b2f', a), '!options->lower_b2f'), > # True/False are ~0 and 0 in NIR. b2i of True is 1, and -1 is ~0 (True). > (('ineg', ('b2i@32', a)), a), > (('flt', ('fneg', ('b2f', a)), 0), a), # Generated by TGSI KILL_IF. > @@ -721,6 +721,9 @@ late_optimizations = [ > # we do these late so that we don't get in the way of creating ffmas > (('fmin', ('fadd(is_used_once)', '#c', a), ('fadd(is_used_once)', '#c', b)), ('fadd', c, ('fmin', a, b))), > (('fmax', ('fadd(is_used_once)', '#c', a), ('fadd(is_used_once)', '#c', b)), ('fadd', c, ('fmax', a, b))), > + > + # Lowered for backends without a dedicated b2f instruction > + (('b2f@32', a), ('iand', a, 1.0), 'options->lower_b2f'), > ] > print nir_algebraic.AlgebraicPass("nir_opt_algebraic", optimizations).render() > -- > 2.16.1 > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
