summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConnor Abbott <cwabbott0@gmail.com>2023-03-02 15:18:15 +0100
committerMarge Bot <emma+marge@anholt.net>2024-04-26 12:55:14 +0000
commit17cb1c78bde01eedbfe0f5e874b1208d8d08d570 (patch)
treef068b7c77747d9248dc8be24593723453d400b0c
parent3bec9e684d02642fdebdebd6f5c509f7eecea2b4 (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.c4
-rw-r--r--src/freedreno/ir3/ir3_context.c4
-rw-r--r--src/freedreno/ir3/ir3_opt_predicates.c3
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;
}