Hi All, 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. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar 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. --- inline copy of patch -- diff --git a/gcc/match.pd b/gcc/match.pd index 82f05bbc912e4f80f3984d930c4a8dcb010136e1..cd510d80d409a7c52ba2a78e2fd7df0fc85cab2b 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -8317,7 +8317,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. */ @@ -8356,4 +8356,4 @@ and, } } (if (full_perm_p) - (vec_perm (op @0 @1) (op @0 @1) @2)))))) + (vec_perm (op@3 @0 @1) @3 @2)))))) --