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. 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 >> ()); >>