Commit 49824d35 by Alex Coplan

aarch64: PR target/94591: Don't generate invalid REV64 insns

This fixes PR94591. The problem was the function aarch64_evpc_rev_local()
matching vector permutations that were not reversals. In particular, prior to
this patch, this function matched the identity permutation which led to
generating bogus REV64 insns which were rejected by the assembler.

gcc/
	PR target/94591
	* config/aarch64/aarch64.c (aarch64_evpc_rev_local): Don't match
	identity permutation.

gcc/testsuite/
	PR target/94591
	* gcc.c-torture/execute/pr94591.c: New test.

(cherry picked from commit 98452668d362bb9e6358f7eb5cff69f4f5ab1d45)
parent 49a35d1f
...@@ -20185,7 +20185,8 @@ aarch64_evpc_rev_local (struct expand_vec_perm_d *d) ...@@ -20185,7 +20185,8 @@ aarch64_evpc_rev_local (struct expand_vec_perm_d *d)
if (d->vec_flags == VEC_SVE_PRED if (d->vec_flags == VEC_SVE_PRED
|| !d->one_vector_p || !d->one_vector_p
|| !d->perm[0].is_constant (&diff)) || !d->perm[0].is_constant (&diff)
|| !diff)
return false; return false;
size = (diff + 1) * GET_MODE_UNIT_SIZE (d->vmode); size = (diff + 1) * GET_MODE_UNIT_SIZE (d->vmode);
......
typedef unsigned __attribute__((__vector_size__(8))) V2SI_u;
typedef int __attribute__((__vector_size__(8))) V2SI_d;
typedef unsigned long __attribute__((__vector_size__(16))) V2DI_u;
typedef long __attribute__((__vector_size__(16))) V2DI_d;
void id_V2SI(V2SI_d *v)
{
*v = __builtin_shuffle(*v, (V2SI_d)(V2SI_u) { 0, 1 });
}
void id_V2DI(V2DI_d *v)
{
*v = __builtin_shuffle(*v, (V2DI_d)(V2DI_u) { 0, 1 });
}
extern void abort(void);
int main(void)
{
V2SI_d si = { 35, 42 };
id_V2SI(&si);
if (si[0] != 35 || si[1] != 42)
abort();
V2DI_d di = { 63, 38 };
id_V2DI(&di);
if (di[0] != 63 || di[1] != 38)
abort();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment