diff --git a/src/panfrost/midgard/midgard_opt_copy_prop.c b/src/panfrost/midgard/midgard_opt_copy_prop.c index 7c483b212e5..20e256e6637 100644 --- a/src/panfrost/midgard/midgard_opt_copy_prop.c +++ b/src/panfrost/midgard/midgard_opt_copy_prop.c @@ -25,6 +25,50 @@ #include "compiler.h" #include "midgard_ops.h" +/* Special case for copypropagating the results of vectors */ + +static bool +midgard_opt_copy_prop_reg(compiler_context *ctx, midgard_block *block) +{ + bool progress = false; + + mir_foreach_instr_in_block_safe(block, ins) { + if (ins->type != TAG_ALU_4) continue; + if (!OP_IS_MOVE(ins->alu.op)) continue; + + unsigned from = ins->src[1]; + unsigned to = ins->dest; + + if (!(to & IS_REG)) continue; + if (from & IS_REG) continue; + + if (ins->has_inline_constant) continue; + if (ins->has_constants) continue; + if (mir_nontrivial_source2_mod(ins)) continue; + if (mir_nontrivial_outmod(ins)) continue; + if (!mir_single_use(ctx, ins->src[1])) continue; + + bool bad = false; + + mir_foreach_instr_global(ctx, c) { + if (mir_has_arg(c, ins->src[1])) { + if (ins->mask != c->mask) + bad = true; + } + } + + if (bad) + continue; + + + mir_rewrite_index_dst(ctx, ins->src[1], ins->dest); + mir_remove_instruction(ins); + progress |= true; + } + + return progress; +} + bool midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block) { @@ -90,5 +134,5 @@ midgard_opt_copy_prop(compiler_context *ctx, midgard_block *block) progress |= true; } - return progress; + return progress | midgard_opt_copy_prop_reg(ctx, block); }