nir/range-analysis: Tighten the range of fsat based on the range of its source
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 2 Jun 2018 01:54:49 +0000 (18:54 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Aug 2019 03:14:13 +0000 (20:14 -0700)
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>
src/compiler/nir/nir_range_analysis.c

index 8df3558df7a0568ac4a998ce13d6c8aab6285f20..dac40ecb066a0a6f186afbfbcaaf1775bdce6452 100644 (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: