std::vector<unsigned>& preds = block->linear_preds;
/* start block */
- if (idx == 0) {
+ if (preds.empty()) {
aco_ptr<Instruction>& startpgm = block->instructions[0];
assert(startpgm->opcode == aco_opcode::p_startpgm);
bld.insert(std::move(startpgm));
start_exec = Operand::c32_or_c64(-1u, bld.lm == s2);
if (ctx.handle_wqm) {
- ctx.info[0].exec.emplace_back(start_exec, mask_type_global | mask_type_exact);
+ ctx.info[idx].exec.emplace_back(start_exec, mask_type_global | mask_type_exact);
/* if this block needs WQM, initialize already */
- if (ctx.info[0].block_needs & WQM)
- transition_to_WQM(ctx, bld, 0);
+ if (ctx.info[idx].block_needs & WQM)
+ transition_to_WQM(ctx, bld, idx);
} else {
uint8_t mask = mask_type_global;
if (ctx.program->needs_wqm) {
} else {
mask |= mask_type_exact;
}
- ctx.info[0].exec.emplace_back(start_exec, mask);
+ ctx.info[idx].exec.emplace_back(start_exec, mask);
}
return count;
unsigned idx = block->index;
Builder bld(ctx.program, block);
- if (idx == ctx.program->blocks.size() - 1)
+ if (block->linear_succs.empty())
return;
/* try to disable wqm handling */
unsigned idx = add_coupling_code(ctx, block, instructions);
- assert(block->index != ctx.program->blocks.size() - 1 ||
- ctx.info[block->index].exec.size() <= 2);
+ assert(!block->linear_succs.empty() || ctx.info[block->index].exec.size() <= 2);
process_instructions(ctx, block, instructions, idx);