]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-vectorizer.h (struct _slp_oprnd_info): Remove first_const_oprnd field, rename...
authorRichard Biener <rguenther@suse.de>
Wed, 10 Apr 2013 10:40:33 +0000 (10:40 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 10 Apr 2013 10:40:33 +0000 (10:40 +0000)
2013-04-10  Richard Biener  <rguenther@suse.de>

* tree-vectorizer.h (struct _slp_oprnd_info): Remove
first_const_oprnd field, rename first_def_type to first_op_type.
* tree-vect-slp.c (vect_create_oprnd_info): Adjust.
(vect_get_and_check_slp_defs): Always use the type of the
operand.  Allow mixed vect_external_def, vect_constant_def types.
(vect_get_constant_vectors): Handle mixed vect_external_def,
vect_constant_def types.

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

From-SVN: r197669

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/slp-39.c [new file with mode: 0644]
gcc/tree-vect-slp.c
gcc/tree-vectorizer.h

index 98c6462794d401b6da0a7f6f12e8fd9306b1777b..98feb2c23141592731d9ef60afdbf03747cc18b3 100644 (file)
@@ -1,3 +1,13 @@
+2013-04-10  Richard Biener  <rguenther@suse.de>
+
+       * tree-vectorizer.h (struct _slp_oprnd_info): Remove
+       first_const_oprnd field, rename first_def_type to first_op_type.
+       * tree-vect-slp.c (vect_create_oprnd_info): Adjust.
+       (vect_get_and_check_slp_defs): Always use the type of the
+       operand.  Allow mixed vect_external_def, vect_constant_def types.
+       (vect_get_constant_vectors): Handle mixed vect_external_def,
+       vect_constant_def types.
+
 2013-04-10  Joern Rennecke <joern.rennecke@embecosm.com>
 
        PR tree-optimization/55524
index aacd0094a0951eedfb174e26d31b5e6cc3a71073..debc2aba16bd81238a81d62b81a6e80bd1cdc8a7 100644 (file)
@@ -1,3 +1,7 @@
+2013-04-10  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/vect/slp-39.c: New testcase.
+
 2013-04-10  Joern Rennecke <joern.rennecke@embecosm.com>
 
        PR tree-optimization/55524
diff --git a/gcc/testsuite/gcc.dg/vect/slp-39.c b/gcc/testsuite/gcc.dg/vect/slp-39.c
new file mode 100644 (file)
index 0000000..b3c278a
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do compile } */\r
+/* { dg-require-effective-target vect_double } */\r
+\r
+double x[1024], y[1024], z[1024];\r
+void foo (double w)\r
+{\r
+  int i;\r
+  for (i = 0; i < 1023; i+=2)\r
+    {\r
+      z[i] = x[i] + 1;\r
+      z[i+1] = x[i+1] + w;\r
+    }\r
+}\r
+void bar (double w)\r
+{\r
+  int i;\r
+  for (i = 0; i < 1023; i+=2)\r
+    {\r
+      z[i] = x[i] + w;\r
+      z[i+1] = x[i+1] + 1;\r
+    }\r
+}\r
+\r
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" } } */\r
+/* { dg-final { cleanup-tree-dump "vect" } } */\r
index a06eeb73073a9be29470f53f40808a2c8525a6f5..108a87a27ee21d845845364708f632e1ac6f262b 100644 (file)
@@ -140,8 +140,7 @@ vect_create_oprnd_info (int nops, int group_size)
       oprnd_info = XNEW (struct _slp_oprnd_info);
       oprnd_info->def_stmts.create (group_size);
       oprnd_info->first_dt = vect_uninitialized_def;
-      oprnd_info->first_def_type = NULL_TREE;
-      oprnd_info->first_const_oprnd = NULL_TREE;
+      oprnd_info->first_op_type = NULL_TREE;
       oprnd_info->first_pattern = false;
       oprnds_info.quick_push (oprnd_info);
     }
@@ -321,16 +320,7 @@ vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
        {
          oprnd_info->first_dt = dt;
          oprnd_info->first_pattern = pattern;
-         if (def)
-           {
-             oprnd_info->first_def_type = TREE_TYPE (def);
-             oprnd_info->first_const_oprnd = NULL_TREE;
-           }
-         else
-            {
-              oprnd_info->first_def_type = NULL_TREE;
-              oprnd_info->first_const_oprnd = oprnd;
-            }
+         oprnd_info->first_op_type = TREE_TYPE (oprnd);
        }
       else
        {
@@ -341,14 +331,13 @@ vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
             vect_internal_def.  */
          if (((oprnd_info->first_dt != dt
                 && !(oprnd_info->first_dt == vect_reduction_def
-                     && dt == vect_internal_def))
-               || (oprnd_info->first_def_type != NULL_TREE
-                  && def
-                  && !types_compatible_p (oprnd_info->first_def_type,
-                                          TREE_TYPE (def))))
-              || (!def
-                  && !types_compatible_p (TREE_TYPE (oprnd_info->first_const_oprnd),
-                                          TREE_TYPE (oprnd))))
+                     && dt == vect_internal_def)
+               && !((oprnd_info->first_dt == vect_external_def
+                     || oprnd_info->first_dt == vect_constant_def)
+                    && (dt == vect_external_def
+                        || dt == vect_constant_def)))
+               || !types_compatible_p (oprnd_info->first_op_type,
+                                      TREE_TYPE (oprnd))))
            {
              if (dump_enabled_p ())
                dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -2471,7 +2460,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
                       the lhs, so make sure the scalar is the right type if
                       we are dealing with vectors of
                       long long/long/short/char.  */
-                   if (op_num == 1 && constant_p)
+                   if (op_num == 1 && TREE_CODE (op) == INTEGER_CST)
                      op = fold_convert (TREE_TYPE (vector_type), op);
                    break;
 
@@ -2504,7 +2493,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
           number_of_places_left_in_vector--;
          if (!types_compatible_p (TREE_TYPE (vector_type), TREE_TYPE (op)))
            {
-             if (constant_p)
+             if (CONSTANT_CLASS_P (op))
                {
                  op = fold_unary (VIEW_CONVERT_EXPR,
                                   TREE_TYPE (vector_type), op);
@@ -2525,6 +2514,8 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
                }
            }
          elts[number_of_places_left_in_vector] = op;
+         if (!CONSTANT_CLASS_P (op))
+           constant_p = false;
 
           if (number_of_places_left_in_vector == 0)
             {
index 1a233a01fa20db685f2487825934dddb3edf592e..0f1a02a2e373a3410f51a0cd9b51b388eccb1140 100644 (file)
@@ -169,8 +169,7 @@ typedef struct _slp_oprnd_info
      operand itself in case it's constant, and an indication if it's a pattern
      stmt.  */
   enum vect_def_type first_dt;
-  tree first_def_type;
-  tree first_const_oprnd;
+  tree first_op_type;
   bool first_pattern;
 } *slp_oprnd_info;