diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 2aef1ef9245..f8da9c33623 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -4975,21 +4975,27 @@ select_instruction(opt_ctx& ctx, aco_ptr& instr) if (op_used_twice) continue; + bool dpp8 = info.parent_instr->isDPP8(); + bool input_mods = can_use_input_modifiers(ctx.program->gfx_level, instr->opcode, i) && + get_operand_type(instr, i).bit_size == 32; + bool mov_uses_mods = info.parent_instr->valu().neg[0] || info.parent_instr->valu().abs[0]; + if (((dpp8 && ctx.program->gfx_level < GFX11) || !input_mods) && mov_uses_mods) + continue; + if (i != 0) { if (!can_swap_operands(instr, &instr->opcode, 0, i)) continue; instr->valu().swapOperands(0, i); } - bool dpp8 = info.parent_instr->isDPP8(); - if (!can_use_DPP(ctx.program->gfx_level, instr, dpp8)) - continue; - - bool input_mods = can_use_input_modifiers(ctx.program->gfx_level, instr->opcode, 0) && - get_operand_type(instr, 0).bit_size == 32; - bool mov_uses_mods = info.parent_instr->valu().neg[0] || info.parent_instr->valu().abs[0]; - if (((dpp8 && ctx.program->gfx_level < GFX11) || !input_mods) && mov_uses_mods) + if (!can_use_DPP(ctx.program->gfx_level, instr, dpp8)) { + if (i != 0) { + ASSERTED bool success = can_swap_operands(instr, &instr->opcode, 0, i); + assert(success); + instr->valu().swapOperands(0, i); + } continue; + } convert_to_DPP(ctx.program->gfx_level, instr, dpp8); diff --git a/src/amd/compiler/aco_optimizer_postRA.cpp b/src/amd/compiler/aco_optimizer_postRA.cpp index 82590634830..594960c6633 100644 --- a/src/amd/compiler/aco_optimizer_postRA.cpp +++ b/src/amd/compiler/aco_optimizer_postRA.cpp @@ -649,8 +649,14 @@ try_combine_dpp(pr_opt_ctx& ctx, aco_ptr& instr) instr->valu().swapOperands(0, i); } - if (!can_use_DPP(ctx.program->gfx_level, instr, dpp8)) + if (!can_use_DPP(ctx.program->gfx_level, instr, dpp8)) { + if (i != 0) { + ASSERTED bool success = can_swap_operands(instr, &instr->opcode, 0, i); + assert(success); + instr->valu().swapOperands(0, i); + } continue; + } if (!dpp8) /* anything else doesn't make sense in SSA */ assert(mov->dpp16().row_mask == 0xf && mov->dpp16().bank_mask == 0xf);