microsoft/compiler: remove phi-value limit

There's no guarantee that we don't have more than 128 PHI values either,
so let's stop asuming so.

We do this by changing dxil_phi_set_incoming to dxil_phi_add_incoming,
which lets us add more incoming phi-values to the current one instead of
setting a new set of them.

This also lets us reduce these stack-arrays a bit, down to something
much more reasonable.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15519>
This commit is contained in:
Erik Faye-Lund 2022-03-23 11:06:30 +01:00 committed by Marge Bot
parent d752c4bc7c
commit f7e92c8869
3 changed files with 19 additions and 15 deletions

View file

@ -2744,28 +2744,28 @@ dxil_emit_phi(struct dxil_module *m, const struct dxil_type *type)
}
bool
dxil_phi_set_incoming(struct dxil_instr *instr,
dxil_phi_add_incoming(struct dxil_instr *instr,
const struct dxil_value *incoming_values[],
const unsigned incoming_blocks[],
size_t num_incoming)
{
assert(instr->type == INSTR_PHI);
assert(num_incoming > 0);
assert(instr->phi.incoming == NULL);
instr->phi.incoming = ralloc_array(instr, struct dxil_phi_src,
num_incoming);
instr->phi.incoming = reralloc(instr, instr->phi.incoming,
struct dxil_phi_src,
instr->phi.num_incoming + 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));
instr->phi.incoming[i].value = incoming_values[i];
instr->phi.incoming[i].block = incoming_blocks[i];
int dst = instr->phi.num_incoming + i;
instr->phi.incoming[dst].value = incoming_values[i];
instr->phi.incoming[dst].block = incoming_blocks[i];
}
instr->phi.num_incoming = num_incoming;
instr->phi.num_incoming += num_incoming;
return true;
}

View file

@ -438,7 +438,7 @@ struct dxil_instr *
dxil_emit_phi(struct dxil_module *m, const struct dxil_type *type);
bool
dxil_phi_set_incoming(struct dxil_instr *instr,
dxil_phi_add_incoming(struct dxil_instr *instr,
const struct dxil_value *incoming_values[],
const unsigned incoming_blocks[],
size_t num_incoming);

View file

@ -4438,21 +4438,25 @@ static bool
fixup_phi(struct ntd_context *ctx, nir_phi_instr *instr,
struct phi_block *vphi)
{
const struct dxil_value *values[128];
unsigned blocks[128];
const struct dxil_value *values[16];
unsigned blocks[16];
for (unsigned i = 0; i < vphi->num_components; ++i) {
size_t num_incoming = 0;
nir_foreach_phi_src(src, instr) {
assert(src->src.is_ssa);
const struct dxil_value *val = get_src_ssa(ctx, src->src.ssa, i);
assert(num_incoming < ARRAY_SIZE(values));
values[num_incoming] = val;
assert(num_incoming < ARRAY_SIZE(blocks));
blocks[num_incoming] = src->pred->index;
++num_incoming;
if (num_incoming == ARRAY_SIZE(values)) {
if (!dxil_phi_add_incoming(vphi->comp[i], values, blocks,
num_incoming))
return false;
num_incoming = 0;
}
}
if (!dxil_phi_set_incoming(vphi->comp[i], values, blocks,
num_incoming))
if (num_incoming > 0 && !dxil_phi_add_incoming(vphi->comp[i], values,
blocks, num_incoming))
return false;
}
return true;