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;
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);
/* 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;
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;
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
}
/* 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");
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",
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;