diff --git a/src/amd/compiler/aco_insert_exec_mask.cpp b/src/amd/compiler/aco_insert_exec_mask.cpp index a027aca857f..6bb5c831cf6 100644 --- a/src/amd/compiler/aco_insert_exec_mask.cpp +++ b/src/amd/compiler/aco_insert_exec_mask.cpp @@ -590,7 +590,10 @@ unsigned add_coupling_code(exec_ctx& ctx, Block* block, /* if one of the predecessors ends in exact mask, we pop it from stack */ unsigned num_exec_masks = std::min(ctx.info[preds[0]].exec.size(), ctx.info[preds[1]].exec.size()); - if (block->kind & block_kind_top_level && !(block->kind & block_kind_merge)) + + if (block->kind & block_kind_merge) + num_exec_masks--; + else if (block->kind & block_kind_top_level) num_exec_masks = std::min(num_exec_masks, 2u); /* create phis for diverged exec masks */ @@ -617,9 +620,6 @@ unsigned add_coupling_code(exec_ctx& ctx, Block* block, i++; } - if (block->kind & block_kind_merge) - ctx.info[idx].exec.pop_back(); - if (block->kind & block_kind_top_level && ctx.info[idx].exec.size() == 3) { assert(ctx.info[idx].exec.back().second == mask_type_exact); assert(block->kind & block_kind_merge);