From bcdac65ca3718b237abddc9f4714d4580c081e35 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 26 Sep 2023 19:29:37 +0100 Subject: [PATCH] nir/lower_int64: fix find_lsb(0) 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 Reviewed-by: Ian Romanick Fixes: 9293d8e64bc7 ("nir: Add find_lsb lowering to nir_lower_int64.") Part-of: --- src/compiler/nir/nir_lower_int64.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_lower_int64.c b/src/compiler/nir/nir_lower_int64.c index 29c4060bc6f..02417d4fc21 100644 --- a/src/compiler/nir/nir_lower_int64.c +++ b/src/compiler/nir/nir_lower_int64.c @@ -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 *