From 05749922b0bdda9d8d3e6af0cca76bed216b1e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 4 Aug 2025 00:58:05 -0400 Subject: [PATCH] nir: don't allocate nir_constant::elements if there are none Reviewed-by: Timothy Arceri Part-of: --- src/compiler/glsl/glsl_to_nir.cpp | 12 ++++---- src/compiler/nir/nir_clone.c | 10 +++++-- .../nir/nir_lower_const_arrays_to_uniforms.c | 28 +++++++++++-------- src/compiler/nir/nir_serialize.c | 13 ++++++--- src/compiler/nir/nir_split_vars.c | 9 ++++-- src/compiler/spirv/spirv_to_nir.c | 8 ++++-- 6 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 3399895ad80..cd2b51109fa 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -384,12 +384,14 @@ nir_visitor::constant_copy(ir_constant *ir, void *mem_ctx) case GLSL_TYPE_STRUCT: case GLSL_TYPE_ARRAY: - ret->elements = ralloc_array(mem_ctx, nir_constant *, - ir->type->length); - ret->num_elements = ir->type->length; + if (ir->type->length) { + ret->elements = ralloc_array(mem_ctx, nir_constant *, + ir->type->length); + ret->num_elements = ir->type->length; - for (i = 0; i < ir->type->length; i++) - ret->elements[i] = constant_copy(ir->const_elements[i], mem_ctx); + for (i = 0; i < ir->type->length; i++) + ret->elements[i] = constant_copy(ir->const_elements[i], mem_ctx); + } break; default: diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c index bcf0cafab6b..6cf2d041754 100644 --- a/src/compiler/nir/nir_clone.c +++ b/src/compiler/nir/nir_clone.c @@ -133,9 +133,13 @@ nir_constant_clone(const nir_constant *c, nir_variable *nvar) memcpy(nc->values, c->values, sizeof(nc->values)); nc->is_null_constant = c->is_null_constant; nc->num_elements = c->num_elements; - nc->elements = ralloc_array(nvar, nir_constant *, c->num_elements); - for (unsigned i = 0; i < c->num_elements; i++) { - nc->elements[i] = nir_constant_clone(c->elements[i], nvar); + + if (c->num_elements) { + nc->elements = ralloc_array(nvar, nir_constant *, c->num_elements); + for (unsigned i = 0; i < c->num_elements; i++) + nc->elements[i] = nir_constant_clone(c->elements[i], nvar); + } else { + nc->elements = NULL; } return nc; diff --git a/src/compiler/nir/nir_lower_const_arrays_to_uniforms.c b/src/compiler/nir/nir_lower_const_arrays_to_uniforms.c index 69d45dd76eb..455c0892d65 100644 --- a/src/compiler/nir/nir_lower_const_arrays_to_uniforms.c +++ b/src/compiler/nir/nir_lower_const_arrays_to_uniforms.c @@ -100,10 +100,13 @@ rebuild_const_array_initialiser(const struct glsl_type *type, void *mem_ctx) if (glsl_type_is_matrix(type) && glsl_get_matrix_columns(type) > 1) { ret->num_elements = glsl_get_matrix_columns(type); - ret->elements = ralloc_array(mem_ctx, nir_constant *, ret->num_elements); - for (unsigned i = 0; i < ret->num_elements; i++) { - ret->elements[i] = rzalloc(mem_ctx, nir_constant); + if (ret->num_elements) { + ret->elements = ralloc_array(mem_ctx, nir_constant *, ret->num_elements); + + for (unsigned i = 0; i < ret->num_elements; i++) { + ret->elements[i] = rzalloc(mem_ctx, nir_constant); + } } return ret; @@ -111,15 +114,18 @@ rebuild_const_array_initialiser(const struct glsl_type *type, void *mem_ctx) if (glsl_type_is_array(type) || glsl_type_is_struct(type)) { ret->num_elements = glsl_get_length(type); - ret->elements = ralloc_array(mem_ctx, nir_constant *, ret->num_elements); - for (unsigned i = 0; i < ret->num_elements; i++) { - if (glsl_type_is_array(type)) { - ret->elements[i] = - rebuild_const_array_initialiser(glsl_get_array_element(type), mem_ctx); - } else { - ret->elements[i] = - rebuild_const_array_initialiser(glsl_get_struct_field(type, i), mem_ctx); + if (ret->num_elements) { + ret->elements = ralloc_array(mem_ctx, nir_constant *, ret->num_elements); + + for (unsigned i = 0; i < ret->num_elements; i++) { + if (glsl_type_is_array(type)) { + ret->elements[i] = + rebuild_const_array_initialiser(glsl_get_array_element(type), mem_ctx); + } else { + ret->elements[i] = + rebuild_const_array_initialiser(glsl_get_struct_field(type, i), mem_ctx); + } } } } diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index f92aea6e123..a9f2946e38f 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -195,10 +195,15 @@ read_constant(read_ctx *ctx, nir_variable *nvar) blob_copy_bytes(ctx->blob, (uint8_t *)c->values, sizeof(c->values)); c->is_null_constant = memcmp(c->values, zero_vals, sizeof(c->values)) == 0; c->num_elements = blob_read_uint32(ctx->blob); - c->elements = ralloc_array(nvar, nir_constant *, c->num_elements); - for (unsigned i = 0; i < c->num_elements; i++) { - c->elements[i] = read_constant(ctx, nvar); - c->is_null_constant &= c->elements[i]->is_null_constant; + + if (c->num_elements) { + c->elements = ralloc_array(nvar, nir_constant *, c->num_elements); + for (unsigned i = 0; i < c->num_elements; i++) { + c->elements[i] = read_constant(ctx, nvar); + c->is_null_constant &= c->elements[i]->is_null_constant; + } + } else { + c->elements = NULL; } return c; diff --git a/src/compiler/nir/nir_split_vars.c b/src/compiler/nir/nir_split_vars.c index 02c8bbcf994..b7afdd30b0b 100644 --- a/src/compiler/nir/nir_split_vars.c +++ b/src/compiler/nir/nir_split_vars.c @@ -129,9 +129,12 @@ gather_constant_initializers(nir_constant *src, assert(src->num_elements == glsl_get_length(type)); nir_constant *dst = rzalloc(var, nir_constant); dst->num_elements = src->num_elements; - dst->elements = rzalloc_array(var, nir_constant *, src->num_elements); - for (unsigned i = 0; i < src->num_elements; ++i) { - dst->elements[i] = gather_constant_initializers(src->elements[i], var, element, field, state); + if (dst->num_elements) { + dst->elements = rzalloc_array(var, nir_constant *, src->num_elements); + for (unsigned i = 0; i < src->num_elements; ++i) { + dst->elements[i] = gather_constant_initializers(src->elements[i], var, + element, field, state); + } } return dst; } else if (glsl_type_is_struct(type)) { diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 0d27bb5c547..323867d1421 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2461,9 +2461,11 @@ vtn_null_constant(struct vtn_builder *b, struct vtn_type *type) case vtn_base_type_struct: c->is_null_constant = true; c->num_elements = type->length; - c->elements = ralloc_array(b, nir_constant *, c->num_elements); - for (unsigned i = 0; i < c->num_elements; i++) - c->elements[i] = vtn_null_constant(b, type->members[i]); + if (c->num_elements) { + c->elements = ralloc_array(b, nir_constant *, c->num_elements); + for (unsigned i = 0; i < c->num_elements; i++) + c->elements[i] = vtn_null_constant(b, type->members[i]); + } break; default: