Mesa (staging/20.3): nir: fix determining if an addition might overflow for phi sources

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 2 18:42:22 UTC 2021


Module: Mesa
Branch: staging/20.3
Commit: c7430bbc3eb044ea7eabd2e103ed879bf601d493
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c7430bbc3eb044ea7eabd2e103ed879bf601d493

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Dec 30 10:28:54 2020 +0100

nir: fix determining if an addition might overflow for phi sources

nir_addition_might_overflow() expects the parent instruction to be
an alu instr but it might be a phi instr. Fix it by assuming that
the addition might overflow.

This fixes compiler crashes with Horizon Zero Dawn.

No fossils-db changes.

Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8268>
(cherry picked from commit 0b503d8de96c7006c0fe1c8bfdcd8de02f255992)

---

 .pick_status.json                     |  2 +-
 src/compiler/nir/nir_range_analysis.c | 60 ++++++++++++++++++-----------------
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 5a72c7d76ba..28aa43ae00d 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -499,7 +499,7 @@
         "description": "nir: fix determining if an addition might overflow for phi sources",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c
index 04449a91232..903f0b302c2 100644
--- a/src/compiler/nir/nir_range_analysis.c
+++ b/src/compiler/nir/nir_range_analysis.c
@@ -1456,36 +1456,38 @@ nir_addition_might_overflow(nir_shader *shader, struct hash_table *range_ht,
                             nir_ssa_scalar ssa, unsigned const_val,
                             const nir_unsigned_upper_bound_config *config)
 {
-   nir_op alu_op = nir_ssa_scalar_alu_op(ssa);
-
-   /* iadd(imul(a, #b), #c) */
-   if (alu_op == nir_op_imul || alu_op == nir_op_ishl) {
-      nir_ssa_scalar mul_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0);
-      nir_ssa_scalar mul_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1);
-      uint32_t stride = 1;
-      if (nir_ssa_scalar_is_const(mul_src0))
-         stride = nir_ssa_scalar_as_uint(mul_src0);
-      else if (nir_ssa_scalar_is_const(mul_src1))
-         stride = nir_ssa_scalar_as_uint(mul_src1);
-
-      if (alu_op == nir_op_ishl)
-         stride = 1u << (stride % 32u);
-
-      if (!stride || const_val <= UINT32_MAX - (UINT32_MAX / stride * stride))
-         return false;
-   }
+   if (nir_ssa_scalar_is_alu(ssa)) {
+      nir_op alu_op = nir_ssa_scalar_alu_op(ssa);
+
+      /* iadd(imul(a, #b), #c) */
+      if (alu_op == nir_op_imul || alu_op == nir_op_ishl) {
+         nir_ssa_scalar mul_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0);
+         nir_ssa_scalar mul_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1);
+         uint32_t stride = 1;
+         if (nir_ssa_scalar_is_const(mul_src0))
+            stride = nir_ssa_scalar_as_uint(mul_src0);
+         else if (nir_ssa_scalar_is_const(mul_src1))
+            stride = nir_ssa_scalar_as_uint(mul_src1);
+
+         if (alu_op == nir_op_ishl)
+            stride = 1u << (stride % 32u);
+
+         if (!stride || const_val <= UINT32_MAX - (UINT32_MAX / stride * stride))
+            return false;
+      }
 
-   /* iadd(iand(a, #b), #c) */
-   if (alu_op == nir_op_iand) {
-      nir_ssa_scalar and_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0);
-      nir_ssa_scalar and_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1);
-      uint32_t mask = 0xffffffff;
-      if (nir_ssa_scalar_is_const(and_src0))
-         mask = nir_ssa_scalar_as_uint(and_src0);
-      else if (nir_ssa_scalar_is_const(and_src1))
-         mask = nir_ssa_scalar_as_uint(and_src1);
-      if (mask == 0 || const_val < (1u << (ffs(mask) - 1)))
-         return false;
+      /* iadd(iand(a, #b), #c) */
+      if (alu_op == nir_op_iand) {
+         nir_ssa_scalar and_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0);
+         nir_ssa_scalar and_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1);
+         uint32_t mask = 0xffffffff;
+         if (nir_ssa_scalar_is_const(and_src0))
+            mask = nir_ssa_scalar_as_uint(and_src0);
+         else if (nir_ssa_scalar_is_const(and_src1))
+            mask = nir_ssa_scalar_as_uint(and_src1);
+         if (mask == 0 || const_val < (1u << (ffs(mask) - 1)))
+            return false;
+      }
    }
 
    uint32_t ub = nir_unsigned_upper_bound(shader, range_ht, ssa, config);



More information about the mesa-commit mailing list