From f46830912e53f1f56910123b34df20714451605d Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 12 Mar 2025 14:15:17 +0100 Subject: [PATCH] aco: do not apply OMOD/CLAMP for pseudo scalar trans instrs This optimization seems broken because eg. v_s_log_f32 uses SGPRs for both the source and destination but applying OMOD seems to require VGPRs. This fixes a GPU hang when launching Enshrouded on GFX1201. No fossils db changes on GFX1201. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/compiler/aco_optimizer.cpp | 3 +++ src/amd/compiler/tests/test_optimizer.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 0f4b0ea097a..486b8e11bd1 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -3096,6 +3096,9 @@ apply_omod_clamp(opt_ctx& ctx, aco_ptr& instr) if (needs_vop3 && !can_vop3) return false; + if (instr_info.classes[(int)instr->opcode] == instr_class::valu_pseudo_scalar_trans) + return false; + /* SDWA omod is GFX9+. */ bool can_use_omod = (can_vop3 || ctx.program->gfx_level >= GFX9) && !instr->isVOP3P() && (!instr->isVINTERP_INREG() || interp_can_become_fma(ctx, instr)); diff --git a/src/amd/compiler/tests/test_optimizer.cpp b/src/amd/compiler/tests/test_optimizer.cpp index 02ddced7aad..c2fb7323376 100644 --- a/src/amd/compiler/tests/test_optimizer.cpp +++ b/src/amd/compiler/tests/test_optimizer.cpp @@ -2033,3 +2033,18 @@ BEGIN_TEST(optimizer.trans_inline_constant) finish_opt_test(); END_TEST + +BEGIN_TEST(optimizer.trans_no_omod) + //>> s1: %a = p_startpgm + if (!setup_cs("s1", GFX12)) + return; + + //! s1: %tmp0 = v_s_log_f32 %a + //! v1: %res = v_mul_legacy_f32 %tmp0, 0.5 + //! p_unit_test 0, %res + Temp dst = bld.vop3(aco_opcode::v_s_log_f32, bld.def(s1), inputs[0]); + writeout(0, bld.vop2(aco_opcode::v_mul_legacy_f32, bld.def(v1), dst, + bld.copy(bld.def(v1), Operand::c32(0x3f000000)))); + + finish_opt_test(); +END_TEST