Epilogues are special fixed-function blocks, so they need special
handling for liveness analysis to work completely. This in turns fixes
RA issues for many shaders using MRT.
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Visoso <tomeu.vizoso@collabora.com>
* simple bit fields, but for us, liveness is a vector idea. */
uint16_t *live_in;
uint16_t *live_out;
+
+ /* Indicates this is a fixed-function fragment epilogue block */
+ bool epilogue;
} midgard_block;
typedef struct midgard_bundle {
}
EMIT(alu_br_compact_cond, midgard_jmp_writeout_op_writeout, TAG_ALU_4, ~0, midgard_condition_always);
+ ctx->current_block->epilogue = true;
schedule_barrier(ctx);
}
/* If we made progress, we need to process the predecessors */
- if (progress || (blk == exit)) {
+ if (progress || (blk == exit) || blk->epilogue) {
mir_foreach_predecessor(blk, pred)
_mesa_set_add(work_list, pred);
}