diff options
author | Alyssa Rosenzweig <[email protected]> | 2019-11-04 10:32:49 -0500 |
---|---|---|
committer | Alyssa Rosenzweig <[email protected]> | 2019-11-04 15:36:08 -0500 |
commit | 45ac8ea8bd8541d0a6d861dc84a66fa8fa69fb09 (patch) | |
tree | d0219b7b38bf3d8617c113e08abe83a1ad4f8394 | |
parent | 0a77dd32035501d976550928b7c65f7ae28a3e71 (diff) |
pan/midgard: Fix quadword_count handling
Spilling can mess with this considerably.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/panfrost/midgard/midgard_compile.c | 6 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_schedule.c | 4 | ||||
-rw-r--r-- | 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 |