X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fcompiler%2Faco_insert_exec_mask.cpp;h=7246fb74e0cf1411c4e77041857dc48a3bc3033e;hb=37988b5b8ed05a7425d615d38dcc6243cf47036e;hp=37a994cd4df2763957084e18d5814ba840220ae4;hpb=db19e96c8c63ee266fee37d3eb634b0ca30a28ab;p=mesa.git diff --git a/src/amd/compiler/aco_insert_exec_mask.cpp b/src/amd/compiler/aco_insert_exec_mask.cpp index 37a994cd4df..7246fb74e0c 100644 --- a/src/amd/compiler/aco_insert_exec_mask.cpp +++ b/src/amd/compiler/aco_insert_exec_mask.cpp @@ -107,10 +107,13 @@ bool pred_by_exec_mask(aco_ptr& instr) { if (instr->format == Format::PSEUDO) { switch (instr->opcode) { case aco_opcode::p_create_vector: - return instr->definitions[0].getTemp().type() == RegType::vgpr; case aco_opcode::p_extract_vector: case aco_opcode::p_split_vector: - return instr->operands[0].getTemp().type() == RegType::vgpr; + for (Definition def : instr->definitions) { + if (def.getTemp().type() == RegType::vgpr) + return true; + } + return false; case aco_opcode::p_spill: case aco_opcode::p_reload: return false; @@ -186,11 +189,14 @@ void get_block_needs(wqm_ctx &ctx, exec_ctx &exec_ctx, Block* block) if (block->kind & block_kind_top_level) { if (ctx.loop && ctx.wqm) { - /* mark all break conditions as WQM */ unsigned block_idx = block->index + 1; while (!(ctx.program->blocks[block_idx].kind & block_kind_top_level)) { + /* flag all break conditions as WQM: + * the conditions might be computed outside the nested CF */ if (ctx.program->blocks[block_idx].kind & block_kind_break) mark_block_wqm(ctx, block_idx); + /* flag all blocks as WQM to ensure we enter all (nested) loops in WQM */ + exec_ctx.info[block_idx].block_needs |= WQM; block_idx++; } } else if (ctx.loop && !ctx.wqm) { @@ -374,7 +380,7 @@ unsigned add_coupling_code(exec_ctx& ctx, Block* block, bld.insert(std::move(startpgm)); /* exec seems to need to be manually initialized with combined shaders */ - if (util_bitcount(ctx.program->stage & sw_mask) > 1) { + if (util_bitcount(ctx.program->stage & sw_mask) > 1 || (ctx.program->stage & hw_ngg_gs)) { bld.sop1(Builder::s_mov, bld.exec(Definition(exec_mask)), bld.lm == s2 ? Operand(UINT64_MAX) : Operand(UINT32_MAX)); instructions[0]->definitions.pop_back(); } @@ -526,7 +532,7 @@ unsigned add_coupling_code(exec_ctx& ctx, Block* block, /* create phi for loop footer */ aco_ptr phi{create_instruction(aco_opcode::p_linear_phi, Format::PSEUDO, preds.size(), 1)}; phi->definitions[0] = bld.def(bld.lm); - if (k == info.num_exec_masks - 1) { + if (k == info.num_exec_masks - 1u) { phi->definitions[0].setFixed(exec); need_parallelcopy = false; }