From: Ian Romanick Date: Sat, 2 Jun 2018 01:54:49 +0000 (-0700) Subject: nir/range-analysis: Tighten the range of fsat based on the range of its source X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3009cbed5053150fbee351ee7b9f61d3aaf6794b;p=mesa.git 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 --- diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c index 8df3558df7a..dac40ecb066 100644 --- a/src/compiler/nir/nir_range_analysis.c +++ b/src/compiler/nir/nir_range_analysis.c @@ -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: