tree-vect-slp.c (vect_supported_load_permutation_p): Use vect_transform_slp_perm_load...
authorRichard Biener <rguenther@suse.de>
Wed, 6 May 2015 10:49:35 +0000 (10:49 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 6 May 2015 10:49:35 +0000 (10:49 +0000)
2015-05-06  Richard Biener  <rguenther@suse.de>

* tree-vect-slp.c (vect_supported_load_permutation_p): Use
vect_transform_slp_perm_load to check if we support a permutation
for basic-block vectorization.

* gcc.dg/vect/bb-slp-34.c: New testcase.

From-SVN: r222846

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/bb-slp-34.c [new file with mode: 0644]
gcc/tree-vect-slp.c

index 2593a3c..f201ab9 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-06  Richard Biener  <rguenther@suse.de>
+
+       * tree-vect-slp.c (vect_supported_load_permutation_p): Use
+       vect_transform_slp_perm_load to check if we support a permutation
+       for basic-block vectorization.
+
 2015-05-06  Nick Clifton  <nickc@redhat.com>
 
        * config/rl78/rl78.c (need_to_save): Save register 22 if it is
index 6f69362..c42a9d4 100644 (file)
@@ -1,5 +1,9 @@
 2015-05-06  Richard Biener  <rguenther@suse.de>
 
+       * gcc.dg/vect/bb-slp-34.c: New testcase.
+
+2015-05-06  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/62283
        * gcc.dg/vect/bb-slp-14.c: Adjust.
 
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-34.c b/gcc/testsuite/gcc.dg/vect/bb-slp-34.c
new file mode 100644 (file)
index 0000000..62949cc
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+extern void abort (void);
+
+int a[8], b[8];
+
+void __attribute__((noinline,noclone))
+foo(void)
+{
+  a[0] = b[3];
+  a[1] = b[2];
+  a[2] = b[1];
+  a[3] = b[0];
+  a[4] = b[2];
+  a[5] = b[3];
+  a[6] = b[4];
+  a[7] = b[5];
+}
+
+int main()
+{
+  int i;
+  check_vect ();
+  for (i = 0; i < 8; ++i)
+    b[i] = i;
+  foo ();
+  if (a[0] != 3 || a[1] != 2 || a[2] != 1 || a[3] != 0
+      || a[4] != 2 || a[5] != 3 || a[6] != 4 || a[7] != 5)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" { target vect_perm } } } */
+/* { dg-final { cleanup-tree-dump "slp1" } } */
+/* { dg-final { cleanup-tree-dump "slp2" } } */
index d41aa10..fc96df3 100644 (file)
@@ -1325,17 +1325,36 @@ vect_supported_load_permutation_p (slp_instance slp_instn)
      FORNOW: not supported in loop SLP because of realignment compications.  */
   if (STMT_VINFO_BB_VINFO (vinfo_for_stmt (stmt)))
     {
-      /* Check that for every node in the instance the loads
-        form a subchain.  */
+      /* Check whether the loads in an instance form a subchain and thus
+         no permutation is necessary.  */
       FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node)
         {
+         bool subchain_p = true;
           next_load = NULL;
           FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), j, load)
             {
               if (j != 0 && next_load != load)
-               return false;
+               {
+                 subchain_p = false;
+                 break;
+               }
               next_load = GROUP_NEXT_ELEMENT (vinfo_for_stmt (load));
             }
+         if (subchain_p)
+           SLP_TREE_LOAD_PERMUTATION (node).release ();
+         else
+           {
+             /* Verify the permutation can be generated.  */
+             vec<tree> tem;
+             if (!vect_transform_slp_perm_load (node, tem, NULL,
+                                                1, slp_instn, true))
+               {
+                 dump_printf_loc (MSG_MISSED_OPTIMIZATION,
+                                  vect_location,
+                                  "unsupported load permutation\n");
+                 return false;
+               }
+           }
         }
 
       /* Check that the alignment of the first load in every subchain, i.e.,
@@ -1364,9 +1383,6 @@ vect_supported_load_permutation_p (slp_instance slp_instn)
            }
        }
 
-      /* We are done, no actual permutations need to be generated.  */
-      FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node)
-       SLP_TREE_LOAD_PERMUTATION (node).release ();
       return true;
     }