nir: don't use nir_build_alu() with incomplete sources

Ideally we'd have a version that takes nir_scalar arguments.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37195>
This commit is contained in:
Daniel Schürmann 2025-09-05 10:13:43 +02:00 committed by Marge Bot
parent ef9ecc4058
commit 3180656bbc
2 changed files with 13 additions and 17 deletions

View file

@ -69,18 +69,17 @@ make_sources_canonical(nir_builder *b, nir_alu_instr *alu, uint32_t start_idx)
if (nir_src_bit_size(alu->src[i].src) != bit_size) {
b->cursor = nir_before_instr(&alu->instr);
nir_op convert_op = get_bool_convert_opcode(bit_size);
nir_def *new_src =
nir_build_alu(b, convert_op, alu->src[i].src.ssa, NULL, NULL, NULL);
nir_alu_instr *conv_instr = nir_alu_instr_create(b->shader, convert_op);
conv_instr->src[0].src = nir_src_for_ssa(alu->src[i].src.ssa);
/* Retain the write mask and swizzle of the original instruction so
* that we dont unnecessarily create a vectorized instruction.
*/
nir_alu_instr *conv_instr =
nir_instr_as_alu(nir_builder_last_instr(b));
conv_instr->def.num_components =
alu->def.num_components;
memcpy(conv_instr->src[0].swizzle,
alu->src[i].swizzle,
sizeof(conv_instr->src[0].swizzle));
nir_def *new_src = nir_builder_alu_instr_finish_and_insert(b, conv_instr);
nir_src_rewrite(&alu->src[i].src, new_src);
/* The swizzle will have been handled by the conversion instruction
* so we can reset it back to the default

View file

@ -2248,15 +2248,15 @@ clone_ssa_impl(struct linkage_info *linkage, nir_builder *b, nir_def *ssa)
return get_stored_value_for_load(linkage, &alu->instr);
}
nir_def *src[4] = { 0 };
unsigned num_srcs = nir_op_infos[alu->op].num_inputs;
assert(num_srcs <= ARRAY_SIZE(src));
nir_alu_instr *alu_clone = nir_alu_instr_create(b->shader, alu->op);
for (unsigned i = 0; i < num_srcs; i++)
src[i] = clone_ssa_impl(linkage, b, alu->src[i].src.ssa);
clone = nir_build_alu(b, alu->op, src[0], src[1], src[2], src[3]);
nir_alu_instr *alu_clone = nir_def_as_alu(clone);
for (unsigned i = 0; i < num_srcs; i++) {
nir_def *src = clone_ssa_impl(linkage, b, alu->src[i].src.ssa);
alu_clone->src[i].src = nir_src_for_ssa(src);
memcpy(alu_clone->src[i].swizzle, alu->src[i].swizzle,
NIR_MAX_VEC_COMPONENTS);
}
alu_clone->exact = alu->exact;
alu_clone->no_signed_wrap = alu->no_signed_wrap;
@ -2264,10 +2264,7 @@ clone_ssa_impl(struct linkage_info *linkage, nir_builder *b, nir_def *ssa)
alu_clone->def.num_components = alu->def.num_components;
alu_clone->def.bit_size = alu->def.bit_size;
for (unsigned i = 0; i < num_srcs; i++) {
memcpy(alu_clone->src[i].swizzle, alu->src[i].swizzle,
NIR_MAX_VEC_COMPONENTS);
}
clone = nir_builder_alu_instr_finish_and_insert(b, alu_clone);
break;
}