This is a proposal about epilog loop vectorization.
Currently Loop Vectorizer inserts an epilogue loop for handling loops that don’t have known iteration counts.
The Loop Vectorizer supports loops with an unknown trip count, unknown trip count may not be a multiple of the vector width, and the vectorizer has to execute the last few iterations as scalar code. It keeps a scalar copy of the loop for the remaining iterations.
Loop with the large width has a high possibility of executing many scalar iterations.
i.e. i8 data type with 256bits target register can vectorize with vector width 32, with that maximum trip count possibility for scalar(epilog) loop is 31, which is significant & worth vectorizing.
Large vector factor has following challenges:
- Possibility of remainder iteration is substantial.
- Actual trip count at runtime is substantial but not meeting minimum trip count to execute vector loop.
These challenges can be addressed by mask instructions, but these instructions are limited and may not be available to all targets.
By epilog vectorization our aim to vectorize epilog loop where original loop is vectorized with large vector factor and has a high possibility of executing scalar iterations.
This require following changes:
- Costing: Preserve all profitable vector factor.
- Transform: Create an additional vector loop with next profitable vector factor.
Please refer attached file (BlockLayout.png) for the details about transformed block layout.
I don't see why this variable is needed. It only seems to be used to adjust the assert. I see no problem with relaxing the required loop conditions, but I think that you should just relax them and document what they are.