[AArch64] Improve SVE handling of single-vector permutes
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 23 Aug 2018 08:57:17 +0000 (08:57 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 23 Aug 2018 08:57:17 +0000 (08:57 +0000)
aarch64_vectorize_vec_perm_const was failing to set one_vector_p
if the permute had only a single input.  This in turn was hiding
a problem in the SVE TBL handling: it accepted single-vector
variable-length permutes, but sent them through the general
two-vector aarch64_expand_sve_vec_perm, which is only set up
to handle constant-length permutes.

2018-08-23  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_evpc_sve_tbl): Fix handling
of single-vector TBLs.
(aarch64_vectorize_vec_perm_const): Set one_vector_p when only
one input is given.

gcc/testsuite/
* gcc.dg/vect/no-vfa-vect-depend-2.c: Remove XFAIL.
* gcc.dg/vect/no-vfa-vect-depend-3.c: Likewise.
* gcc.dg/vect/pr65947-13.c: Update for vect_fold_extract_last.
* gcc.dg/vect/pr80631-2.c: Likewise.

From-SVN: r263804

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c
gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c
gcc/testsuite/gcc.dg/vect/pr65947-13.c
gcc/testsuite/gcc.dg/vect/pr80631-2.c

index c7618c66a4c15963045561f67868d26f9519af92..64e6d8e7b974397ca3ed9f88e41c1a4f6248eef7 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-23  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_evpc_sve_tbl): Fix handling
+       of single-vector TBLs.
+       (aarch64_vectorize_vec_perm_const): Set one_vector_p when only
+       one input is given.
+
 2018-08-23  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR target/85910
index 13ffcff78f141232f2c80f647ecd067c35a0c739..5bb30e0c69cd43178f1e52f178d4abd54fb539b0 100644 (file)
@@ -15423,7 +15423,10 @@ aarch64_evpc_sve_tbl (struct expand_vec_perm_d *d)
 
   machine_mode sel_mode = mode_for_int_vector (d->vmode).require ();
   rtx sel = vec_perm_indices_to_rtx (sel_mode, d->perm);
-  aarch64_expand_sve_vec_perm (d->target, d->op0, d->op1, sel);
+  if (d->one_vector_p)
+    emit_unspec2 (d->target, UNSPEC_TBL, d->op0, force_reg (sel_mode, sel));
+  else
+    aarch64_expand_sve_vec_perm (d->target, d->op0, d->op1, sel);
   return true;
 }
 
@@ -15476,7 +15479,8 @@ aarch64_vectorize_vec_perm_const (machine_mode vmode, rtx target, rtx op0,
   struct expand_vec_perm_d d;
 
   /* Check whether the mask can be applied to a single vector.  */
-  if (op0 && rtx_equal_p (op0, op1))
+  if (sel.ninputs () == 1
+      || (op0 && rtx_equal_p (op0, op1)))
     d.one_vector_p = true;
   else if (sel.all_from_input_p (0))
     {
index d011aa73e380bb52918225717001449c1bbbbd61..95fd2e58fe740f3a07fb4ae29aa743ec160ec5cb 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-23  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.dg/vect/no-vfa-vect-depend-2.c: Remove XFAIL.
+       * gcc.dg/vect/no-vfa-vect-depend-3.c: Likewise.
+       * gcc.dg/vect/pr65947-13.c: Update for vect_fold_extract_last.
+       * gcc.dg/vect/pr80631-2.c: Likewise.
+
 2017-08-23  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/86863
index acad8fc033268e5bd2728a617dbc61d9e4ae8c48..1880d1edb329b707489f85167d6a0063cdabeacd 100644 (file)
@@ -51,7 +51,4 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */
-/* Requires reverse for variable-length SVE, which is implemented for
-   by a later patch.  Until then we report it twice, once for SVE and
-   once for 128-bit Advanced SIMD.  */
-/* { dg-final { scan-tree-dump-times "dependence distance negative" 1 "vect" { xfail { aarch64_sve && vect_variable_length } } } } */
+/* { dg-final { scan-tree-dump-times "dependence distance negative" 1 "vect" } } */
index 1ccfc1edaccf0805029cbc35f0fe8dbc6a2583ff..e5914d970e3596a082e015725ba99369670db4e7 100644 (file)
@@ -183,7 +183,4 @@ int main ()
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */
-/* f4 requires reverse for SVE, which is implemented by a later patch.
-   Until then we report it twice, once for SVE and once for 128-bit
-   Advanced SIMD.  */
-/* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect" { xfail { aarch64_sve && vect_variable_length } } } } */
+/* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect" } } */
index ce290459c50943b1a62a1de8eaf0b2b44d6fe7fd..e1d3ff52f5c8b3d2230598e5c9d859bf246d6c0c 100644 (file)
@@ -41,4 +41,5 @@ main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 2 "vect" } } */
-/* { dg-final { scan-tree-dump-times "condition expression based on integer induction." 4 "vect" } } */
+/* { dg-final { scan-tree-dump-times "condition expression based on integer induction." 4 "vect" { xfail vect_fold_extract_last } } } */
+/* { dg-final { scan-tree-dump-times "optimizing condition reduction with FOLD_EXTRACT_LAST" 4 "vect" { target vect_fold_extract_last } } } */
index 6bf239adac59d0952d07fa68ab560a0ceddb6e05..b334ca2345bdf20ab7ea1864e9c1d372f97e6944 100644 (file)
@@ -72,4 +72,5 @@ main ()
 }
 
 /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 5 "vect" { target vect_condition } } } */
-/* { dg-final { scan-tree-dump-times "condition expression based on integer induction." 10 "vect" { target vect_condition } } } */
+/* { dg-final { scan-tree-dump-times "condition expression based on integer induction." 10 "vect" { target vect_condition xfail vect_fold_extract_last } } } */
+/* { dg-final { scan-tree-dump-times "optimizing condition reduction with FOLD_EXTRACT_LAST" 10 "vect" { target vect_fold_extract_last } } } */