aco: consider loop_exit blocks like merge blocks, even if they have only one predecessor
authorDaniel Schürmann <daniel@schuermann.dev>
Wed, 30 Oct 2019 11:04:22 +0000 (12:04 +0100)
committerDaniel Schürmann <daniel@schuermann.dev>
Wed, 30 Oct 2019 19:48:33 +0000 (19:48 +0000)
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
src/amd/compiler/aco_spill.cpp

index 1668360eac0284f4e4b3767a8164990742f7b3ce..4c7a45ad6df8d310d11943b481618a383896f9fc 100644 (file)
@@ -467,7 +467,7 @@ RegisterDemand init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_id
    }
 
    /* branch block */
-   if (block->linear_preds.size() == 1) {
+   if (block->linear_preds.size() == 1 && !(block->kind & block_kind_loop_exit)) {
       /* keep variables spilled if they are alive and not used in the current block */
       unsigned pred_idx = block->linear_preds[0];
       for (std::pair<Temp, uint32_t> pair : ctx.spills_exit[pred_idx]) {
@@ -654,7 +654,7 @@ void add_coupling_code(spill_ctx& ctx, Block* block, unsigned block_idx)
 
    std::vector<aco_ptr<Instruction>> instructions;
    /* branch block: TODO take other branch into consideration */
-   if (block->linear_preds.size() == 1) {
+   if (block->linear_preds.size() == 1 && !(block->kind & block_kind_loop_exit)) {
       assert(ctx.processed[block->linear_preds[0]]);
 
       if (block->logical_preds.size() == 1) {