diff options
author | Richard Biener <rguenther@suse.de> | 2025-08-12 11:00:54 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2025-08-12 12:48:26 +0200 |
commit | 6405c5c4419bef9589baf22daf162a6928af5441 (patch) | |
tree | 7185b731da08528a8bca848afd2473a9e715b390 /gcc | |
parent | e82c8413eda498163ae2e0ecc458ea0428708c30 (diff) | |
download | gcc-6405c5c4419bef9589baf22daf162a6928af5441.zip gcc-6405c5c4419bef9589baf22daf162a6928af5441.tar.gz gcc-6405c5c4419bef9589baf22daf162a6928af5441.tar.bz2 |
Cleanup SLP decision during loop analysis
The following refactors the now misleading slp_done_for_suggested_uf
and slp states kept during vectorizer loop analysis.
* tree-vect-loop.cc (vect_analyze_loop_2): Change
slp_done_for_suggested_uf to a boolean
single_lane_slp_done_for_suggested_uf. Change slp
to force_single_lane boolean.
(vect_analyze_loop_1): Adjust similarly.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-vect-loop.cc | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 32a424c..3b56f86 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -2196,13 +2196,13 @@ vect_determine_partial_vectors_and_peeling (loop_vec_info loop_vinfo) indicates if some analysis meets fatal error. If one non-NULL pointer SUGGESTED_UNROLL_FACTOR is provided, it's intent to be filled with one worked out suggested unroll factor, while one NULL pointer shows it's - going to apply the suggested unroll factor. SLP_DONE_FOR_SUGGESTED_UF - is to hold the slp decision when the suggested unroll factor is worked - out. */ + going to apply the suggested unroll factor. + SINGLE_LANE_SLP_DONE_FOR_SUGGESTED_UF is to hold whether single-lane + slp was forced when the suggested unroll factor was worked out. */ static opt_result vect_analyze_loop_2 (loop_vec_info loop_vinfo, bool &fatal, unsigned *suggested_unroll_factor, - unsigned& slp_done_for_suggested_uf) + bool& single_lane_slp_done_for_suggested_uf) { opt_result ok = opt_result::success (); int res; @@ -2266,14 +2266,14 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo, bool &fatal, bool applying_suggested_uf = loop_vinfo->suggested_unroll_factor > 1; gcc_assert (!applying_suggested_uf || !suggested_unroll_factor); - /* If the slp decision is false when suggested unroll factor is worked - out, and we are applying suggested unroll factor, we can simply skip - all slp related analyses this time. */ - unsigned slp = !applying_suggested_uf ? 2 : slp_done_for_suggested_uf; + /* When single-lane SLP was forced and we are applying suggested unroll + factor, keep that decision here. */ + bool force_single_lane = (applying_suggested_uf + && single_lane_slp_done_for_suggested_uf); /* Classify all cross-iteration scalar data-flow cycles. Cross-iteration cycles caused by virtual phis are analyzed separately. */ - vect_analyze_scalar_cycles (loop_vinfo, slp == 2); + vect_analyze_scalar_cycles (loop_vinfo, !force_single_lane); vect_pattern_recog (loop_vinfo); @@ -2333,7 +2333,7 @@ start_over: /* Check the SLP opportunities in the loop, analyze and build SLP trees. */ ok = vect_analyze_slp (loop_vinfo, loop_vinfo->stmt_vec_infos.length (), - slp == 1); + force_single_lane); if (!ok) return ok; @@ -2668,7 +2668,7 @@ start_over: gcc_assert (known_eq (vectorization_factor, LOOP_VINFO_VECT_FACTOR (loop_vinfo))); - slp_done_for_suggested_uf = slp; + single_lane_slp_done_for_suggested_uf = force_single_lane; /* Ok to vectorize! */ LOOP_VINFO_VECTORIZABLE_P (loop_vinfo) = 1; @@ -2679,7 +2679,7 @@ again: gcc_assert (!ok); /* Try again with single-lane SLP. */ - if (slp == 1) + if (force_single_lane) return ok; /* If we are applying suggested unroll factor, we don't need to @@ -2732,7 +2732,7 @@ again: } /* Roll back state appropriately. Force single-lane SLP this time. */ - slp = 1; + force_single_lane = true; if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "re-trying with single-lane SLP\n"); @@ -2889,12 +2889,12 @@ vect_analyze_loop_1 (class loop *loop, vec_info_shared *shared, if (masked_p != -1) loop_vinfo->can_use_partial_vectors_p = masked_p; unsigned int suggested_unroll_factor = 1; - unsigned slp_done_for_suggested_uf = 0; + bool single_lane_slp_done_for_suggested_uf = false; /* Run the main analysis. */ opt_result res = vect_analyze_loop_2 (loop_vinfo, fatal, &suggested_unroll_factor, - slp_done_for_suggested_uf); + single_lane_slp_done_for_suggested_uf); if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "***** Analysis %s with vector mode %s\n", @@ -2926,16 +2926,17 @@ vect_analyze_loop_1 (class loop *loop, vec_info_shared *shared, if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "***** Re-trying analysis for unrolling" - " with unroll factor %d and slp %s.\n", + " with unroll factor %d and %s slp.\n", suggested_unroll_factor, - slp_done_for_suggested_uf ? "on" : "off"); + single_lane_slp_done_for_suggested_uf + ? "single-lane" : ""); loop_vec_info unroll_vinfo = vect_create_loop_vinfo (loop, shared, loop_form_info, NULL); unroll_vinfo->vector_mode = vector_mode; unroll_vinfo->suggested_unroll_factor = suggested_unroll_factor; opt_result new_res = vect_analyze_loop_2 (unroll_vinfo, fatal, NULL, - slp_done_for_suggested_uf); + single_lane_slp_done_for_suggested_uf); if (new_res) { delete loop_vinfo; |