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-Tag: upstream/19.0.0~786 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=078dc176bcc2cc36c609d04affe073c3225bf4bf;p=platform%2Fupstream%2Fmesa.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 ac3e103..e2cbae4 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; } /**