From d43f39678c4af9e9ea007ef5fcb45faa8f8db3f4 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Wed, 25 Sep 2024 12:04:45 +0200 Subject: [PATCH] ir3: make backend aware of shfl: - Validation; - Copy prop: src2 can be shared; - Legalization: is (ss) producer. Signed-off-by: Job Noorman Part-of: --- src/freedreno/ir3/ir3.c | 2 ++ src/freedreno/ir3/ir3.h | 2 +- src/freedreno/ir3/ir3_legalize.c | 2 +- src/freedreno/ir3/ir3_validate.c | 5 +++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index 064df5fcb50..46e35a1fc65 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -1359,6 +1359,8 @@ ir3_valid_flags(struct ir3_instruction *instr, unsigned n, unsigned flags) if (instr->opc == OPC_STC && n == 1) valid_flags |= IR3_REG_SHARED; + if (instr->opc == OPC_SHFL && n == 1) + valid_flags |= IR3_REG_SHARED; if (flags & ~valid_flags) return false; diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 293e1badacd..9ba1c6fd208 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -2062,7 +2062,7 @@ is_ss_producer(struct ir3_instruction *instr) if (instr->block->in_early_preamble && writes_addr1(instr)) return true; - return is_sfu(instr) || is_local_mem_load(instr); + return is_sfu(instr) || is_local_mem_load(instr) || instr->opc == OPC_SHFL; } static inline bool diff --git a/src/freedreno/ir3/ir3_legalize.c b/src/freedreno/ir3/ir3_legalize.c index 78342318ca3..3b1c8e67092 100644 --- a/src/freedreno/ir3/ir3_legalize.c +++ b/src/freedreno/ir3/ir3_legalize.c @@ -598,7 +598,7 @@ legalize_block(struct ir3_legalize_ctx *ctx, struct ir3_block *block) list_addtail(&n->node, &block->instr_list); } - if (is_sfu(n)) + if (is_sfu(n) || n->opc == OPC_SHFL) regmask_set(&state->needs_ss, n->dsts[0]); foreach_dst (dst, n) { diff --git a/src/freedreno/ir3/ir3_validate.c b/src/freedreno/ir3/ir3_validate.c index a67fdfa6ce9..914b8480b88 100644 --- a/src/freedreno/ir3/ir3_validate.c +++ b/src/freedreno/ir3/ir3_validate.c @@ -434,6 +434,11 @@ validate_instr(struct ir3_validate_ctx *ctx, struct ir3_instruction *instr) validate_assert(ctx, !(instr->srcs[2]->flags & IR3_REG_HALF)); validate_reg_size(ctx, instr->dsts[0], instr->cat6.type); break; + case OPC_SHFL: + validate_reg_size(ctx, instr->srcs[0], instr->cat6.type); + validate_assert(ctx, !(instr->srcs[1]->flags & IR3_REG_HALF)); + validate_reg_size(ctx, instr->dsts[0], instr->cat6.type); + break; default: validate_reg_size(ctx, instr->dsts[0], instr->cat6.type); validate_assert(ctx, !(instr->srcs[0]->flags & IR3_REG_HALF));