Define vect_perm for variable-length SVE
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 24 Aug 2018 13:06:56 +0000 (13:06 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 24 Aug 2018 13:06:56 +0000 (13:06 +0000)
Variable-length SVE now supports enough permutes to define vect_perm.

The change to vect_perm_supported is currently a no-op because the
function is only called with a count of 3.

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

gcc/testsuite/
* lib/target-supports.exp (vect_perm_supported): Only return
false for variable-length vectors if the permute size is not
a power of 2.
(check_effective_target_vect_perm)
(check_effective_target_vect_perm_byte)
(check_effective_target_vect_perm_short): Remove check for
variable-length vectors.
* gcc.dg/vect/slp-23.c: Add an XFAIL for variable-length SVE.
* gcc.dg/vect/slp-perm-10.c: Likewise.
* gcc.dg/vect/slp-perm-9.c: Add an XFAIL for variable-length vectors.

From-SVN: r263834

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/slp-23.c
gcc/testsuite/gcc.dg/vect/slp-perm-10.c
gcc/testsuite/gcc.dg/vect/slp-perm-9.c
gcc/testsuite/lib/target-supports.exp

index 6520f46362a790092b99c16c18424e8d2ee1db2a..c6b61981c3dcccc433ac393890772131d0483689 100644 (file)
@@ -1,3 +1,16 @@
+2018-08-24  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * lib/target-supports.exp (vect_perm_supported): Only return
+       false for variable-length vectors if the permute size is not
+       a power of 2.
+       (check_effective_target_vect_perm)
+       (check_effective_target_vect_perm_byte)
+       (check_effective_target_vect_perm_short): Remove check for
+       variable-length vectors.
+       * gcc.dg/vect/slp-23.c: Add an XFAIL for variable-length SVE.
+       * gcc.dg/vect/slp-perm-10.c: Likewise.
+       * gcc.dg/vect/slp-perm-9.c: Add an XFAIL for variable-length vectors.
+
 2018-08-24  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/bswap_1.c: New test.
index 3cda497db0cd5331ad0b6156512a4972a64b4fa0..7d330c787d1118591ecd31fda05cff108cf967e3 100644 (file)
@@ -107,8 +107,8 @@ int main (void)
 
 /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { vect_strided8 && { ! { vect_no_align} } } } } } */
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! { vect_strided8 || vect_no_align } } } } } */
-/* We fail to vectorize the second loop with variable-length SVE but
-   fall back to 128-bit vectors, which does use SLP.  */
 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { ! vect_perm } } } } */
-/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target vect_perm } } } */
+/* SLP fails for the second loop with variable-length SVE because
+   the load size is greater than the minimum vector size.  */
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target vect_perm xfail { aarch64_sve && vect_variable_length } } } } */
   
index 1c2a8580d3c115160798fd54a024de6cc84d8ad2..678152ba4168d32f84a1d1b01ba6c43b210ec8b9 100644 (file)
@@ -50,4 +50,6 @@ int main ()
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_perm } } } */
-/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target vect_perm } } } */
+/* SLP fails for variable-length SVE because the load size is greater
+   than the minimum vector size.  */
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target vect_perm xfail { aarch64_sve && vect_variable_length } } } } */
index b01d493b6e73e4700d5e4bf7137de4a3848c1f92..c54420abd9d9047e5ae686ae2d0170e8523da134 100644 (file)
@@ -59,7 +59,9 @@ int main (int argc, const char* argv[])
 
 /* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" { target { ! { vect_perm_short || vect_load_lanes } } } } } */
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_perm_short || vect_load_lanes } } } } */
-/* { dg-final { scan-tree-dump-times "permutation requires at least three vectors" 1 "vect" { target { vect_perm_short && { ! vect_perm3_short } } } } } */
+/* We don't try permutes with a group size of 3 for variable-length
+   vectors.  */
+/* { dg-final { scan-tree-dump-times "permutation requires at least three vectors" 1 "vect" { target { vect_perm_short && { ! vect_perm3_short } } xfail vect_variable_length } } } */
 /* { dg-final { scan-tree-dump-not "permutation requires at least three vectors" "vect" { target vect_perm3_short } } } */
 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" { target { { ! vect_perm3_short } || vect_load_lanes } } } } */
 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { vect_perm3_short && { ! vect_load_lanes } } } } } */
index b04ceb6508e77b1e7d489207652d8e5d4ea8cf35..b51e8f0a5e9e24c79aeddda96da7952086a3511e 100644 (file)
@@ -5758,8 +5758,7 @@ proc check_effective_target_vect_perm { } {
     } else {
        set et_vect_perm_saved($et_index) 0
         if { [is-effective-target arm_neon]
-            || ([istarget aarch64*-*-*]
-                && ![check_effective_target_vect_variable_length])
+            || [istarget aarch64*-*-*]
             || [istarget powerpc*-*-*]
              || [istarget spu-*-*]
             || [istarget i?86-*-*] || [istarget x86_64-*-*]
@@ -5824,7 +5823,9 @@ proc check_effective_target_vect_perm { } {
 
 proc vect_perm_supported { count element_bits } {
     set vector_bits [lindex [available_vector_sizes] 0]
-    if { $vector_bits <= 0 } {
+    # The number of vectors has to be a power of 2 when permuting
+    # variable-length vectors.
+    if { $vector_bits <= 0 && ($count & -$count) != $count } {
        return 0
     }
     set vf [expr { $vector_bits / $element_bits }]
@@ -5864,8 +5865,7 @@ proc check_effective_target_vect_perm_byte { } {
         if { ([is-effective-target arm_neon]
              && [is-effective-target arm_little_endian])
             || ([istarget aarch64*-*-*]
-                && [is-effective-target aarch64_little_endian]
-                && ![check_effective_target_vect_variable_length])
+                && [is-effective-target aarch64_little_endian])
             || [istarget powerpc*-*-*]
             || [istarget spu-*-*]
             || ([istarget mips-*.*]
@@ -5904,8 +5904,7 @@ proc check_effective_target_vect_perm_short { } {
         if { ([is-effective-target arm_neon]
              && [is-effective-target arm_little_endian])
             || ([istarget aarch64*-*-*]
-                && [is-effective-target aarch64_little_endian]
-                && ![check_effective_target_vect_variable_length])
+                && [is-effective-target aarch64_little_endian])
             || [istarget powerpc*-*-*]
             || [istarget spu-*-*]
             || (([istarget i?86-*-*] || [istarget x86_64-*-*])