nir: don't allocate nir_constant::elements if there are none

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36538>
This commit is contained in:
Marek Olšák 2025-08-04 00:58:05 -04:00 committed by Marge Bot
parent b1242e6b30
commit 05749922b0
6 changed files with 51 additions and 29 deletions

View file

@ -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:

View file

@ -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;

View file

@ -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);
}
}
}
}

View file

@ -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;

View file

@ -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)) {

View file

@ -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: