This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Avoid recomputing data references in BB SLP
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org,Richard Sandiford <richard dot sandiford at arm dot com>
- Date: Sat, 19 Oct 2019 20:42:04 +0200
- Subject: Re: Avoid recomputing data references in BB SLP
- References: <mpta79wn5d8.fsf@arm.com>
On October 19, 2019 5:04:51 PM GMT+02:00, Richard Sandiford <richard.sandiford@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.sandiford@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;