Hi,

This patch is to refactor the handlings for the case (index
== count) in a loop of vect_transform_slp_perm_load_1, in
order to prepare a subsequent adjustment on *nperm.  This
patch doesn't have any functional changes.

Bootstrapped and regtested on x86_64-redhat-linux,
aarch64-linux-gnu and powerpc64{,le}-linux-gnu.

BR,
Kewen
-----
gcc/ChangeLog:

        * tree-vect-slp.cc (vect_transform_slp_perm_load_1): Refactor the
        handling on the case index == count.
---
 gcc/tree-vect-slp.cc | 89 ++++++++++++++++++++++----------------------
 1 file changed, 44 insertions(+), 45 deletions(-)

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 3b7a21724ec..e5c9d7e766e 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -8230,59 +8230,50 @@ vect_transform_slp_perm_load_1 (vec_info *vinfo, 
slp_tree node,
        noop_p = false;
       mask[index++] = mask_element;

-      if (index == count && !noop_p)
+      if (index == count)
        {
-         indices.new_vector (mask, second_vec_index == -1 ? 1 : 2, nunits);
-         if (!can_vec_perm_const_p (mode, mode, indices))
+         if (!noop_p)
            {
-             if (dump_p)
+             indices.new_vector (mask, second_vec_index == -1 ? 1 : 2, nunits);
+             if (!can_vec_perm_const_p (mode, mode, indices))
                {
-                 dump_printf_loc (MSG_MISSED_OPTIMIZATION,
-                                  vect_location,
-                                  "unsupported vect permute { ");
-                 for (i = 0; i < count; ++i)
+                 if (dump_p)
                    {
-                     dump_dec (MSG_MISSED_OPTIMIZATION, mask[i]);
-                     dump_printf (MSG_MISSED_OPTIMIZATION, " ");
+                     dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                      "unsupported vect permute { ");
+                     for (i = 0; i < count; ++i)
+                       {
+                         dump_dec (MSG_MISSED_OPTIMIZATION, mask[i]);
+                         dump_printf (MSG_MISSED_OPTIMIZATION, " ");
+                       }
+                     dump_printf (MSG_MISSED_OPTIMIZATION, "}\n");
                    }
-                 dump_printf (MSG_MISSED_OPTIMIZATION, "}\n");
+                 gcc_assert (analyze_only);
+                 return false;
                }
-             gcc_assert (analyze_only);
-             return false;
-           }

-         ++*n_perms;
-       }
+             ++*n_perms;

-      if (index == count)
-       {
-         if (!analyze_only)
-           {
-             tree mask_vec = NULL_TREE;
-
-             if (! noop_p)
-               mask_vec = vect_gen_perm_mask_checked (vectype, indices);
+             if (!analyze_only)
+               {
+                 tree mask_vec = vect_gen_perm_mask_checked (vectype, indices);

-             if (second_vec_index == -1)
-               second_vec_index = first_vec_index;
+                 if (second_vec_index == -1)
+                   second_vec_index = first_vec_index;

-             for (unsigned int ri = 0; ri < nvectors_per_build; ++ri)
-               {
-                 /* Generate the permute statement if necessary.  */
-                 tree first_vec = dr_chain[first_vec_index + ri];
-                 tree second_vec = dr_chain[second_vec_index + ri];
-                 gimple *perm_stmt;
-                 if (! noop_p)
+                 for (unsigned int ri = 0; ri < nvectors_per_build; ++ri)
                    {
-                     gassign *stmt = as_a <gassign *> (stmt_info->stmt);
+                     /* Generate the permute statement if necessary.  */
+                     tree first_vec = dr_chain[first_vec_index + ri];
+                     tree second_vec = dr_chain[second_vec_index + ri];
+                     gassign *stmt = as_a<gassign *> (stmt_info->stmt);
                      tree perm_dest
                        = vect_create_destination_var (gimple_assign_lhs (stmt),
                                                       vectype);
                      perm_dest = make_ssa_name (perm_dest);
-                     perm_stmt
+                     gimple *perm_stmt
                        = gimple_build_assign (perm_dest, VEC_PERM_EXPR,
-                                              first_vec, second_vec,
-                                              mask_vec);
+                                              first_vec, second_vec, mask_vec);
                      vect_finish_stmt_generation (vinfo, stmt_info, perm_stmt,
                                                   gsi);
                      if (dce_chain)
@@ -8290,15 +8281,23 @@ vect_transform_slp_perm_load_1 (vec_info *vinfo, 
slp_tree node,
                          bitmap_set_bit (used_defs, first_vec_index + ri);
                          bitmap_set_bit (used_defs, second_vec_index + ri);
                        }
+
+                     /* Store the vector statement in NODE.  */
+                     SLP_TREE_VEC_STMTS (node) [vect_stmts_counter++]
+                       = perm_stmt;
                    }
-                 else
-                   {
-                     /* If mask was NULL_TREE generate the requested
-                        identity transform.  */
-                     perm_stmt = SSA_NAME_DEF_STMT (first_vec);
-                     if (dce_chain)
-                       bitmap_set_bit (used_defs, first_vec_index + ri);
-                   }
+               }
+           }
+         else if (!analyze_only)
+           {
+             for (unsigned int ri = 0; ri < nvectors_per_build; ++ri)
+               {
+                 tree first_vec = dr_chain[first_vec_index + ri];
+                 /* If mask was NULL_TREE generate the requested
+                    identity transform.  */
+                 gimple *perm_stmt = SSA_NAME_DEF_STMT (first_vec);
+                 if (dce_chain)
+                   bitmap_set_bit (used_defs, first_vec_index + ri);

                  /* Store the vector statement in NODE.  */
                  SLP_TREE_VEC_STMTS (node)[vect_stmts_counter++] = perm_stmt;
--
2.39.1

Reply via email to