From d752c4bc7c67d8d263a5d25e92b105c5a37698cf Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 23 Mar 2022 10:38:27 +0100 Subject: [PATCH] microsoft/compiler: ralloc incoming phi-values Reserving 127 incoming values for every phi instruction is neither robust nor memory efficient. Let's ralloc this array instead when filling it. This way, we only pay for what we use here. Reviewed-by: Boris Brezillon Part-of: --- src/microsoft/compiler/dxil_internal.h | 2 +- src/microsoft/compiler/dxil_module.c | 12 ++++++++++-- src/microsoft/compiler/dxil_module.h | 2 +- src/microsoft/compiler/nir_to_dxil.c | 12 ++++++++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/microsoft/compiler/dxil_internal.h b/src/microsoft/compiler/dxil_internal.h index 391ba09a937..f178d5cea51 100644 --- a/src/microsoft/compiler/dxil_internal.h +++ b/src/microsoft/compiler/dxil_internal.h @@ -163,7 +163,7 @@ struct dxil_instr_phi { struct dxil_phi_src { const struct dxil_value *value; unsigned block; - } incoming[127]; + } *incoming; size_t num_incoming; }; diff --git a/src/microsoft/compiler/dxil_module.c b/src/microsoft/compiler/dxil_module.c index f9debf42244..3de68ca0d40 100644 --- a/src/microsoft/compiler/dxil_module.c +++ b/src/microsoft/compiler/dxil_module.c @@ -2736,13 +2736,14 @@ dxil_emit_phi(struct dxil_module *m, const struct dxil_type *type) return NULL; instr->phi.type = type; + instr->phi.incoming = NULL; instr->phi.num_incoming = 0; instr->has_value = true; return instr; } -void +bool dxil_phi_set_incoming(struct dxil_instr *instr, const struct dxil_value *incoming_values[], const unsigned incoming_blocks[], @@ -2750,7 +2751,13 @@ dxil_phi_set_incoming(struct dxil_instr *instr, { assert(instr->type == INSTR_PHI); assert(num_incoming > 0); - assert(num_incoming < ARRAY_SIZE(instr->phi.incoming)); + assert(instr->phi.incoming == NULL); + + instr->phi.incoming = ralloc_array(instr, struct dxil_phi_src, + num_incoming); + if (!instr->phi.incoming) + return false; + for (int i = 0; i < num_incoming; ++i) { assert(incoming_values[i]); assert(types_equal(incoming_values[i]->type, instr->phi.type)); @@ -2759,6 +2766,7 @@ dxil_phi_set_incoming(struct dxil_instr *instr, instr->phi.incoming[i].block = incoming_blocks[i]; } instr->phi.num_incoming = num_incoming; + return true; } static struct dxil_instr * diff --git a/src/microsoft/compiler/dxil_module.h b/src/microsoft/compiler/dxil_module.h index e6b88788ba7..6729d268faf 100644 --- a/src/microsoft/compiler/dxil_module.h +++ b/src/microsoft/compiler/dxil_module.h @@ -437,7 +437,7 @@ dxil_instr_get_return_value(struct dxil_instr *instr); struct dxil_instr * dxil_emit_phi(struct dxil_module *m, const struct dxil_type *type); -void +bool dxil_phi_set_incoming(struct dxil_instr *instr, const struct dxil_value *incoming_values[], const unsigned incoming_blocks[], diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index eb170447736..b78c022711e 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -4434,7 +4434,7 @@ emit_phi(struct ntd_context *ctx, nir_phi_instr *instr) return true; } -static void +static bool fixup_phi(struct ntd_context *ctx, nir_phi_instr *instr, struct phi_block *vphi) { @@ -4451,8 +4451,11 @@ fixup_phi(struct ntd_context *ctx, nir_phi_instr *instr, blocks[num_incoming] = src->pred->index; ++num_incoming; } - dxil_phi_set_incoming(vphi->comp[i], values, blocks, num_incoming); + if (!dxil_phi_set_incoming(vphi->comp[i], values, blocks, + num_incoming)) + return false; } + return true; } static unsigned @@ -5207,8 +5210,9 @@ emit_function(struct ntd_context *ctx, nir_function *func) return false; hash_table_foreach(ctx->phis, entry) { - fixup_phi(ctx, (nir_phi_instr *)entry->key, - (struct phi_block *)entry->data); + if (!fixup_phi(ctx, (nir_phi_instr *)entry->key, + (struct phi_block *)entry->data)) + return false; } if (!dxil_emit_ret_void(&ctx->mod))