diff options
author | Connor Abbott <cwabbott0@gmail.com> | 2023-03-02 15:18:15 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-04-26 12:55:14 +0000 |
commit | 17cb1c78bde01eedbfe0f5e874b1208d8d08d570 (patch) | |
tree | f068b7c77747d9248dc8be24593723453d400b0c | |
parent | 3bec9e684d02642fdebdebd6f5c509f7eecea2b4 (diff) |
ir3: Directly use shared registers when possible
Avoid unnecessary copies.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22075>
-rw-r--r-- | src/freedreno/ir3/ir3_compiler_nir.c | 4 | ||||
-rw-r--r-- | src/freedreno/ir3/ir3_context.c | 4 | ||||
-rw-r--r-- | src/freedreno/ir3/ir3_opt_predicates.c | 3 |
3 files changed, 6 insertions, 5 deletions
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; } |