diff mbox

[PING] RE: [PATCH] Vectorization for store with negative step

Message ID B71DF1153024A14EABB94E39368E44A604261295@SJEXCHMB13.corp.ad.broadcom.com
State New
Headers show

Commit Message

Bingfeng Mei Dec. 20, 2013, 10:09 a.m. UTC
OK to commit? 

Thanks,
Bingfeng
-----Original Message-----
From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches-owner@gcc.gnu.org] On Behalf Of Bingfeng Mei
Sent: 18 December 2013 16:25
To: Jakub Jelinek
Cc: Richard Biener; gcc-patches@gcc.gnu.org
Subject: RE: [PATCH] Vectorization for store with negative step

Hi, Jakub,
Sorry for all the formatting issues. Haven't submit a patch for a while :-).
Please find the updated patch. 

Thanks,
Bingfeng

-----Original Message-----
From: Jakub Jelinek [mailto:jakub@redhat.com] 
Sent: 18 December 2013 13:38
To: Bingfeng Mei
Cc: Richard Biener; gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Vectorization for store with negative step

On Wed, Dec 18, 2013 at 01:31:05PM +0000, Bingfeng Mei wrote:
 					  simd_lane_access_p ? loop : NULL,
-					  NULL_TREE, &dummy, gsi, &ptr_incr,
+					  offset, &dummy, gsi, &ptr_incr,
 					  simd_lane_access_p, &inv_p);
 	  gcc_assert (bb_vinfo || !inv_p);
 	}
@@ -5306,6 +5352,21 @@ vectorizable_store (gimple stmt, gimple_
 		set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
 					misalign);
 
+	      if (negative)
+                {
+                  tree perm_mask = perm_mask_for_reverse (vectype);
+                  tree perm_dest = vect_create_destination_var (gimple_assign_rhs1 (stmt), vectype);
+                  tree new_temp = make_ssa_name (perm_dest, NULL);
+
+                  /* Generate the permute statement.  */
+                  gimple perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, new_temp,
+                                                                   vec_oprnd, vec_oprnd, perm_mask);

Too long lines.

	Jakub

Comments

Richard Biener Dec. 20, 2013, 1:23 p.m. UTC | #1
On Fri, Dec 20, 2013 at 11:09 AM, Bingfeng Mei <bmei@broadcom.com> wrote:
> OK to commit?

Ok.

Thanks,
Richard.

