#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)
{
progress |= true;
}
- return progress;
+ return progress | midgard_opt_copy_prop_reg(ctx, block);
}