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:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user