[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.
This commit is contained in:
parent
25c284f148
commit
98452668d3
4 changed files with 45 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2020-05-19 Alex Coplan <alex.coplan@arm.com>
|
||||
|
||||
PR target/94591
|
||||
* config/aarch64/aarch64.c (aarch64_evpc_rev_local): Don't match
|
||||
identity permutation.
|
||||
|
||||
2020-05-19 Jozef Lawrynowicz <jozef.l@mittosystems.com>
|
||||
|
||||
* doc/sourcebuild.texi: Document new short_eq_int, ptr_eq_short,
|
||||
|
|
|
@ -20191,7 +20191,8 @@ aarch64_evpc_rev_local (struct expand_vec_perm_d *d)
|
|||
|
||||
if (d->vec_flags == VEC_SVE_PRED
|
||||
|| !d->one_vector_p
|
||||
|| !d->perm[0].is_constant (&diff))
|
||||
|| !d->perm[0].is_constant (&diff)
|
||||
|| !diff)
|
||||
return false;
|
||||
|
||||
size = (diff + 1) * GET_MODE_UNIT_SIZE (d->vmode);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-05-19 Alex Coplan <alex.coplan@arm.com>
|
||||
|
||||
PR target/94591
|
||||
* gcc.c-torture/execute/pr94591.c: New test.
|
||||
|
||||
2020-05-19 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
* c-c++-common/raw-string-14.c: Adjust errors.
|
||||
|
|
32
gcc/testsuite/gcc.c-torture/execute/pr94591.c
Normal file
32
gcc/testsuite/gcc.c-torture/execute/pr94591.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
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();
|
||||
}
|
Loading…
Add table
Reference in a new issue