From ef9ecc4058e8ac32b3f2780772a9b21f31499316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 5 Sep 2025 10:06:30 +0200 Subject: [PATCH] nir: add nir_imul_nuw() and nir_imul_imm_nuw() helpers Part-of: --- .../nir/radv_nir_apply_pipeline_layout.c | 25 ++++++------------- src/compiler/nir/nir_builder.h | 18 +++++++++++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c index 8cc53e7b9e2..c5c6a9726ef 100644 --- a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c +++ b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c @@ -77,11 +77,8 @@ visit_vulkan_resource_index(nir_builder *b, apply_layout_state *state, nir_intri stride = layout->binding[binding].size; } - nir_def *binding_ptr = nir_imul_imm(b, intrin->src[0].ssa, stride); - nir_def_as_alu(binding_ptr)->no_unsigned_wrap = true; - - binding_ptr = nir_iadd_imm(b, binding_ptr, offset); - nir_def_as_alu(binding_ptr)->no_unsigned_wrap = true; + nir_def *binding_ptr = nir_imul_imm_nuw(b, intrin->src[0].ssa, stride); + binding_ptr = nir_iadd_imm_nuw(b, binding_ptr, offset); if (layout->binding[binding].type == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) { assert(stride == 16); @@ -100,8 +97,7 @@ visit_vulkan_resource_reindex(nir_builder *b, apply_layout_state *state, nir_int nir_def *set_ptr = nir_unpack_64_2x32_split_x(b, intrin->src[0].ssa); nir_def *binding_ptr = nir_unpack_64_2x32_split_y(b, intrin->src[0].ssa); - nir_def *index = nir_imul_imm(b, intrin->src[1].ssa, 16); - nir_def_as_alu(index)->no_unsigned_wrap = true; + nir_def *index = nir_imul_imm_nuw(b, intrin->src[1].ssa, 16); binding_ptr = nir_iadd_nuw(b, binding_ptr, index); @@ -112,9 +108,7 @@ visit_vulkan_resource_reindex(nir_builder *b, apply_layout_state *state, nir_int nir_def *binding_ptr = nir_channel(b, intrin->src[0].ssa, 1); nir_def *stride = nir_channel(b, intrin->src[0].ssa, 2); - nir_def *index = nir_imul(b, intrin->src[1].ssa, stride); - nir_def_as_alu(index)->no_unsigned_wrap = true; - + nir_def *index = nir_imul_nuw(b, intrin->src[1].ssa, stride); binding_ptr = nir_iadd_nuw(b, binding_ptr, index); nir_def_rewrite_uses(&intrin->def, nir_vector_insert_imm(b, intrin->src[0].ssa, binding_ptr, 1)); @@ -240,13 +234,10 @@ get_sampler_desc(nir_builder *b, apply_layout_state *state, nir_deref_instr *der unsigned array_size = MAX2(glsl_get_aoa_size(deref->type), 1); array_size *= binding->size; - nir_def *tmp = nir_imul_imm(b, deref->arr.index.ssa, array_size); - if (tmp != deref->arr.index.ssa) - nir_def_as_alu(tmp)->no_unsigned_wrap = true; + nir_def *tmp = nir_imul_imm_nuw(b, deref->arr.index.ssa, array_size); if (index) { - index = nir_iadd(b, tmp, index); - nir_def_as_alu(index)->no_unsigned_wrap = true; + index = nir_iadd_nuw(b, tmp, index); } else { index = tmp; } @@ -254,9 +245,7 @@ get_sampler_desc(nir_builder *b, apply_layout_state *state, nir_deref_instr *der deref = nir_deref_instr_parent(deref); } - nir_def *index_offset = index ? nir_iadd_imm(b, index, offset) : nir_imm_int(b, offset); - if (index && index_offset != index) - nir_def_as_alu(index_offset)->no_unsigned_wrap = true; + nir_def *index_offset = index ? nir_iadd_imm_nuw(b, index, offset) : nir_imm_int(b, offset); if (non_uniform) return nir_iadd(b, load_desc_ptr(b, state, desc_set), index_offset); diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index 01dcd39fc0e..6ff0985ed22 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -1110,6 +1110,24 @@ nir_imul_imm(nir_builder *build, nir_def *x, uint64_t y) return _nir_mul_imm(build, x, y, false); } +static inline nir_def * +nir_imul_imm_nuw(nir_builder *build, nir_def *x, uint64_t y) +{ + nir_def *d = nir_imul_imm(build, x, y); + if (d != x && d->parent_instr->type == nir_instr_type_alu) + nir_def_as_alu(d)->no_unsigned_wrap = true; + return d; +} + +static inline nir_def * +nir_imul_nuw(nir_builder *build, nir_def *x, nir_def *y) +{ + nir_def *d = nir_imul(build, x, y); + if (d->parent_instr->type == nir_instr_type_alu) + nir_def_as_alu(d)->no_unsigned_wrap = true; + return d; +} + static inline nir_def * nir_amul_imm(nir_builder *build, nir_def *x, uint64_t y) {