From 2bb49e45873d29331e12221ee51ce2644ff83863 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 21 Jul 2021 17:13:40 +0100 Subject: [PATCH] nir/search: don't consider INT_MIN a negative power-of-two ineg(INT_MIN)/iabs(INT_MIN) won't work as expected. No fossil-db changes. Signed-off-by: Rhys Perry Reviewed-by: Ian Romanick Part-of: --- src/compiler/nir/nir_search_helpers.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_search_helpers.h b/src/compiler/nir/nir_search_helpers.h index a49b1ed..2493848 100644 --- a/src/compiler/nir/nir_search_helpers.h +++ b/src/compiler/nir/nir_search_helpers.h @@ -73,12 +73,15 @@ is_neg_power_of_two(UNUSED struct hash_table *ht, const nir_alu_instr *instr, if (!nir_src_is_const(instr->src[src].src)) return false; + int64_t int_min = u_intN_min(instr->src[src].src.ssa->bit_size); + for (unsigned i = 0; i < num_components; i++) { nir_alu_type type = nir_op_infos[instr->op].input_types[src]; switch (nir_alu_type_get_base_type(type)) { case nir_type_int: { int64_t val = nir_src_comp_as_int(instr->src[src].src, swizzle[i]); - if (val >= 0 || !util_is_power_of_two_or_zero64(-val)) + /* "int_min" is a power-of-two, but negation can cause overflow. */ + if (val == int_min || val >= 0 || !util_is_power_of_two_or_zero64(-val)) return false; break; } -- 2.7.4