Re: [PATCH 1/3] vect: Remove some manual release in vectorizable_store

2023-08-22 Thread Kewen.Lin via Gcc-patches
on 2023/8/22 20:32, Richard Biener wrote:
> On Tue, Aug 22, 2023 at 10:45 AM Kewen.Lin  wrote:
>>
>> Hi,
>>
>> To avoid some duplicates in some follow-up patches on
>> function vectorizable_store, this patch is to adjust some
>> existing vec with auto_vec and remove some manual release
>> invocation.  Also refactor a bit and remove some useless
>> codes.
>>
>> Bootstrapped and regtested on x86_64-redhat-linux,
>> aarch64-linux-gnu and powerpc64{,le}-linux-gnu.
>>
>> Is it ok for trunk?
> 
> OK.

Thanks Richi, pushed this as r14-3402, the other two as r14-3403
and r14-3404.

BR,
Kewen



Re: [PATCH 1/3] vect: Remove some manual release in vectorizable_store

2023-08-22 Thread Richard Biener via Gcc-patches
On Tue, Aug 22, 2023 at 10:45 AM Kewen.Lin  wrote:
>
> Hi,
>
> To avoid some duplicates in some follow-up patches on
> function vectorizable_store, this patch is to adjust some
> existing vec with auto_vec and remove some manual release
> invocation.  Also refactor a bit and remove some useless
> codes.
>
> Bootstrapped and regtested on x86_64-redhat-linux,
> aarch64-linux-gnu and powerpc64{,le}-linux-gnu.
>
> Is it ok for trunk?

OK.

Thanks,
Richard.

