From cda5784eb3dc890138229604ab68fa319626cc73 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 25 Aug 2023 19:23:14 +0200 Subject: [PATCH] aco: use v_cvt_f32_ubyte for signed casts too The extract is always positive, so signed vs unsigned conversion doesn't matter. Foz-DB GFX11: Totals from 167 (0.13% of 133461) affected shaders: Instrs: 401631 -> 401225 (-0.10%) CodeSize: 2107256 -> 2104344 (-0.14%) VGPRs: 13320 -> 13332 (+0.09%) Latency: 6468063 -> 6467241 (-0.01%) InvThroughput: 801854 -> 801653 (-0.03%) Copies: 13926 -> 13927 (+0.01%); split: -0.08%, +0.09% Reviewed-by: Rhys Perry Part-of: --- src/amd/compiler/aco_optimizer.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index d74f7952873..f8a2322603f 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -1065,7 +1065,9 @@ can_apply_extract(opt_ctx& ctx, aco_ptr& instr, unsigned idx, ssa_i return false; } else if (sel.size() == 4) { return true; - } else if (instr->opcode == aco_opcode::v_cvt_f32_u32 && sel.size() == 1 && !sel.sign_extend()) { + } else if ((instr->opcode == aco_opcode::v_cvt_f32_u32 || + instr->opcode == aco_opcode::v_cvt_f32_i32) && + sel.size() == 1 && !sel.sign_extend()) { return true; } else if (instr->opcode == aco_opcode::v_lshlrev_b32 && instr->operands[0].isConstant() && sel.offset() == 0 && @@ -1119,7 +1121,9 @@ apply_extract(opt_ctx& ctx, aco_ptr& instr, unsigned idx, ssa_info& if (sel.size() == 4) { /* full dword selection */ - } else if (instr->opcode == aco_opcode::v_cvt_f32_u32 && sel.size() == 1 && !sel.sign_extend()) { + } else if ((instr->opcode == aco_opcode::v_cvt_f32_u32 || + instr->opcode == aco_opcode::v_cvt_f32_i32) && + sel.size() == 1 && !sel.sign_extend()) { switch (sel.offset()) { case 0: instr->opcode = aco_opcode::v_cvt_f32_ubyte0; break; case 1: instr->opcode = aco_opcode::v_cvt_f32_ubyte1; break;