From: Jason Ekstrand Date: Thu, 29 Jan 2015 00:53:51 +0000 (-0800) Subject: nir/opt_algebraic: Add some constant bcsel reductions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=604ae33c8b95a97ba586780324566fd21c59b695;p=mesa.git nir/opt_algebraic: Add some constant bcsel reductions total instructions in shared programs: 5998190 -> 5997603 (-0.01%) instructions in affected programs: 54276 -> 53689 (-1.08%) helped: 293 Reviewed-by: Kenneth Graunke --- diff --git a/src/glsl/nir/nir_opt_algebraic.py b/src/glsl/nir/nir_opt_algebraic.py index cf305156c5c..9b40d4885c1 100644 --- a/src/glsl/nir/nir_opt_algebraic.py +++ b/src/glsl/nir/nir_opt_algebraic.py @@ -120,11 +120,37 @@ optimizations = [ # Boolean simplifications (('ine', 'a@bool', 0), 'a'), (('ieq', 'a@bool', 0), ('inot', 'a')), - (('bcsel', 'a@bool', True, False), 'a'), - (('bcsel', 'a@bool', False, True), ('inot', 'a')), + (('bcsel', a, True, False), ('ine', a, 0)), + (('bcsel', a, False, True), ('ieq', a, 0)), + (('bcsel', True, b, c), b), + (('bcsel', False, b, c), c), + # The result of this should be hit by constant propagation and, in the + # next round of opt_algebraic, get picked up by one of the above two. + (('bcsel', '#a', b, c), ('bcsel', ('ine', 'a', 0), b, c)), # This one may not be exact (('feq', ('fadd', a, b), 0.0), ('feq', a, ('fneg', b))), ] +# Add optimizations to handle the case where the result of a ternary is +# compared to a constant. This way we can take things like +# +# (a ? 0 : 1) > 0 +# +# and turn it into +# +# a ? (0 > 0) : (1 > 0) +# +# which constant folding will eat for lunch. The resulting ternary will +# further get cleaned up by the boolean reductions above and we will be +# left with just the original variable "a". +for op in ['flt', 'fge', 'feq', 'fne', + 'ilt', 'ige', 'ieq', 'ine', 'ult', 'uge']: + optimizations += [ + ((op, ('bcsel', 'a', '#b', '#c'), '#d'), + ('bcsel', 'a', (op, 'b', 'd'), (op, 'c', 'd'))), + ((op, '#d', ('bcsel', a, '#b', '#c')), + ('bcsel', 'a', (op, 'd', 'b'), (op, 'd', 'c'))), + ] + print nir_algebraic.AlgebraicPass("nir_opt_algebraic", optimizations).render()