summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-08-13 15:58:49 -0700
committerAlyssa Rosenzweig <[email protected]>2019-08-14 14:58:34 -0700
commit2a9031ea448f56d483bf411f2fac46437e9dee47 (patch)
tree2e0ab75fba8231f1828ba8181b40d2a93a7800b2
parent3e6f2e7aba13ad3fcc652df6fb3f3b4919f803d5 (diff)
pan/midgard: Use hint on midgard_instruction for spill_move
This allows us to have multiple spill moves, whereas otherwise for N spill moves, the first N-1 would be clobbered. Issue found in Krita. Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r--src/panfrost/midgard/compiler.h3
-rw-r--r--src/panfrost/midgard/midgard_schedule.c17
2 files changed, 16 insertions, 4 deletions
diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h
index d62157f3be4..cf7547ccda3 100644
--- a/src/panfrost/midgard/compiler.h
+++ b/src/panfrost/midgard/compiler.h
@@ -134,6 +134,9 @@ typedef struct midgard_instruction {
bool no_spill;
+ /* Generic hint for intra-pass use */
+ bool hint;
+
union {
midgard_load_store_word load_store;
midgard_vector_alu alu;
diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c
index 486bb38e049..ce97287d199 100644
--- a/src/panfrost/midgard/midgard_schedule.c
+++ b/src/panfrost/midgard/midgard_schedule.c
@@ -775,7 +775,6 @@ static void mir_spill_register(
/* Allocate TLS slot (maybe) */
unsigned spill_slot = !is_special ? (*spill_count)++ : 0;
- midgard_instruction *spill_move = NULL;
/* For TLS, replace all stores to the spilled node. For
* special reads, just keep as-is; the class will be demoted
@@ -796,7 +795,10 @@ static void mir_spill_register(
st = v_load_store_scratch(ins->ssa_args.dest, spill_slot, true, ins->mask);
}
- spill_move = mir_insert_instruction_before(mir_next_op(ins), st);
+ /* Hint: don't rewrite this node */
+ st.hint = true;
+
+ mir_insert_instruction_before(mir_next_op(ins), st);
if (!is_special)
ctx->spills++;
@@ -824,8 +826,9 @@ static void mir_spill_register(
unsigned consecutive_index = 0;
mir_foreach_instr_in_block(block, ins) {
- /* We can't rewrite the move used to spill in the first place */
- if (ins == spill_move) continue;
+ /* We can't rewrite the moves used to spill in the
+ * first place. These moves are hinted. */
+ if (ins->hint) continue;
if (!mir_has_arg(ins, spill_node)) {
consecutive_skip = false;
@@ -878,6 +881,12 @@ static void mir_spill_register(
ctx->fills++;
}
}
+
+ /* Reset hints */
+
+ mir_foreach_instr_global(ctx, ins) {
+ ins->hint = false;
+ }
}
void