summaryrefslogtreecommitdiff
path: root/src/compiler/nir/nir_range_analysis.c
diff options
context:
space:
mode:
authorRhys Perry <pendingchaos02@gmail.com>2023-03-15 16:11:12 +0000
committerMarge Bot <emma+marge@anholt.net>2023-03-22 09:24:18 +0000
commit2145cf3dd1d6eb8bd4e6095ca1f673dc6dacb1ff (patch)
tree67fd0eb376d9fb0192656ddda675535620ad1e83 /src/compiler/nir/nir_range_analysis.c
parent63e8f77d8e0c6aa6745f719cfd08c4a58924b9d5 (diff)
downloadmesa-2145cf3dd1d6eb8bd4e6095ca1f673dc6dacb1ff.tar.gz
nir/range_analysis: add missing masking of shift amounts
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Georg Lehmann <dadschoorse@gmail.com> Fixes: 72ac3f60261 ("nir: add nir_unsigned_upper_bound and nir_addition_might_overflow") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21381>
Diffstat (limited to 'src/compiler/nir/nir_range_analysis.c')
-rw-r--r--src/compiler/nir/nir_range_analysis.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c
index f4f6c0a03ad..0f44abab780 100644
--- a/src/compiler/nir/nir_range_analysis.c
+++ b/src/compiler/nir/nir_range_analysis.c
@@ -1601,12 +1601,14 @@ nir_unsigned_upper_bound_impl(nir_shader *shader, struct hash_table *range_ht,
case nir_op_ixor:
res = bitmask(util_last_bit64(src0)) | bitmask(util_last_bit64(src1));
break;
- case nir_op_ishl:
+ case nir_op_ishl: {
+ src1 = MIN2(src1, q.scalar.def->bit_size - 1u);
if (util_last_bit64(src0) + src1 > scalar.def->bit_size)
res = max; /* overflow */
else
- res = src0 << MIN2(src1, scalar.def->bit_size - 1u);
+ res = src0 << src1;
break;
+ }
case nir_op_imul:
if (src0 != 0 && (src0 * src1) / src0 != src1)
res = max;
@@ -1615,16 +1617,18 @@ nir_unsigned_upper_bound_impl(nir_shader *shader, struct hash_table *range_ht,
break;
case nir_op_ushr: {
nir_ssa_scalar src1_scalar = nir_ssa_scalar_chase_alu_src(scalar, 1);
+ uint32_t mask = q.scalar.def->bit_size - 1u;
if (nir_ssa_scalar_is_const(src1_scalar))
- res = src0 >> nir_ssa_scalar_as_uint(src1_scalar);
+ res = src0 >> (nir_ssa_scalar_as_uint(src1_scalar) & mask);
else
res = src0;
break;
}
case nir_op_ishr: {
nir_ssa_scalar src1_scalar = nir_ssa_scalar_chase_alu_src(scalar, 1);
+ uint32_t mask = q.scalar.def->bit_size - 1u;
if (src0 <= 2147483647 && nir_ssa_scalar_is_const(src1_scalar))
- res = src0 >> nir_ssa_scalar_as_uint(src1_scalar);
+ res = src0 >> (nir_ssa_scalar_as_uint(src1_scalar) & mask);
else
res = src0;
break;