> BR,
> Kewen
> -
>
> gcc/ChangeLog:
>
> * tree-vect-stmts.cc (vectorizable_store): Remove vec oprnds,
> adjust vec result_chain, vec_oprnd with auto_vec, and adjust
> gvec_oprnds with auto_delete_vec.
> ---
>  gcc/tree-vect-stmts.cc | 64 +++---
>  1 file changed, 23 insertions(+), 41 deletions(-)
>
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 1580a396301..fcaa4127e52 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -8200,9 +8200,6 @@ vectorizable_store (vec_info *vinfo,
>stmt_vec_info first_stmt_info;
>bool grouped_store;
>unsigned int group_size, i;
> -  vec oprnds = vNULL;
> -  vec result_chain = vNULL;
> -  vec vec_oprnds = vNULL;
>bool slp = (slp_node != NULL);
>unsigned int vec_num;
>bb_vec_info bb_vinfo = dyn_cast  (vinfo);
> @@ -8601,6 +8598,7 @@ vectorizable_store (vec_info *vinfo,
>
>alias_off = build_int_cst (ref_type, 0);
>stmt_vec_info next_stmt_info = first_stmt_info;
> +  auto_vec vec_oprnds (ncopies);
>for (g = 0; g < group_size; g++)
> {
>   running_off = offvar;
> @@ -8682,7 +8680,7 @@ vectorizable_store (vec_info *vinfo,
> }
> }
>   next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> - vec_oprnds.release ();
> + vec_oprnds.truncate(0);
>   if (slp)
> break;
> }
> @@ -8690,9 +8688,6 @@ vectorizable_store (vec_info *vinfo,
>return true;
>  }
>
> -  auto_vec dr_chain (group_size);
> -  oprnds.create (group_size);
> -
>gcc_assert (alignment_support_scheme);
>vec_loop_masks *loop_masks
>  = (loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)
> @@ -8783,11 +8778,15 @@ vectorizable_store (vec_info *vinfo,
>   STMT_VINFO_RELATED_STMT for the next copies.
>*/
>
> +  auto_vec dr_chain (group_size);
> +  auto_vec result_chain (group_size);
>auto_vec vec_masks;
>tree vec_mask = NULL;
>auto_vec vec_offsets;
> -  auto_vec > gvec_oprnds;
> -  gvec_oprnds.safe_grow_cleared (group_size, true);
> +  auto_delete_vec> gvec_oprnds (group_size);
> +  for (i = 0; i < group_size; i++)
> +gvec_oprnds.quick_push (new auto_vec (ncopies));
> +  auto_vec vec_oprnds;
>for (j = 0; j < ncopies; j++)
>  {
>gimple *new_stmt;
> @@ -8803,11 +8802,11 @@ vectorizable_store (vec_info *vinfo,
>else
>  {
>   /* For interleaved stores we collect vectorized defs for all the
> -stores in the group in DR_CHAIN and OPRNDS. DR_CHAIN is then
> -used as an input to vect_permute_store_chain().
> +stores in the group in DR_CHAIN. DR_CHAIN is then used as an
> +input to vect_permute_store_chain().
>
>  If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN
> -and OPRNDS are of size 1.  */
> +is of size 1.  */
>   stmt_vec_info next_stmt_info = first_stmt_info;
>   for (i = 0; i < group_size; i++)
> {
> @@ -8817,11 +8816,10 @@ vectorizable_store (vec_info *vinfo,
>  that there is no interleaving, DR_GROUP_SIZE is 1,
>  and only one iteration of the loop will be executed.  */
>   op = vect_get_store_rhs (next_stmt_info);
> - vect_get_vec_defs_for_operand (vinfo, next_stmt_info,
> -ncopies, op, 
> _oprnds[i]);
> - vec_oprnd = gvec_oprnds[i][0];
> - dr_chain.quick_push (gvec_oprnds[i][0]);
> - oprnds.quick_push (gvec_oprnds[i][0]);
> + vect_get_vec_defs_for_operand (vinfo, next_stmt_info, 
> ncopies,
> +op, gvec_oprnds[i]);
> + vec_oprnd = (*gvec_oprnds[i])[0];
> + dr_chain.quick_push (vec_oprnd);
>   next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> }
>   if (mask)
> @@ -8863,16 +8861,13 @@ vectorizable_store (vec_info *vinfo,
>else
> {
>   gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo));
> - /* For interleaved stores we created vectorized defs for all the
> -defs stored in OPRNDS in the previous iteration (previous copy).
> -DR_CHAIN is then used as an input to vect_permute_store_chain().
> - 

[PATCH 1/3] vect: Remove some manual release in vectorizable_store

2023-08-22 Thread Kewen.Lin via Gcc-patches
Hi,

To avoid some duplicates in some follow-up patches on
function vectorizable_store, this patch is to adjust some
existing vec with auto_vec and remove some manual release
invocation.  Also refactor a bit and remove some useless
codes.

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

Is it ok for trunk?

BR,
Kewen
-

gcc/ChangeLog:

* tree-vect-stmts.cc (vectorizable_store): Remove vec oprnds,
adjust vec result_chain, vec_oprnd with auto_vec, and adjust
gvec_oprnds with auto_delete_vec.
---
 gcc/tree-vect-stmts.cc | 64 +++---
 1 file changed, 23 insertions(+), 41 deletions(-)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 1580a396301..fcaa4127e52 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -8200,9 +8200,6 @@ vectorizable_store (vec_info *vinfo,
   stmt_vec_info first_stmt_info;
   bool grouped_store;
   unsigned int group_size, i;
-  vec oprnds = vNULL;
-  vec result_chain = vNULL;
-  vec vec_oprnds = vNULL;
   bool slp = (slp_node != NULL);
   unsigned int vec_num;
   bb_vec_info bb_vinfo = dyn_cast  (vinfo);
@@ -8601,6 +8598,7 @@ vectorizable_store (vec_info *vinfo,

   alias_off = build_int_cst (ref_type, 0);
   stmt_vec_info next_stmt_info = first_stmt_info;
+  auto_vec vec_oprnds (ncopies);
   for (g = 0; g < group_size; g++)
{
  running_off = offvar;
@@ -8682,7 +8680,7 @@ vectorizable_store (vec_info *vinfo,
}
}
  next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
- vec_oprnds.release ();
+ vec_oprnds.truncate(0);
  if (slp)
break;
}
@@ -8690,9 +8688,6 @@ vectorizable_store (vec_info *vinfo,
   return true;
 }

-  auto_vec dr_chain (group_size);
-  oprnds.create (group_size);
-
   gcc_assert (alignment_support_scheme);
   vec_loop_masks *loop_masks
 = (loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)
@@ -8783,11 +8778,15 @@ vectorizable_store (vec_info *vinfo,
  STMT_VINFO_RELATED_STMT for the next copies.
   */

+  auto_vec dr_chain (group_size);
+  auto_vec result_chain (group_size);
   auto_vec vec_masks;
   tree vec_mask = NULL;
   auto_vec vec_offsets;
-  auto_vec > gvec_oprnds;
-  gvec_oprnds.safe_grow_cleared (group_size, true);
+  auto_delete_vec> gvec_oprnds (group_size);
+  for (i = 0; i < group_size; i++)
+gvec_oprnds.quick_push (new auto_vec (ncopies));
+  auto_vec vec_oprnds;
   for (j = 0; j < ncopies; j++)
 {
   gimple *new_stmt;
@@ -8803,11 +8802,11 @@ vectorizable_store (vec_info *vinfo,
   else
 {
  /* For interleaved stores we collect vectorized defs for all the
-stores in the group in DR_CHAIN and OPRNDS. DR_CHAIN is then
-used as an input to vect_permute_store_chain().
+stores in the group in DR_CHAIN. DR_CHAIN is then used as an
+input to vect_permute_store_chain().

 If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN
-and OPRNDS are of size 1.  */
+is of size 1.  */
  stmt_vec_info next_stmt_info = first_stmt_info;
  for (i = 0; i < group_size; i++)
{
@@ -8817,11 +8816,10 @@ vectorizable_store (vec_info *vinfo,
 that there is no interleaving, DR_GROUP_SIZE is 1,
 and only one iteration of the loop will be executed.  */
  op = vect_get_store_rhs (next_stmt_info);
- vect_get_vec_defs_for_operand (vinfo, next_stmt_info,
-ncopies, op, _oprnds[i]);
- vec_oprnd = gvec_oprnds[i][0];
- dr_chain.quick_push (gvec_oprnds[i][0]);
- oprnds.quick_push (gvec_oprnds[i][0]);
+ vect_get_vec_defs_for_operand (vinfo, next_stmt_info, ncopies,
+op, gvec_oprnds[i]);
+ vec_oprnd = (*gvec_oprnds[i])[0];
+ dr_chain.quick_push (vec_oprnd);
  next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
}
  if (mask)
@@ -8863,16 +8861,13 @@ vectorizable_store (vec_info *vinfo,
   else
{
  gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo));
- /* For interleaved stores we created vectorized defs for all the
-defs stored in OPRNDS in the previous iteration (previous copy).
-DR_CHAIN is then used as an input to vect_permute_store_chain().
-If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN and
-OPRNDS are of size 1.  */
+ /* DR_CHAIN is then used as an input to vect_permute_store_chain().
+If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN is
+of size 1.  */
  for (i = 0;