diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 7478ec14d00..fcc6ada7a87 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -3554,7 +3554,7 @@ emit_phi(struct ir3_context *ctx, nir_phi_instr *nphi) nir_phi_src *src = list_entry(exec_list_get_head(&nphi->srcs), nir_phi_src, node); if (nphi->def.divergent == src->src.ssa->divergent) { - dst[0] = ir3_get_src(ctx, &src->src)[0]; + dst[0] = ir3_get_src_maybe_shared(ctx, &src->src)[0]; ir3_put_def(ctx, &nphi->def); return; } @@ -4022,7 +4022,7 @@ emit_conditional_branch(struct ir3_context *ctx, nir_if *nif) static void emit_if(struct ir3_context *ctx, nir_if *nif) { - struct ir3_instruction *condition = ir3_get_src(ctx, &nif->condition)[0]; + struct ir3_instruction *condition = ir3_get_src_maybe_shared(ctx, &nif->condition)[0]; if (condition->opc == OPC_ANY_MACRO && condition->block == ctx->block) { struct ir3_instruction *pred = ssa(condition->srcs[0]); diff --git a/src/freedreno/ir3/ir3_context.c b/src/freedreno/ir3/ir3_context.c index 65db920e429..f8998a475c7 100644 --- a/src/freedreno/ir3/ir3_context.c +++ b/src/freedreno/ir3/ir3_context.c @@ -528,12 +528,14 @@ ir3_get_predicate(struct ir3_context *ctx, struct ir3_instruction *src) /* NOTE: we use cpms.s.ne x, 0 to move x into a predicate register */ struct ir3_instruction *zero = - create_immed_typed(b, 0, is_half(src) ? TYPE_U16 : TYPE_U32); + create_immed_typed_shared(b, 0, is_half(src) ? TYPE_U16 : TYPE_U32, + src->dsts[0]->flags & IR3_REG_SHARED); cond = ir3_CMPS_S(b, src, 0, zero, 0); cond->cat2.condition = IR3_COND_NE; /* condition always goes in predicate register: */ cond->dsts[0]->flags |= IR3_REG_PREDICATE; + cond->dsts[0]->flags &= ~IR3_REG_SHARED; /* phi's should stay first in a block */ if (src->opc == OPC_META_PHI) diff --git a/src/freedreno/ir3/ir3_opt_predicates.c b/src/freedreno/ir3/ir3_opt_predicates.c index cf63ee4e98f..934480a1a65 100644 --- a/src/freedreno/ir3/ir3_opt_predicates.c +++ b/src/freedreno/ir3/ir3_opt_predicates.c @@ -40,12 +40,11 @@ clone_with_predicate_dst(struct opt_predicates_ctx *ctx, return entry->data; assert(instr->dsts_count == 1); - assert(!(instr->dsts[0]->flags & IR3_REG_SHARED)); struct ir3_instruction *clone = ir3_instr_clone(instr); ir3_instr_move_after(clone, instr); clone->dsts[0]->flags |= IR3_REG_PREDICATE; - clone->dsts[0]->flags &= ~IR3_REG_HALF; + clone->dsts[0]->flags &= ~(IR3_REG_HALF | IR3_REG_SHARED); _mesa_hash_table_insert(ctx->predicate_clones, instr, clone); return clone; }