[PATCH] More vectorizer TLC

Richard Biener rguenther@suse.de
Wed Oct 14 08:32:00 GMT 2015


Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-10-14  Richard Biener  <rguenther@suse.de>

	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment):
	Reset info at start.
	(vect_analyze_group_access_1): Add debug print.
	* tree-vect-loop.c (vect_get_single_scalar_iteration_cost): Rename ...
	(vect_compute_single_scalar_iteration_cost): ... to this.
	(vect_analyze_loop_2): Adjust.
	* tree-vect-slp.c (struct _slp_oprnd_info): Move from ...
	* tree-vectorizer.h: ... here.
	(add_stmt_info_to_vec): Remove.
	* tree-vect-stmts.c (record_stmt_cost): Inline add_stmt_info_to_vec.

Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c	(revision 228759)
--- gcc/tree-vect-data-refs.c	(working copy)
*************** vect_enhance_data_refs_alignment (loop_v
*** 1352,1357 ****
--- 1352,1361 ----
      dump_printf_loc (MSG_NOTE, vect_location,
                       "=== vect_enhance_data_refs_alignment ===\n");
  
+   /* Reset data so we can safely be called multiple times.  */
+   LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).truncate (0);
+   LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) = 0;
+ 
    /* While cost model enhancements are expected in the future, the high level
       view of the code at this time is as follows:
  
*************** vect_analyze_group_access_1 (struct data
*** 2151,2156 ****
--- 2155,2164 ----
                    return false;
                  }
  
+ 	      if (dump_enabled_p ())
+ 		dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ 				 "Two or more load stmts share the same dr.\n");
+ 
                /* For load use the same data-ref load.  */
                GROUP_SAME_DR_STMT (vinfo_for_stmt (next)) = prev;
  
Index: gcc/tree-vect-loop.c
===================================================================
*** gcc/tree-vect-loop.c	(revision 228759)
--- gcc/tree-vect-loop.c	(working copy)
*************** destroy_loop_vec_info (loop_vec_info loo
*** 1043,1049 ****
  
  /* Calculate the cost of one scalar iteration of the loop.  */
  static void
! vect_get_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
  {
    struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
    basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
--- 1043,1049 ----
  
  /* Calculate the cost of one scalar iteration of the loop.  */
  static void
! vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
  {
    struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
    basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
*************** vect_analyze_loop_2 (loop_vec_info loop_
*** 1739,1745 ****
      }
  
    /* Compute the scalar iteration cost.  */
!   vect_get_single_scalar_iteration_cost (loop_vinfo);
  
    /* This pass will decide on using loop versioning and/or loop peeling in
       order to enhance the alignment of data references in the loop.  */
--- 1739,1745 ----
      }
  
    /* Compute the scalar iteration cost.  */
!   vect_compute_single_scalar_iteration_cost (loop_vinfo);
  
    /* This pass will decide on using loop versioning and/or loop peeling in
       order to enhance the alignment of data references in the loop.  */
Index: gcc/tree-vect-slp.c
===================================================================
*** gcc/tree-vect-slp.c	(revision 228759)
--- gcc/tree-vect-slp.c	(working copy)
*************** vect_create_new_slp_node (vec<gimple *>
*** 135,140 ****
--- 135,157 ----
  }
  
  
+ /* This structure is used in creation of an SLP tree.  Each instance
+    corresponds to the same operand in a group of scalar stmts in an SLP
+    node.  */
+ typedef struct _slp_oprnd_info
+ {
+   /* Def-stmts for the operands.  */
+   vec<gimple *> def_stmts;
+   /* Information about the first statement, its vector def-type, type, the
+      operand itself in case it's constant, and an indication if it's a pattern
+      stmt.  */
+   enum vect_def_type first_dt;
+   tree first_op_type;
+   bool first_pattern;
+   bool second_pattern;
+ } *slp_oprnd_info;
+ 
+ 
  /* Allocate operands info for NOPS operands, and GROUP_SIZE def-stmts for each
     operand.  */
  static vec<slp_oprnd_info> 
Index: gcc/tree-vect-stmts.c
===================================================================
*** gcc/tree-vect-stmts.c	(revision 228759)
--- gcc/tree-vect-stmts.c	(working copy)
*************** record_stmt_cost (stmt_vector_for_cost *
*** 94,105 ****
    if (body_cost_vec)
      {
        tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
!       add_stmt_info_to_vec (body_cost_vec, count, kind,
! 			    stmt_info ? STMT_VINFO_STMT (stmt_info) : NULL,
! 			    misalign);
        return (unsigned)
  	(builtin_vectorization_cost (kind, vectype, misalign) * count);
- 	 
      }
    else
      return add_stmt_cost (stmt_info->vinfo->target_cost_data,
--- 94,105 ----
    if (body_cost_vec)
      {
        tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
!       stmt_info_for_cost si = { count, kind,
! 			        stmt_info ? STMT_VINFO_STMT (stmt_info) : NULL,
! 				misalign };
!       body_cost_vec->safe_push (si);
        return (unsigned)
  	(builtin_vectorization_cost (kind, vectype, misalign) * count);
      }
    else
      return add_stmt_cost (stmt_info->vinfo->target_cost_data,
Index: gcc/tree-vectorizer.h
===================================================================
*** gcc/tree-vectorizer.h	(revision 228759)
--- gcc/tree-vectorizer.h	(working copy)
*************** struct stmt_info_for_cost {
*** 73,93 ****
    int misalign;
  };
  
- 
  typedef vec<stmt_info_for_cost> stmt_vector_for_cost;
  
- static inline void
- add_stmt_info_to_vec (stmt_vector_for_cost *stmt_cost_vec, int count,
- 		      enum vect_cost_for_stmt kind, gimple *stmt, int misalign)
- {
-   stmt_info_for_cost si;
-   si.count = count;
-   si.kind = kind;
-   si.stmt = stmt;
-   si.misalign = misalign;
-   stmt_cost_vec->safe_push (si);
- }
- 
  /************************************************************************
    SLP
   ************************************************************************/
--- 73,80 ----
*************** typedef struct _slp_instance {
*** 145,166 ****
  #define SLP_TREE_LOAD_PERMUTATION(S)             (S)->load_permutation
  #define SLP_TREE_TWO_OPERATORS(S)		 (S)->two_operators
  
- /* This structure is used in creation of an SLP tree.  Each instance
-    corresponds to the same operand in a group of scalar stmts in an SLP
-    node.  */
- typedef struct _slp_oprnd_info
- {
-   /* Def-stmts for the operands.  */
-   vec<gimple *> def_stmts;
-   /* Information about the first statement, its vector def-type, type, the
-      operand itself in case it's constant, and an indication if it's a pattern
-      stmt.  */
-   enum vect_def_type first_dt;
-   tree first_op_type;
-   bool first_pattern;
-   bool second_pattern;
- } *slp_oprnd_info;
- 
  
  
  /* This struct is used to store the information of a data reference,
--- 132,137 ----



More information about the Gcc-patches mailing list