nir/lower_int64: fix find_lsb(0)
authorRhys Perry <pendingchaos02@gmail.com>
Tue, 26 Sep 2023 18:29:37 +0000 (19:29 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 27 Sep 2023 22:13:01 +0000 (22:13 +0000)
If the high 32 bits were zero, this would be umin(find_lsb(lo), 31). This
evaluates to 31 if lo is also zero, instead of -1.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Fixes: 9293d8e64bc7 ("nir: Add find_lsb lowering to nir_lower_int64.")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25409>

src/compiler/nir/nir_lower_int64.c

index 29c4060..02417d4 100644 (file)
@@ -713,8 +713,11 @@ lower_find_lsb64(nir_builder *b, nir_def *x)
 
    /* Use umin so that -1 (no bits found) becomes larger (0xFFFFFFFF)
     * than any actual bit position, so we return a found bit instead.
+    * This is similar to the ufind_msb lowering. If you need this lowering
+    * without uadd_sat, add code like in lower_ufind_msb64.
     */
-   return nir_umin(b, lo_lsb, nir_iadd_imm(b, hi_lsb, 32));
+   assert(!b->shader->options->lower_uadd_sat);
+   return nir_umin(b, lo_lsb, nir_uadd_sat(b, hi_lsb, nir_imm_int(b, 32)));
 }
 
 static nir_def *