From: Eric Anholt Date: Mon, 31 Dec 2018 21:09:45 +0000 (-0800) Subject: v3d: Don't try to fold non-SSA-src comparisons into bcsels. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=078dc176bcc2cc36c609d04affe073c3225bf4bf;p=mesa.git v3d: Don't try to fold non-SSA-src comparisons into bcsels. There could have been a write of a src in between the comparison and the bcsel that would invalidate the comparison. --- diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index ac3e1033536..e2cbae4174b 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -559,12 +559,28 @@ ntq_emit_comparison(struct v3d_compile *c, return true; } +/* Finds an ALU instruction that generates our src value that could + * (potentially) be greedily emitted in the consuming instruction. + */ static struct nir_alu_instr * ntq_get_alu_parent(nir_src src) { if (!src.is_ssa || src.ssa->parent_instr->type != nir_instr_type_alu) return NULL; - return nir_instr_as_alu(src.ssa->parent_instr); + nir_alu_instr *instr = nir_instr_as_alu(src.ssa->parent_instr); + if (!instr) + return NULL; + + /* If the ALU instr's srcs are non-SSA, then we would have to avoid + * moving emission of the ALU instr down past another write of the + * src. + */ + for (int i = 0; i < nir_op_infos[instr->op].num_inputs; i++) { + if (!instr->src[i].src.is_ssa) + return NULL; + } + + return instr; } /**