From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1461) id 20F25385022E; Thu, 15 Feb 2024 13:01:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 20F25385022E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1708002106; bh=I2i/4ciDwF0aA0TRl4VOClsB1FrdFmkSiTqni2GDPGE=; h=From:To:Subject:Date:From; b=nIY2lsqbtI5mvypnnshTFqVRLayfjr/wGUW2/ETC0+Gto5jJVukLDHM4FI306cUBB dt63ZoyHByjG5tAUe67z+TVppOt6+naYF9/ggTefLSVhueAYdfGM3n7cgaPQtul3Dc whUHtbENlXcInTbUlybjrEIvcuvOmCl0sJQUhjYk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Stubbs To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9008] amdgcn: Disallow unsupported permute on RDNA devices X-Act-Checkin: gcc X-Git-Author: Andrew Stubbs X-Git-Refname: refs/heads/master X-Git-Oldrev: f0b1cf01782ba975cfda32800c91076df78058d6 X-Git-Newrev: 84da9bca72558119974db307208eb2fa2b8ad5dd Message-Id: <20240215130146.20F25385022E@sourceware.org> Date: Thu, 15 Feb 2024 13:01:46 +0000 (GMT) List-Id: https://gcc.gnu.org/g:84da9bca72558119974db307208eb2fa2b8ad5dd commit r14-9008-g84da9bca72558119974db307208eb2fa2b8ad5dd Author: Andrew Stubbs Date: Wed Feb 14 15:12:43 2024 +0000 amdgcn: Disallow unsupported permute on RDNA devices The RDNA architecture has limited support for permute operations. This should allow use of the permutations that do work, and fall back to linear code for other cases. gcc/ChangeLog: * config/gcn/gcn-valu.md (vec_extract): Add conditions for RDNA. * config/gcn/gcn.cc (gcn_vectorize_vec_perm_const): Check permutation details are supported on RDNA devices. Diff: --- gcc/config/gcn/gcn-valu.md | 3 ++- gcc/config/gcn/gcn.cc | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md index 23b441f8e8b6..59e27d0aed79 100644 --- a/gcc/config/gcn/gcn-valu.md +++ b/gcc/config/gcn/gcn-valu.md @@ -982,7 +982,8 @@ (match_operand:V_MOV 1 "register_operand") (match_operand 2 "immediate_operand")] "MODE_VF (mode) < MODE_VF (mode) - && mode == mode" + && mode == mode + && (!TARGET_RDNA2_PLUS || MODE_VF (mode) <= 32)" { int numlanes = GET_MODE_NUNITS (mode); int firstlane = INTVAL (operands[2]) * numlanes; diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc index 20be45565462..4559d6932d4a 100644 --- a/gcc/config/gcn/gcn.cc +++ b/gcc/config/gcn/gcn.cc @@ -5110,19 +5110,24 @@ gcn_vectorize_vec_perm_const (machine_mode vmode, machine_mode op_mode, gcc_assert (nelt <= 64); gcc_assert (sel.length () == nelt); - if (!dst) - { - /* All vector permutations are possible on this architecture, - with varying degrees of efficiency depending on the permutation. */ - return true; - } - unsigned int perm[64]; for (unsigned int i = 0; i < nelt; ++i) perm[i] = sel[i] & (2 * nelt - 1); for (unsigned int i = nelt; i < 64; ++i) perm[i] = 0; + /* RDNA devices can only do permutations within each group of 32-lanes. + Reject permutations that cross the boundary. */ + if (TARGET_RDNA2_PLUS) + for (unsigned int i = 0; i < nelt; i++) + if (i < 31 ? perm[i] > 31 : perm[i] < 32) + return false; + + /* All vector permutations are possible on other architectures, + with varying degrees of efficiency depending on the permutation. */ + if (!dst) + return true; + src0 = force_reg (vmode, src0); src1 = force_reg (vmode, src1);