From 6e3446422f816d974a7cd5dfa27e8db3829e1cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 8 Apr 2024 16:15:53 +0200 Subject: [PATCH] aco: introduce aco_opcode::p_boolean_phi This opcode is only used during instruction selection and immediately lowered to linear phis afterwards. Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 6 +++++- src/amd/compiler/aco_lower_phis.cpp | 12 ++++++------ src/amd/compiler/aco_opcodes.py | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index f98912d2980..3498f0fd144 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -10037,6 +10037,10 @@ visit_phi(isel_context* ctx, nir_phi_instr* instr) bool logical = !dst.is_linear() || instr->def.divergent; logical |= (ctx->block->kind & block_kind_merge) != 0; aco_opcode opcode = logical ? aco_opcode::p_phi : aco_opcode::p_linear_phi; + if (instr->def.bit_size == 1) { + logical = true; + opcode = aco_opcode::p_boolean_phi; + } /* we want a sorted list of sources, since the predecessor list is also sorted */ std::map phi_src; @@ -10432,7 +10436,7 @@ visit_loop(isel_context* ctx, nir_loop* loop) else instr->operands.back() = create_continue_phis(ctx, loop_header_idx, ctx->block->index, instr, vals); - } else if (!is_phi(instr)) { + } else if (!is_phi(instr) && instr->opcode != aco_opcode::p_boolean_phi) { break; } } diff --git a/src/amd/compiler/aco_lower_phis.cpp b/src/amd/compiler/aco_lower_phis.cpp index c140aef5c4d..69d46fa743a 100644 --- a/src/amd/compiler/aco_lower_phis.cpp +++ b/src/amd/compiler/aco_lower_phis.cpp @@ -367,12 +367,12 @@ lower_phis(Program* program) for (Block& block : program->blocks) { for (aco_ptr& phi : block.instructions) { - if (phi->opcode == aco_opcode::p_phi) { - assert(program->wave_size == 64 ? phi->definitions[0].regClass() != s1 - : phi->definitions[0].regClass() != s2); - if (phi->definitions[0].regClass() == program->lane_mask) - lower_divergent_bool_phi(program, &state, &block, phi); - else if (phi->definitions[0].regClass().is_subdword()) + if (phi->opcode == aco_opcode::p_boolean_phi) { + assert(program->wave_size == 64 ? phi->definitions[0].regClass() == s2 + : phi->definitions[0].regClass() == s1); + lower_divergent_bool_phi(program, &state, &block, phi); + } else if (phi->opcode == aco_opcode::p_phi) { + if (phi->definitions[0].regClass().is_subdword()) lower_subdword_phis(program, &block, phi); } else if (!is_phi(phi)) { break; diff --git a/src/amd/compiler/aco_opcodes.py b/src/amd/compiler/aco_opcodes.py index e4ddb645195..a56f7147d28 100644 --- a/src/amd/compiler/aco_opcodes.py +++ b/src/amd/compiler/aco_opcodes.py @@ -329,6 +329,7 @@ insn("p_startpgm") insn("p_return") insn("p_phi") insn("p_linear_phi") +insn("p_boolean_phi") insn("p_as_uniform") insn("p_unit_test")