Use single-iteration epilogues when peeling for gaps

Programming / Compilers / GCC - rsandifo [138bc75d-0d04-0410-961f-82ee72b054a4] - 13 January 2018 18:00 EST

This patch adds support for fully-masking loops that require peeling for gaps. It peels exactly one scalar iteration and uses the masked loop to handle the rest. Previously we would fall back on using a standard unmasked loop instead.

2018-01-13 Richard Sandiford Alan Hayward David Sherwood

gcc/
- tree-vect-loop-manip.c (vect_gen_scalar_loop_niters): Replace
vfm1 with a bound_epilog parameter. (vect_do_peeling): Update calls accordingly, and move the prologue call earlier in the function. Treat the base bound_epilog as 0 for fully-masked loops and retain vf - 1 for other loops. Add 1 to this base when peeling for gaps.
- tree-vect-loop.c (vect_analyze_loop_2): Allow peeling for gaps with fully-masked loops. (vect_estimate_min_profitable_iters): Handle the single peeled iteration in that case.

gcc/testsuite/
- gcc.target/aarch64/sve/struct_vect_18.c: Check the number of branches.
- gcc.target/aarch64/sve/struct_vect_19.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_20.c: New test.
- gcc.target/aarch64/sve/struct_vect_20_run.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_21.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_21_run.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_22.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_22_run.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_23.c: Likewise.
- gcc.target/aarch64/sve/struct_vect_23_run.c: Likewise.

53771608ba9 Use single-iteration epilogues when peeling for gaps
gcc/ChangeLog | 15 ++++
gcc/testsuite/ChangeLog | 16 ++++
.../gcc.target/aarch64/sve/struct_vect_18.c | 3 +
.../gcc.target/aarch64/sve/struct_vect_19.c | 5 ++
.../gcc.target/aarch64/sve/struct_vect_20.c | 47 +++++++++++
.../gcc.target/aarch64/sve/struct_vect_20_run.c | 36 +++++++++
.../gcc.target/aarch64/sve/struct_vect_21.c | 47 +++++++++++
.../gcc.target/aarch64/sve/struct_vect_21_run.c | 45 +++++++++++
.../gcc.target/aarch64/sve/struct_vect_22.c | 47 +++++++++++
.../gcc.target/aarch64/sve/struct_vect_22_run.c | 36 +++++++++
.../gcc.target/aarch64/sve/struct_vect_23.c | 47 +++++++++++
.../gcc.target/aarch64/sve/struct_vect_23_run.c | 45 +++++++++++
gcc/tree-vect-loop-manip.c | 92 ++++++++++++----------
gcc/tree-vect-loop.c | 27 ++++---
14 files changed, 458 insertions(+), 50 deletions(-)

Upstream: gcc.gnu.org


  • Share