On October 19, 2019 5:04:51 PM GMT+02:00, Richard Sandiford 
<richard.sandif...@arm.com> wrote:
>If the first attempt at applying BB SLP to a region fails, the main
>loop
>in vect_slp_bb recomputes the region's bounds and datarefs for the next
>vector size.  AFAICT this isn't needed any more; we should be able
>to reuse the datarefs from the first attempt instead.
>
>Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?


OK. 

Richard. 
>Richard
>
>
>2019-10-19  Richard Sandiford  <richard.sandif...@arm.com>
>
>gcc/
>       * tree-vect-slp.c (vect_slp_analyze_bb_1): Call save_datarefs
>       when processing the given datarefs for the first time and
>       check_datarefs subsequently.
>       (vect_slp_bb_region): New function, split out of...
>       (vect_slp_bb): ...here.  Don't recompute the region bounds and
>       dataref sets when retrying with a different vector size.
>
>Index: gcc/tree-vect-slp.c
>===================================================================
>*** gcc/tree-vect-slp.c        2019-10-11 15:43:55.439484181 +0100
>--- gcc/tree-vect-slp.c        2019-10-19 16:03:30.000000000 +0100
>*************** vect_slp_analyze_bb_1 (gimple_stmt_itera
>*** 2852,2857 ****
>--- 2852,2858 ----
>    slp_instance instance;
>    int i;
>    poly_uint64 min_vf = 2;
>+   bool first_time_p = shared->datarefs.is_empty ();
>  
>    /* The first group of checks is independent of the vector size.  */
>    fatal = true;
>*************** vect_slp_analyze_bb_1 (gimple_stmt_itera
>*** 2871,2877 ****
>      return NULL;
>  
>    BB_VINFO_DATAREFS (bb_vinfo) = datarefs;
>!   bb_vinfo->shared->save_datarefs ();
>  
>    /* Analyze the data references.  */
>  
>--- 2872,2881 ----
>      return NULL;
>  
>    BB_VINFO_DATAREFS (bb_vinfo) = datarefs;
>!   if (first_time_p)
>!     bb_vinfo->shared->save_datarefs ();
>!   else
>!     bb_vinfo->shared->check_datarefs ();
>  
>    /* Analyze the data references.  */
>  
>*************** vect_slp_analyze_bb_1 (gimple_stmt_itera
>*** 3007,3022 ****
>    return bb_vinfo;
>  }
>  
>! 
>! /* Main entry for the BB vectorizer.  Analyze and transform BB,
>returns
>!    true if anything in the basic-block was vectorized.  */
>! 
>! bool
>! vect_slp_bb (basic_block bb)
>  {
>    bb_vec_info bb_vinfo;
>-   gimple_stmt_iterator gsi;
>-   bool any_vectorized = false;
>    auto_vector_sizes vector_sizes;
>  
>    /* Autodetect first vector size we try.  */
>--- 3011,3028 ----
>    return bb_vinfo;
>  }
>  
>! /* Subroutine of vect_slp_bb.  Try to vectorize the statements
>between
>!    REGION_BEGIN (inclusive) and REGION_END (exclusive), returning
>true
>!    on success.  The region has N_STMTS statements and has the
>datarefs
>!    given by DATAREFS.  */
>! 
>! static bool
>! vect_slp_bb_region (gimple_stmt_iterator region_begin,
>!                  gimple_stmt_iterator region_end,
>!                  vec<data_reference_p> datarefs,
>!                  unsigned int n_stmts)
>  {
>    bb_vec_info bb_vinfo;
>    auto_vector_sizes vector_sizes;
>  
>    /* Autodetect first vector size we try.  */
>*************** vect_slp_bb (basic_block bb)
>*** 3024,3069 ****
>   targetm.vectorize.autovectorize_vector_sizes (&vector_sizes, false);
>    unsigned int next_size = 0;
>  
>!   gsi = gsi_start_bb (bb);
>  
>    poly_uint64 autodetected_vector_size = 0;
>    while (1)
>      {
>-       if (gsi_end_p (gsi))
>-      break;
>- 
>-       gimple_stmt_iterator region_begin = gsi;
>-       vec<data_reference_p> datarefs = vNULL;
>-       int insns = 0;
>- 
>-       for (; !gsi_end_p (gsi); gsi_next (&gsi))
>-      {
>-        gimple *stmt = gsi_stmt (gsi);
>-        if (is_gimple_debug (stmt))
>-          continue;
>-        insns++;
>- 
>-        if (gimple_location (stmt) != UNKNOWN_LOCATION)
>-          vect_location = stmt;
>- 
>-        if (!vect_find_stmt_data_reference (NULL, stmt, &datarefs))
>-          break;
>-      }
>- 
>-       /* Skip leading unhandled stmts.  */
>-       if (gsi_stmt (region_begin) == gsi_stmt (gsi))
>-      {
>-        gsi_next (&gsi);
>-        continue;
>-      }
>- 
>-       gimple_stmt_iterator region_end = gsi;
>- 
>        bool vectorized = false;
>        bool fatal = false;
>-       vec_info_shared shared;
>        bb_vinfo = vect_slp_analyze_bb_1 (region_begin, region_end,
>!                                      datarefs, insns, fatal, &shared);
>        if (bb_vinfo
>         && dbg_cnt (vect_slp))
>       {
>--- 3030,3044 ----
>   targetm.vectorize.autovectorize_vector_sizes (&vector_sizes, false);
>    unsigned int next_size = 0;
>  
>!   vec_info_shared shared;
>  
>    poly_uint64 autodetected_vector_size = 0;
>    while (1)
>      {
>        bool vectorized = false;
>        bool fatal = false;
>        bb_vinfo = vect_slp_analyze_bb_1 (region_begin, region_end,
>!                                      datarefs, n_stmts, fatal, &shared);
>        if (bb_vinfo
>         && dbg_cnt (vect_slp))
>       {
>*************** vect_slp_bb (basic_block bb)
>*** 3090,3097 ****
>       }
>        delete bb_vinfo;
>  
>-       any_vectorized |= vectorized;
>- 
>        if (next_size == 0)
>       autodetected_vector_size = current_vector_size;
>  
>--- 3065,3070 ----
>*************** vect_slp_bb (basic_block bb)
>*** 3105,3137 ****
>         /* If vect_slp_analyze_bb_1 signaled that analysis for all
>            vector sizes will fail do not bother iterating.  */
>         || fatal)
>       {
>!        if (gsi_end_p (region_end))
>!          break;
>  
>!        /* Skip the unhandled stmt.  */
>!        gsi_next (&gsi);
>  
>!        /* And reset vector sizes.  */
>!        current_vector_size = 0;
>!        next_size = 0;
>!      }
>!       else
>       {
>!        /* Try the next biggest vector size.  */
>!        current_vector_size = vector_sizes[next_size++];
>!        if (dump_enabled_p ())
>!          {
>!            dump_printf_loc (MSG_NOTE, vect_location,
>!                             "***** Re-trying analysis with "
>!                             "vector size ");
>!            dump_dec (MSG_NOTE, current_vector_size);
>!            dump_printf (MSG_NOTE, "\n");
>!          }
>  
>!        /* Start over.  */
>!        gsi = region_begin;
>       }
>      }
>  
>    return any_vectorized;
>--- 3078,3145 ----
>         /* If vect_slp_analyze_bb_1 signaled that analysis for all
>            vector sizes will fail do not bother iterating.  */
>         || fatal)
>+      return vectorized;
>+ 
>+       /* Try the next biggest vector size.  */
>+       current_vector_size = vector_sizes[next_size++];
>+       if (dump_enabled_p ())
>       {
>!        dump_printf_loc (MSG_NOTE, vect_location,
>!                         "***** Re-trying analysis with "
>!                         "vector size ");
>!        dump_dec (MSG_NOTE, current_vector_size);
>!        dump_printf (MSG_NOTE, "\n");
>!      }
>!     }
>! }
>  
>! /* Main entry for the BB vectorizer.  Analyze and transform BB,
>returns
>!    true if anything in the basic-block was vectorized.  */
>  
>! bool
>! vect_slp_bb (basic_block bb)
>! {
>!   gimple_stmt_iterator gsi;
>!   bool any_vectorized = false;
>! 
>!   gsi = gsi_start_bb (bb);
>!   while (!gsi_end_p (gsi))
>!     {
>!       gimple_stmt_iterator region_begin = gsi;
>!       vec<data_reference_p> datarefs = vNULL;
>!       int insns = 0;
>! 
>!       for (; !gsi_end_p (gsi); gsi_next (&gsi))
>       {
>!        gimple *stmt = gsi_stmt (gsi);
>!        if (is_gimple_debug (stmt))
>!          continue;
>!        insns++;
>! 
>!        if (gimple_location (stmt) != UNKNOWN_LOCATION)
>!          vect_location = stmt;
>  
>!        if (!vect_find_stmt_data_reference (NULL, stmt, &datarefs))
>!          break;
>       }
>+ 
>+       /* Skip leading unhandled stmts.  */
>+       if (gsi_stmt (region_begin) == gsi_stmt (gsi))
>+      {
>+        gsi_next (&gsi);
>+        continue;
>+      }
>+ 
>+       gimple_stmt_iterator region_end = gsi;
>+ 
>+       if (vect_slp_bb_region (region_begin, region_end, datarefs,
>insns))
>+      any_vectorized = true;
>+ 
>+       if (gsi_end_p (region_end))
>+      break;
>+ 
>+       /* Skip the unhandled stmt.  */
>+       gsi_next (&gsi);
>      }
>  
>    return any_vectorized;

Reply via email to