tree-vect-loop.c (vect_analyze_loop_operations): Use auto_vec for cost vector to...
authorRichard Biener <rguenther@suse.de>
Tue, 22 Jan 2019 08:30:51 +0000 (08:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 22 Jan 2019 08:30:51 +0000 (08:30 +0000)
2019-01-22  Richard Biener  <rguenther@suse.de>

* tree-vect-loop.c (vect_analyze_loop_operations): Use
auto_vec for cost vector to fix memleak.
(vectorize_fold_left_reduction): Properly gather SLP defs.
(vectorizable_comparison): Do not swap operands to properly
gather SLP defs.

From-SVN: r268137

gcc/ChangeLog
gcc/tree-vect-loop.c
gcc/tree-vect-stmts.c

index 8f89d653fd77f2d086ac02a0ce3d3db631324244..18f99a1daeb20aa1d7e31c14ba2df95150e1de00 100644 (file)
@@ -1,3 +1,11 @@
+2019-01-22  Richard Biener  <rguenther@suse.de>
+
+       * tree-vect-loop.c (vect_analyze_loop_operations): Use
+       auto_vec for cost vector to fix memleak.
+       (vectorize_fold_left_reduction): Properly gather SLP defs.
+       (vectorizable_comparison): Do not swap operands to properly
+       gather SLP defs.
+
 2019-01-22  Alan Modra  <amodra@gmail.com>
 
        PR target/88614
index afbf9a9901deaaf5ee5fa503879d259cce593043..202cab940d4719c018d830199cbe0559fb5a0277 100644 (file)
@@ -1470,8 +1470,7 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
 
   DUMP_VECT_SCOPE ("vect_analyze_loop_operations");
 
-  stmt_vector_for_cost cost_vec;
-  cost_vec.create (2);
+  auto_vec<stmt_info_for_cost> cost_vec;
 
   for (i = 0; i < nbbs; i++)
     {
@@ -1581,7 +1580,6 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
     } /* bbs */
 
   add_stmt_costs (loop_vinfo->target_cost_data, &cost_vec);
-  cost_vec.release ();
 
   /* All operations in the loop are either irrelevant (deal with loop
      control, or dead), or only used outside the loop and can be moved
@@ -5742,8 +5740,14 @@ vectorize_fold_left_reduction (stmt_vec_info stmt_info,
   auto_vec<tree> vec_oprnds0;
   if (slp_node)
     {
-      vect_get_vec_defs (op0, NULL_TREE, stmt_info, &vec_oprnds0, NULL,
-                        slp_node);
+      auto_vec<vec<tree> > vec_defs (2);
+      auto_vec<tree> sops(2);
+      sops.quick_push (ops[0]);
+      sops.quick_push (ops[1]);
+      vect_get_slp_defs (sops, slp_node, &vec_defs);
+      vec_oprnds0.safe_splice (vec_defs[1 - reduc_index]);
+      vec_defs[0].release ();
+      vec_defs[1].release ();
       group_size = SLP_TREE_SCALAR_STMTS (slp_node).length ();
       scalar_dest_def_info = SLP_TREE_SCALAR_STMTS (slp_node)[group_size - 1];
     }
index 2220fce316553d2afdff3185f9d566ac1b2f7cce..4359fc9978ae9a0109679792f760c5af0aebcae1 100644 (file)
@@ -9258,6 +9258,7 @@ vectorizable_comparison (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
        BITOP2 (rhs1 BITOP1 rhs2) or
        rhs1 BITOP2 (BITOP1 rhs2)
      depending on bitop1 and bitop2 arity.  */
+  bool swap_p = false;
   if (VECTOR_BOOLEAN_TYPE_P (vectype))
     {
       if (code == GT_EXPR)
@@ -9274,15 +9275,13 @@ vectorizable_comparison (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
        {
          bitop1 = BIT_NOT_EXPR;
          bitop2 = BIT_AND_EXPR;
-         std::swap (rhs1, rhs2);
-         std::swap (dts[0], dts[1]);
+         swap_p = true;
        }
       else if (code == LE_EXPR)
        {
          bitop1 = BIT_NOT_EXPR;
          bitop2 = BIT_IOR_EXPR;
-         std::swap (rhs1, rhs2);
-         std::swap (dts[0], dts[1]);
+         swap_p = true;
        }
       else
        {
@@ -9349,6 +9348,8 @@ vectorizable_comparison (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
              vect_get_slp_defs (ops, slp_node, &vec_defs);
              vec_oprnds1 = vec_defs.pop ();
              vec_oprnds0 = vec_defs.pop ();
+             if (swap_p)
+               std::swap (vec_oprnds0, vec_oprnds1);
            }
          else
            {
@@ -9368,6 +9369,8 @@ vectorizable_comparison (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
 
       if (!slp_node)
        {
+         if (swap_p)
+           std::swap (vec_rhs1, vec_rhs2);
          vec_oprnds0.quick_push (vec_rhs1);
          vec_oprnds1.quick_push (vec_rhs2);
        }