nir/range-analysis: Fix incorrect fadd range result for (ne_zero, ne_zero)
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 12 Aug 2019 19:08:40 +0000 (12:08 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 29 Aug 2019 20:15:53 +0000 (13:15 -0700)
Found by inspection.  I tried really, really hard to make a test case
that would trigger this problem, but I was unsuccesful.  It's very hard
to get an instruction to produce a ne_zero result without ne_zero
sources.  The most plausible way is using bcsel.  That proves
problematic because bcsel interprets its sources as integers, so it
cannot currently be used to "clean" values for floating point
instructions.

No shader-db changes on any Intel platform.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Fixes: 405de7ccb6c ("nir/range-analysis: Rudimentary value range analysis pass")
src/compiler/nir/nir_range_analysis.c

index 5b0c39e4922242dfe7658a438b872948e7a26f42..b7a2f20d47394338ed103014fd54fbd444bb25d4 100644 (file)
@@ -247,9 +247,15 @@ analyze_expression(const nir_alu_instr *instr, unsigned src,
     *        | lt_zero + lt_zero
     *        ;
     *
+    * ne_zero: eq_zero + ne_zero
+    *        | ne_zero + eq_zero   # Addition is commutative
+    *        ;
+    *
     * eq_zero: eq_zero + eq_zero
+    *        ;
     *
-    * All other cases are 'unknown'.
+    * All other cases are 'unknown'.  The seeming odd entry is (ne_zero,
+    * ne_zero), but that could be (-5, +5) which is not ne_zero.
     */
    static const enum ssa_ranges fadd_table[last_range + 1][last_range + 1] = {
       /* left\right   unknown  lt_zero  le_zero  gt_zero  ge_zero  ne_zero  eq_zero */
@@ -258,12 +264,11 @@ analyze_expression(const nir_alu_instr *instr, unsigned src,
       /* le_zero */ { _______, lt_zero, le_zero, _______, _______, _______, le_zero },
       /* gt_zero */ { _______, _______, _______, gt_zero, gt_zero, _______, gt_zero },
       /* ge_zero */ { _______, _______, _______, gt_zero, ge_zero, _______, ge_zero },
-      /* ne_zero */ { _______, _______, _______, _______, _______, ne_zero, ne_zero },
+      /* ne_zero */ { _______, _______, _______, _______, _______, _______, ne_zero },
       /* eq_zero */ { _______, lt_zero, le_zero, gt_zero, ge_zero, ne_zero, eq_zero },
    };
 
    ASSERT_TABLE_IS_COMMUTATIVE(fadd_table);
-   ASSERT_TABLE_IS_DIAGONAL(fadd_table);
 
    /* Due to flush-to-zero semanatics of floating-point numbers with very
     * small mangnitudes, we can never really be sure a result will be