I forgot to commit the changes done as response to Richards review before committing.
Will push after bootstrap. 2021-11-05 Richard Biener <rguent...@suse.de> * tree-vect-loop.c (vect_analyze_loop): Remove obsolete comment and expand on another one. Combine nested if. --- gcc/tree-vect-loop.c | 48 +++++++++----------------------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index abf87f99d6d..b56b7a4a386 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2998,35 +2998,6 @@ vect_analyze_loop (class loop *loop, vec_info_shared *shared) return opt_loop_vec_info::propagate_failure (res); } - /* When pick_lowest_cost_p is true, we should in principle iterate - over all the loop_vec_infos that LOOP_VINFO could replace and - try to vectorize LOOP_VINFO under the same conditions. - E.g. when trying to replace an epilogue loop, we should vectorize - LOOP_VINFO as an epilogue loop with the same VF limit. When trying - to replace the main loop, we should vectorize LOOP_VINFO as a main - loop too. - - However, autovectorize_vector_modes is usually sorted as follows: - - - Modes that naturally produce lower VFs usually follow modes that - naturally produce higher VFs. - - - When modes naturally produce the same VF, maskable modes - usually follow unmaskable ones, so that the maskable mode - can be used to vectorize the epilogue of the unmaskable mode. - - This order is preferred because it leads to the maximum - epilogue vectorization opportunities. Targets should only use - a different order if they want to make wide modes available while - disparaging them relative to earlier, smaller modes. The assumption - in that case is that the wider modes are more expensive in some - way that isn't reflected directly in the costs. - - There should therefore be few interesting cases in which - LOOP_VINFO fails when treated as an epilogue loop, succeeds when - treated as a standalone loop, and ends up being genuinely cheaper - than FIRST_LOOP_VINFO. */ - auto_vector_modes vector_modes; /* Autodetect first vector size we try. */ vector_modes.safe_push (VOIDmode); @@ -3042,7 +3013,10 @@ vect_analyze_loop (class loop *loop, vec_info_shared *shared) unsigned int first_loop_next_i = 0; unsigned HOST_WIDE_INT simdlen = loop->simdlen; - /* First determine the main loop vectorization mode. */ + /* First determine the main loop vectorization mode, either the first + one that works, starting with auto-detecting the vector mode and then + following the targets order of preference, or the one with the + lowest cost if pick_lowest_cost_p. */ while (1) { unsigned int loop_vinfo_i = mode_i; @@ -3065,15 +3039,13 @@ vect_analyze_loop (class loop *loop, vec_info_shared *shared) first_loop_vinfo = opt_loop_vec_info::success (NULL); simdlen = 0; } - else if (pick_lowest_cost_p && first_loop_vinfo) + else if (pick_lowest_cost_p + && first_loop_vinfo + && vect_joust_loop_vinfos (loop_vinfo, first_loop_vinfo)) { - /* Keep trying to roll back vectorization attempts while the - loop_vec_infos they produced were worse than this one. */ - if (vect_joust_loop_vinfos (loop_vinfo, first_loop_vinfo)) - { - delete first_loop_vinfo; - first_loop_vinfo = opt_loop_vec_info::success (NULL); - } + /* Pick loop_vinfo over first_loop_vinfo. */ + delete first_loop_vinfo; + first_loop_vinfo = opt_loop_vec_info::success (NULL); } if (first_loop_vinfo == NULL) { -- 2.31.1