2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-09 20:31:36 +08:00

middle-end: ensure that VEC_PERM operands get lowered to the same SSA_NAME. [PR107717]

At the moment when the VEC_PERMs generated by this match.pd rule is generated
it creates two different SSA_NAMEs for the folded operand.  Because of this it
the permute switches from a single operand permute to a two operand permute and
the target may no longer support a permute for this.

This fixes it by ensuring we generate the same SSA_NAME for both operands.

gcc/ChangeLog:

	PR tree-optimization/107717
	* match.pd: Ensure same SSA_NAME.

gcc/testsuite/ChangeLog:

	PR tree-optimization/107717
	* gcc.target/aarch64/sve2/pr107717.c: New test.
This commit is contained in:
Tamar Christina 2022-11-17 08:20:59 +00:00
parent 1bc7efa948
commit cbe313060c
2 changed files with 10 additions and 2 deletions
gcc
match.pd
testsuite/gcc.target/aarch64/sve2

@ -8262,7 +8262,7 @@ and,
(simplify
(op (vec_perm @0 @0 @2) (vec_perm @1 @1 @2))
(if (VECTOR_INTEGER_TYPE_P (type))
(vec_perm (op @0 @1) (op @0 @1) @2))))
(vec_perm (op@3 @0 @1) @3 @2))))
/* Similar for float arithmetic when permutation constant covers
all vector elements. */
@ -8301,4 +8301,4 @@ and,
}
}
(if (full_perm_p)
(vec_perm (op @0 @1) (op @0 @1) @2))))))
(vec_perm (op@3 @0 @1) @3 @2))))))

@ -0,0 +1,8 @@
/* { dg-do compile } */
/* { dg-additional-options "-O3 -march=armv8-a+sve2" } */
void foo(int n, char *restrict out, char *restrict in) {
for (int i=n; i-->0; ) {
out[i] += in[i];
}
}