nir/range_analysis: Refactor fsat handling

This will greatly simplify a later commit.  The assert(r.is_integral) in
the eq_zero case is dropped because I don't think it's useful anymore.

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9108>
This commit is contained in:
Ian Romanick 2021-03-08 14:30:00 -08:00 committed by Marge Bot
parent 767270e809
commit 86fb53b1be
1 changed files with 11 additions and 8 deletions

View File

@ -852,31 +852,34 @@ analyze_expression(const nir_alu_instr *instr, unsigned src,
r.range = fneg_table[r.range];
break;
case nir_op_fsat:
r = analyze_expression(alu, 0, ht, nir_alu_src_type(alu, 0));
case nir_op_fsat: {
const struct ssa_result_range left =
analyze_expression(alu, 0, ht, nir_alu_src_type(alu, 0));
switch (r.range) {
switch (left.range) {
case le_zero:
case lt_zero:
case eq_zero:
r.range = eq_zero;
r.is_integral = true;
break;
case eq_zero:
assert(r.is_integral);
FALLTHROUGH;
case gt_zero:
case ge_zero:
/* The fsat doesn't add any information in these cases. */
/* The fsat doesn't add any information in this case. */
r.range = left.range;
r.is_integral = left.is_integral;
break;
case ge_zero:
case ne_zero:
case unknown:
/* Since the result must be in [0, 1], the value must be >= 0. */
r.range = ge_zero;
r.is_integral = left.is_integral;
break;
}
break;
}
case nir_op_fsign:
r = (struct ssa_result_range){