From c23abb12e810cc4252e1b991f860188e897975fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 25 Nov 2024 20:40:22 -0500 Subject: [PATCH] nir: allow cloning indirect array derefs in nir_clone_deref_instr but only if cloning within the same shader. This will be used to fix nir_lower_io_to_temporaries. Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_linking_helpers.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index 758246a4b17..c94c0dfc92a 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -1202,9 +1202,18 @@ nir_clone_deref_instr(nir_builder *b, nir_variable *var, */ switch (deref->deref_type) { case nir_deref_type_array: { - nir_load_const_instr *index = - nir_instr_as_load_const(deref->arr.index.ssa->parent_instr); - return nir_build_deref_array_imm(b, parent, index->value->i64); + if (b->shader == + nir_cf_node_get_function(&deref->instr.block->cf_node)->function->shader) { + /* Cloning within the same shader. */ + return nir_build_deref_array(b, parent, deref->arr.index.ssa); + } else { + /* Cloning to a different shader. The index must be constant because + * we don't implement cloning the index SSA here. + */ + nir_load_const_instr *index = + nir_instr_as_load_const(deref->arr.index.ssa->parent_instr); + return nir_build_deref_array_imm(b, parent, index->value->i64); + } } case nir_deref_type_ptr_as_array: { nir_load_const_instr *index =