diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 6f0a4393524..3fc35995bca 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -807,7 +807,8 @@ optimizations.extend([ (('ffloor', 'a(is_integral)'), a), (('fceil', 'a(is_integral)'), a), (('ftrunc', 'a(is_integral)'), a), - (('ffract', 'a(is_integral)'), 0.0), + # fract(x) = x - floor(x), so fract(NaN) = NaN + (('~ffract', 'a(is_integral)'), 0.0), (('fabs', 'a(is_not_negative)'), a), (('iabs', 'a(is_not_negative)'), a), (('fsat', 'a(is_not_positive)'), 0.0), @@ -837,15 +838,18 @@ optimizations.extend([ (('fne', 'a(is_not_zero)', 0.0), True), (('feq', 'a(is_not_zero)', 0.0), False), - (('fge', 'a(is_not_negative)', 'b(is_not_positive)'), True), - (('fge', 'b(is_not_positive)', 'a(is_gt_zero)'), False), - (('fge', 'a(is_lt_zero)', 'b(is_not_negative)'), False), - (('fge', 'b(is_not_negative)', 'a(is_not_positive)'), True), + # The results expecting true, must be marked imprecise. The results + # expecting false are fine because NaN compared >= or < anything is false. - (('flt', 'a(is_not_negative)', 'b(is_not_positive)'), False), - (('flt', 'b(is_not_positive)', 'a(is_gt_zero)'), True), - (('flt', 'a(is_lt_zero)', 'b(is_not_negative)'), True), - (('flt', 'b(is_not_negative)', 'a(is_not_positive)'), False), + (('~fge', 'a(is_not_negative)', 'b(is_not_positive)'), True), + (('fge', 'b(is_not_positive)', 'a(is_gt_zero)'), False), + (('fge', 'a(is_lt_zero)', 'b(is_not_negative)'), False), + (('~fge', 'b(is_not_negative)', 'a(is_not_positive)'), True), + + (('flt', 'a(is_not_negative)', 'b(is_not_positive)'), False), + (('~flt', 'b(is_not_positive)', 'a(is_gt_zero)'), True), + (('~flt', 'a(is_lt_zero)', 'b(is_not_negative)'), True), + (('flt', 'b(is_not_negative)', 'a(is_not_positive)'), False), (('ine', 'a(is_not_zero)', 0), True), (('ieq', 'a(is_not_zero)', 0), False),