From ac6646129f71b83e8e4d737db5ef82d9c9ea516b Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 29 Nov 2016 17:33:30 -0800 Subject: nir: Move fsat outside of fmin/fmax if second arg is 0 to 1. instructions in affected programs: 550 -> 544 (-1.09%) helped: 6 cycles in affected programs: 6952 -> 6850 (-1.47%) helped: 6 Reviewed-by: Jason Ekstrand --- src/compiler/nir/nir_opt_algebraic.py | 2 ++ src/compiler/nir/nir_search_helpers.h | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 82d92f42932..698ac673658 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -175,6 +175,8 @@ optimizations = [ (('fmin', ('fmax', ('fmin', ('fmax', a, b), c), b), c), ('fmin', ('fmax', a, b), c)), (('imin', ('imax', ('imin', ('imax', a, b), c), b), c), ('imin', ('imax', a, b), c)), (('umin', ('umax', ('umin', ('umax', a, b), c), b), c), ('umin', ('umax', a, b), c)), + (('fmax', ('fsat', a), '#b@32(is_zero_to_one)'), ('fsat', ('fmax', a, b))), + (('fmin', ('fsat', a), '#b@32(is_zero_to_one)'), ('fsat', ('fmin', a, b))), (('extract_u8', ('imin', ('imax', a, 0), 0xff), 0), ('imin', ('imax', a, 0), 0xff)), (('~ior', ('flt', a, b), ('flt', a, c)), ('flt', a, ('fmax', b, c))), (('~ior', ('flt', a, c), ('flt', b, c)), ('flt', ('fmin', a, b), c)), diff --git a/src/compiler/nir/nir_search_helpers.h b/src/compiler/nir/nir_search_helpers.h index 50379441265..20fdae66e2c 100644 --- a/src/compiler/nir/nir_search_helpers.h +++ b/src/compiler/nir/nir_search_helpers.h @@ -91,4 +91,27 @@ is_neg_power_of_two(nir_alu_instr *instr, unsigned src, unsigned num_components, return true; } +static inline bool +is_zero_to_one(nir_alu_instr *instr, unsigned src, unsigned num_components, + const uint8_t *swizzle) +{ + nir_const_value *val = nir_src_as_const_value(instr->src[src].src); + + if (!val) + return false; + + for (unsigned i = 0; i < num_components; i++) { + switch (nir_op_infos[instr->op].input_types[src]) { + case nir_type_float: + if (val->f32[swizzle[i]] < 0.0f || val->f32[swizzle[i]] > 1.0f) + return false; + break; + default: + return false; + } + } + + return true; +} + #endif /* _NIR_SEARCH_ */ -- cgit v1.2.3