From 45ac8ea8bd8541d0a6d861dc84a66fa8fa69fb09 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 4 Nov 2019 10:32:49 -0500 Subject: [PATCH] pan/midgard: Fix quadword_count handling Spilling can mess with this considerably. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/midgard_compile.c | 6 +++--- src/panfrost/midgard/midgard_schedule.c | 4 +++- src/panfrost/midgard/mir.c | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 2604bbe980a..22c0d44c759 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -2359,10 +2359,10 @@ midgard_get_first_tag_from_block(compiler_context *ctx, unsigned block_idx) unsigned first_tag = 0; mir_foreach_block_from(ctx, initial_block, v) { - midgard_bundle *initial_bundle = - util_dynarray_element(&v->bundles, midgard_bundle, 0); + if (v->quadword_count) { + midgard_bundle *initial_bundle = + util_dynarray_element(&v->bundles, midgard_bundle, 0); - if (initial_bundle) { first_tag = initial_bundle->tag; break; } diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index acfc5754480..0c93f3ed32b 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -1072,7 +1072,9 @@ schedule_block(compiler_context *ctx, midgard_block *block) /* Blend constant was backwards as well. blend_offset if set is * strictly positive, as an offset of zero would imply constants before - * any instructions which is invalid in Midgard */ + * any instructions which is invalid in Midgard. TODO: blend constants + * are broken if you spill since then quadword_count becomes invalid + * XXX */ if (blend_offset) ctx->blend_constant_offset = ((ctx->quadword_count + block->quadword_count) - blend_offset - 1) * 0x10; diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index fef2fd8e0f8..609cd5c1db4 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -547,6 +547,7 @@ mir_insert_instruction_before_scheduled( memcpy(bundles + before, &new, sizeof(new)); list_addtail(&new.instructions[0]->link, &before_bundle->instructions[0]->link); + block->quadword_count += quadword_size(new.tag); } void @@ -571,6 +572,7 @@ mir_insert_instruction_after_scheduled( midgard_bundle new = mir_bundle_for_op(ctx, ins); memcpy(bundles + after + 1, &new, sizeof(new)); list_add(&new.instructions[0]->link, &after_bundle->instructions[after_bundle->instruction_count - 1]->link); + block->quadword_count += quadword_size(new.tag); } /* Flip the first-two arguments of a (binary) op. Currently ALU -- 2.30.2