nir/range-analysis: Tighten the range of fsat based on the range of its source

This could be squashed with the previous commit.  I kept it separate to
ease review.

v2: Use a switch statement and add more comments.  Both suggested by
Caio.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Ian Romanick 2018-06-01 18:54:49 -07:00
parent 405de7ccb6
commit 3009cbed50
1 changed files with 22 additions and 1 deletions

View File

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