On Wed, Nov 6, 2019 at 1:22 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > Richard Biener <richard.guent...@gmail.com> writes: > > On Mon, Nov 4, 2019 at 4:30 PM Richard Sandiford > > <richard.sandif...@arm.com> wrote: > >> > >> With a later patch I saw a case in which we peeled a single iteration > >> for gaps but didn't need to peel further iterations to make up a full > >> vector. We then tried to vectorise the single-iteration epilogue. > > > > But when peeling for gaps we peel off a full vector iteration and thus > > have possibly VF-1 iterations in the epilogue, enough for vectorizing > > with VF/2? > > Peeling for gaps just means we need to peel off one final scalar > iteration. Often that means we need to peel more to keep the vector > loop operating on a multiple of VF, but if so, that additional peeling > counts as LOOP_VINFO_PEELING_FOR_NITER. > > If we have a VF of 32 and a known iteration count of 65, we can peel a > single iteration for gaps without having to peel any more. (Obviously > we'd peel that iteration anyway if we didn't have to peel it for gaps.) > And when using fully-masked/predicated loops, peeling one iteration for > gaps doesn't force us to peel more, even if the iteration count isn't > known.
For sure when we do not have any epiloge it's pointless to try vectorize it. It seems LOOP_VINFO_PEELING_FOR_NITER is set in "interesting" ways, deciphering it seems to show that when we have an epilogue but not LOOP_VINFO_PEELING_FOR_NITER then that epilogue always has a single iteration only. So, OK ... Richard. > Thanks, > Richard > > >> > >> 2019-11-04 Richard Sandiford <richard.sandif...@arm.com> > >> > >> gcc/ > >> * tree-vect-loop.c (vect_analyze_loop): Only try to vectorize > >> the epilogue if there are peeled iterations for it to handle. > >> > >> Index: gcc/tree-vect-loop.c > >> =================================================================== > >> --- gcc/tree-vect-loop.c 2019-11-04 15:18:26.684592505 +0000 > >> +++ gcc/tree-vect-loop.c 2019-11-04 15:18:36.608524542 +0000 > >> @@ -2462,6 +2462,7 @@ vect_analyze_loop (class loop *loop, loo > >> vect_epilogues = (!loop->simdlen > >> && loop->inner == NULL > >> && PARAM_VALUE (PARAM_VECT_EPILOGUES_NOMASK) > >> + && LOOP_VINFO_PEELING_FOR_NITER > >> (first_loop_vinfo) > >> /* For now only allow one epilogue loop. */ > >> && first_loop_vinfo->epilogue_vinfos.is_empty > >> ()); > >>