From 078dc176bcc2cc36c609d04affe073c3225bf4bf Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 31 Dec 2018 13:09:45 -0800 Subject: [PATCH] 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. --- src/broadcom/compiler/nir_to_vir.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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; } /** -- 2.7.4