public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-9008] amdgcn: Disallow unsupported permute on RDNA devices
@ 2024-02-15 13:01 Andrew Stubbs
  0 siblings, 0 replies; only message in thread
From: Andrew Stubbs @ 2024-02-15 13:01 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:84da9bca72558119974db307208eb2fa2b8ad5dd

commit r14-9008-g84da9bca72558119974db307208eb2fa2b8ad5dd
Author: Andrew Stubbs <ams@baylibre.com>
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<V_MOV:mode><V_MOV_ALT:mode>): 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 (<V_MOV_ALT:MODE>mode) < MODE_VF (<V_MOV:MODE>mode)
-   && <V_MOV_ALT:SCALAR_MODE>mode == <V_MOV:SCALAR_MODE>mode"
+   && <V_MOV_ALT:SCALAR_MODE>mode == <V_MOV:SCALAR_MODE>mode
+   && (!TARGET_RDNA2_PLUS || MODE_VF (<V_MOV:MODE>mode) <= 32)"
   {
     int numlanes = GET_MODE_NUNITS (<V_MOV_ALT:MODE>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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-15 13:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-15 13:01 [gcc r14-9008] amdgcn: Disallow unsupported permute on RDNA devices Andrew Stubbs

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).