> Thanks,
> Bingfeng
> -----Original Message-----
> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches-owner@gcc.gnu.org] On Behalf Of Bingfeng Mei
> Sent: 18 December 2013 16:25
> To: Jakub Jelinek
> Cc: Richard Biener; gcc-patches@gcc.gnu.org
> Subject: RE: [PATCH] Vectorization for store with negative step
>
> Hi, Jakub,
> Sorry for all the formatting issues. Haven't submit a patch for a while :-).
> Please find the updated patch.
>
> Thanks,
> Bingfeng
>
> -----Original Message-----
> From: Jakub Jelinek [mailto:jakub@redhat.com]
> Sent: 18 December 2013 13:38
> To: Bingfeng Mei
> Cc: Richard Biener; gcc-patches@gcc.gnu.org
> Subject: Re: [PATCH] Vectorization for store with negative step
>
> On Wed, Dec 18, 2013 at 01:31:05PM +0000, Bingfeng Mei wrote:
> Index: gcc/ChangeLog
> ===================================================================
> --- gcc/ChangeLog       (revision 206016)
> +++ gcc/ChangeLog       (working copy)
> @@ -1,3 +1,9 @@
> +2013-12-18  Bingfeng Mei  <bmei@broadcom.com>
> +
> +       PR tree-optimization/59544
> +        * tree-vect-stmts.c (perm_mask_for_reverse): Move before
>
> This should be a tab instead of 8 spaces.
>
> +       vectorizable_store. (vectorizable_store): Handle negative step.
>
> Newline and tab after "store.", rather than space.
>
> Property changes on: gcc/testsuite/gcc.target/i386/pr59544.c
> ___________________________________________________________________
> Added: svn:executable
>    + *
>
> Please don't add such bogus property.  Testcases aren't executable.
>
> Index: gcc/testsuite/ChangeLog
> ===================================================================
> --- gcc/testsuite/ChangeLog     (revision 206016)
> +++ gcc/testsuite/ChangeLog     (working copy)
> @@ -1,3 +1,8 @@
> +2013-12-18  Bingfeng Mei  <bmei@broadcom.com>
> +
> +       PR tree-optimization/59544
> +       * gcc.target/i386/pr59544.c: New test
>
> Missing dot at the end of line.
> +
>  2013-12-16  Jakub Jelinek  <jakub@redhat.com>
>
>         PR middle-end/58956
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       (revision 206016)
> +++ gcc/tree-vect-stmts.c       (working copy)
> @@ -4859,6 +4859,25 @@ ensure_base_align (stmt_vec_info stmt_in
>  }
>
>
> +/* Given a vector type VECTYPE returns the VECTOR_CST mask that implements
> +   reversal of the vector elements.  If that is impossible to do,
> +   returns NULL.  */
> +
> +static tree
> +perm_mask_for_reverse (tree vectype)
> +{
> +  int i, nunits;
> +  unsigned char *sel;
> +
> +  nunits = TYPE_VECTOR_SUBPARTS (vectype);
> +  sel = XALLOCAVEC (unsigned char, nunits);
> +
> +  for (i = 0; i < nunits; ++i)
> +    sel[i] = nunits - 1 - i;
> +
> +  return vect_gen_perm_mask (vectype, sel);
> +}
> +
>  /* Function vectorizable_store.
>
>     Check if STMT defines a non scalar data-ref (array/pointer/structure) that
> @@ -4902,6 +4921,8 @@ vectorizable_store (gimple stmt, gimple_
>    vec<tree> oprnds = vNULL;
>    vec<tree> result_chain = vNULL;
>    bool inv_p;
> +  bool negative = false;
> +  tree offset = NULL_TREE;
>    vec<tree> vec_oprnds = vNULL;
>    bool slp = (slp_node != NULL);
>    unsigned int vec_num;
> @@ -4976,16 +4997,38 @@ vectorizable_store (gimple stmt, gimple_
>    if (!STMT_VINFO_DATA_REF (stmt_info))
>      return false;
>
> -  if (tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
> -                           ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
> -                           size_zero_node) < 0)
> +  negative = tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
> +                            ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
> +                            size_zero_node) < 0;
>
> The formatting looks wrong, do:
>   negative
>     = tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
>                             ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
>                             size_zero_node) < 0;
> instead.
>
> +  if (negative && ncopies > 1)
>      {
>        if (dump_enabled_p ())
>          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> -                         "negative step for store.\n");
> +                         "multiple types with negative step.");
>        return false;
>      }
>
> +  if (negative)
> +    {
> +      gcc_assert (!grouped_store);
> +      alignment_support_scheme = vect_supportable_dr_alignment (dr, false);
> +      if (alignment_support_scheme != dr_aligned
> +          && alignment_support_scheme != dr_unaligned_supported)
>
> Lots of places where you use 8 spaces instead of tab, please fix.
> +    offset = size_int (-TYPE_VECTOR_SUBPARTS (vectype) + 1);
> +
>    if (store_lanes_p)
>      aggr_type = build_array_type_nelts (elem_type, vec_num * nunits);
>    else
> @@ -5200,7 +5246,7 @@ vectorizable_store (gimple stmt, gimple_
>             dataref_ptr
>               = vect_create_data_ref_ptr (first_stmt, aggr_type,
>                                           simd_lane_access_p ? loop : NULL,
> -                                         NULL_TREE, &dummy, gsi, &ptr_incr,
> +                                         offset, &dummy, gsi, &ptr_incr,
>                                           simd_lane_access_p, &inv_p);
>           gcc_assert (bb_vinfo || !inv_p);
>         }
> @@ -5306,6 +5352,21 @@ vectorizable_store (gimple stmt, gimple_
>                 set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
>                                         misalign);
>
> +             if (negative)
> +                {
> +                  tree perm_mask = perm_mask_for_reverse (vectype);
> +                  tree perm_dest = vect_create_destination_var (gimple_assign_rhs1 (stmt), vectype);
> +                  tree new_temp = make_ssa_name (perm_dest, NULL);
> +
> +                  /* Generate the permute statement.  */
> +                  gimple perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, new_temp,
> +                                                                   vec_oprnd, vec_oprnd, perm_mask);
>
> Too long lines.
>
>         Jakub
H.J. Lu Dec. 21, 2013, 1:14 a.m. UTC | #2
On Fri, Dec 20, 2013 at 2:09 AM, Bingfeng Mei <bmei@broadcom.com> wrote:
> OK to commit?
>
> Thanks,
> Bingfeng
> -----Original Message-----
> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches-owner@gcc.gnu.org] On Behalf Of Bingfeng Mei
> Sent: 18 December 2013 16:25
> To: Jakub Jelinek
> Cc: Richard Biener; gcc-patches@gcc.gnu.org
> Subject: RE: [PATCH] Vectorization for store with negative step
>
> Hi, Jakub,
> Sorry for all the formatting issues. Haven't submit a patch for a while :-).
> Please find the updated patch.
>

It caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59569
diff mbox

Patch

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 206016)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,9 @@ 
+2013-12-18  Bingfeng Mei  <bmei@broadcom.com>
+
+	PR tree-optimization/59544
+        * tree-vect-stmts.c (perm_mask_for_reverse): Move before

This should be a tab instead of 8 spaces.

+	vectorizable_store. (vectorizable_store): Handle negative step.

Newline and tab after "store.", rather than space.

Property changes on: gcc/testsuite/gcc.target/i386/pr59544.c
___________________________________________________________________
Added: svn:executable
   + *

Please don't add such bogus property.  Testcases aren't executable.

Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 206016)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@ 
+2013-12-18  Bingfeng Mei  <bmei@broadcom.com>
+
+	PR tree-optimization/59544
+	* gcc.target/i386/pr59544.c: New test

Missing dot at the end of line.
+        
 2013-12-16  Jakub Jelinek  <jakub@redhat.com>
 
 	PR middle-end/58956
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	(revision 206016)
+++ gcc/tree-vect-stmts.c	(working copy)
@@ -4859,6 +4859,25 @@  ensure_base_align (stmt_vec_info stmt_in
 }
 
 
+/* Given a vector type VECTYPE returns the VECTOR_CST mask that implements
+   reversal of the vector elements.  If that is impossible to do,
+   returns NULL.  */
+
+static tree
+perm_mask_for_reverse (tree vectype)
+{
+  int i, nunits;
+  unsigned char *sel;
+
+  nunits = TYPE_VECTOR_SUBPARTS (vectype);
+  sel = XALLOCAVEC (unsigned char, nunits);
+
+  for (i = 0; i < nunits; ++i)
+    sel[i] = nunits - 1 - i;
+
+  return vect_gen_perm_mask (vectype, sel);
+}
+
 /* Function vectorizable_store.
 
    Check if STMT defines a non scalar data-ref (array/pointer/structure) that
@@ -4902,6 +4921,8 @@  vectorizable_store (gimple stmt, gimple_
   vec<tree> oprnds = vNULL;
   vec<tree> result_chain = vNULL;
   bool inv_p;
+  bool negative = false;
+  tree offset = NULL_TREE;
   vec<tree> vec_oprnds = vNULL;
   bool slp = (slp_node != NULL);
   unsigned int vec_num;
@@ -4976,16 +4997,38 @@  vectorizable_store (gimple stmt, gimple_
   if (!STMT_VINFO_DATA_REF (stmt_info))
     return false;
 
-  if (tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
-			    ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
-			    size_zero_node) < 0)
+  negative = tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
+                            ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
+                            size_zero_node) < 0;

The formatting looks wrong, do:
  negative
    = tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
			    ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
			    size_zero_node) < 0;
instead.

+  if (negative && ncopies > 1)
     {
       if (dump_enabled_p ())
         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                         "negative step for store.\n");
+                         "multiple types with negative step.");
       return false;
     }
 
+  if (negative)
+    {
+      gcc_assert (!grouped_store);
+      alignment_support_scheme = vect_supportable_dr_alignment (dr, false);
+      if (alignment_support_scheme != dr_aligned
+          && alignment_support_scheme != dr_unaligned_supported)

Lots of places where you use 8 spaces instead of tab, please fix.
+    offset = size_int (-TYPE_VECTOR_SUBPARTS (vectype) + 1);
+
   if (store_lanes_p)
     aggr_type = build_array_type_nelts (elem_type, vec_num * nunits);
   else
@@ -5200,7 +5246,7 @@  vectorizable_store (gimple stmt, gimple_
 	    dataref_ptr
 	      = vect_create_data_ref_ptr (first_stmt, aggr_type,