nir: Mark bcsel-to-fmin (or fmax) transformations as inexact
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 26 Feb 2018 22:49:47 +0000 (14:49 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Mar 2018 19:17:14 +0000 (11:17 -0800)
These transformations are inexact because section 4.7.1 (Range and
Precision) says:

    Operations and built-in functions that operate on a NaN are not
    required to return a NaN as the result.

The fmin or fmax might not return NaN in cases where the original
expression would be required to return NaN.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_opt_algebraic.py

index ef240ae0e91c8f7c763f69885bf61870ee067746..43b29484319dad80cfe1c5363eea13acfdf12a8e 100644 (file)
@@ -168,8 +168,8 @@ optimizations = [
    (('flt(is_not_used_by_conditional)', ('fadd(is_used_once)', a, ('fneg', b)), 0.0), ('flt', a, b)),
 
    (('fge', ('fneg', ('fabs', a)), 0.0), ('feq', a, 0.0)),
-   (('bcsel', ('flt', b, a), b, a), ('fmin', a, b)),
-   (('bcsel', ('flt', a, b), b, a), ('fmax', a, b)),
+   (('~bcsel', ('flt', b, a), b, a), ('fmin', a, b)),
+   (('~bcsel', ('flt', a, b), b, a), ('fmax', a, b)),
    (('~bcsel', ('fge', a, b), b, a), ('fmin', a, b)),
    (('~bcsel', ('fge', b, a), b, a), ('fmax', a, b)),
    (('bcsel', ('inot', a), b, c), ('bcsel', a, c, b)),