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:
@@ -553,7 +553,28 @@ analyze_expression(const nir_alu_instr *instr, unsigned src,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case nir_op_fsat:
|
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;
|
break;
|
||||||
|
|
||||||
case nir_op_fsign:
|
case nir_op_fsign:
|
||||||
|
Reference in New Issue
Block a user