diff options
-rw-r--r-- | src/freedreno/ir3/ir3_cf.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/freedreno/ir3/ir3_cf.c b/src/freedreno/ir3/ir3_cf.c index ee717187a99..c1dc5385d36 100644 --- a/src/freedreno/ir3/ir3_cf.c +++ b/src/freedreno/ir3/ir3_cf.c @@ -65,14 +65,24 @@ all_uses_fp16_conv(struct ir3_instruction *conv_src) return true; } +/* For an instruction which has a conversion folded in, re-write the + * uses of *all* conv's that used that src to be a simple mov that + * cp can eliminate. This avoids invalidating the SSA uses, it just + * shifts the use to a simple mov. + */ static void -rewrite_uses(struct ir3_instruction *conv, struct ir3_instruction *replace) +rewrite_src_uses(struct ir3_instruction *src) { - foreach_ssa_use (use, conv) { - foreach_ssa_src_n (src, n, use) { - if (src == conv) - use->regs[n]->instr = replace; + foreach_ssa_use (use, src) { + assert(is_fp16_conv(use)); + + if (is_half(src)) { + use->regs[1]->flags |= IR3_REG_HALF; + } else { + use->regs[1]->flags &= ~IR3_REG_HALF; } + + use->cat1.src_type = use->cat1.dst_type; } } @@ -113,6 +123,7 @@ try_conversion_folding(struct ir3_instruction *conv) if (src->cat1.dst_type != src->cat1.src_type && conv->cat1.src_type != src->cat1.dst_type) return false; + break; default: break; } @@ -137,13 +148,13 @@ try_conversion_folding(struct ir3_instruction *conv) } } - if (conv->regs[0]->flags & IR3_REG_HALF) { + if (is_half(conv)) { src->regs[0]->flags |= IR3_REG_HALF; } else { src->regs[0]->flags &= ~IR3_REG_HALF; } - rewrite_uses(conv, src); + rewrite_src_uses(src); return true; } @@ -157,7 +168,7 @@ ir3_cf(struct ir3 *ir) ir3_find_ssa_uses(ir, mem_ctx, false); foreach_block (block, &ir->block_list) { - foreach_instr_safe (instr, &block->instr_list) { + foreach_instr (instr, &block->instr_list) { progress |= try_conversion_folding(instr); } } |