diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c index 6cc1fe00d99..80e43e7295d 100644 --- a/src/compiler/nir/nir_range_analysis.c +++ b/src/compiler/nir/nir_range_analysis.c @@ -600,6 +600,7 @@ process_fp_query(struct analysis_state *state, struct analysis_query *aq, uint32 case nir_op_ffloor: case nir_op_fceil: case nir_op_ftrunc: + case nir_op_ffract: case nir_op_fdot2: case nir_op_fdot3: case nir_op_fdot4: @@ -1179,6 +1180,22 @@ process_fp_query(struct analysis_state *state, struct analysis_query *aq, uint32 break; } + case nir_op_ffract: { + const struct ssa_result_range left = unpack_data(src_res[0]); + + /* fract(±Inf) is NaN */ + r.is_a_number = left.is_a_number && left.is_finite; + r.is_integral = left.is_integral; + r.is_finite = r.is_a_number; + + if (left.is_integral || left.range == eq_zero) + r.range = eq_zero; + else + r.range = ge_zero; + + break; + } + case nir_op_flt: case nir_op_fge: case nir_op_feq: