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.
This commit is contained in:
Andrew Stubbs 2024-02-14 15:12:43 +00:00
parent f0b1cf0178
commit 84da9bca72
2 changed files with 14 additions and 8 deletions

View File

@ -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;

View File

@ -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);