On Tue, Nov 29, 2016 at 10:42 AM, Andreas Krebbel <kreb...@linux.vnet.ibm.com> wrote: > Although the S/390 backend states that the machine supports unaligned > vector accesses the loop vectorizer still tries to peel loop > iterations to get higher alignments. Setting > vect_max_peeling_for_alignment to 0 prevents this.
Hmm, having proper costs should also do this... but I see you neither have TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST nor TARGET_VECTORIZE_{INIT,ADD,FINISH}_COST hooks. The default implementation (default_builtin_vectorization_cost) makes unaligned loads/stores twice as expensive as the aligned variants. So - please instead of setting this param provide TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST. Richard. > gcc/ChangeLog: > > 2016-11-29 Andreas Krebbel <kreb...@linux.vnet.ibm.com> > > * config/s390/s390.c (s390_option_override_internal): Set > vect_max_peeling_for_alignment to 0. > > gcc/testsuite/ChangeLog: > > 2016-11-29 Andreas Krebbel <kreb...@linux.vnet.ibm.com> > > * gcc.dg/tree-ssa/gen-vect-26.c: Disable peeling check for s390. > * gcc.dg/tree-ssa/gen-vect-28.c: Likewise. > --- > gcc/config/s390/s390.c | 13 +++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c | 5 ++--- > gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c | 4 ++-- > 3 files changed, 17 insertions(+), 5 deletions(-) > > diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c > index dab4f43..2e71745 100644 > --- a/gcc/config/s390/s390.c > +++ b/gcc/config/s390/s390.c > @@ -14586,6 +14586,19 @@ s390_option_override_internal (bool main_args_p, > opts->x_param_values, > opts_set->x_param_values); > > + /* S/390 can deal with unaligned accesses without a performance > + penalty (as long as we do not cross a cache line boundary). This > + setting prevents the vectorizer from generating expensive extra > + code emitted to reach a better alignment. > + Don't do this when vectorize_support_vector_misalignment falls > + back to the default path in order to avoid effects on software > + vectorization. */ > + if (TARGET_VX) > + maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT, > + 0, > + opts->x_param_values, > + opts_set->x_param_values); > + > /* Call target specific restore function to do post-init work. At the > moment, > this just sets opts->x_s390_cost_pointer. */ > s390_function_specific_restore (opts, NULL); > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c > b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c > index 8e5f141..461a952 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c > @@ -28,7 +28,6 @@ int main () > return 0; > } > > - > /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target > { ! avr-*-* } } } } */ > -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 > "vect" { target { ! avr-*-* } } } } */ > -/* { dg-final { scan-tree-dump-times "Alignment of access forced using > peeling" 1 "vect" { target { ! avr-*-* } } } } */ > +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 > "vect" { target { ! { avr-*-* s390*-*-* } } } } } */ > +/* { dg-final { scan-tree-dump-times "Alignment of access forced using > peeling" 1 "vect" { target { ! { avr-*-* s390*-*-* } } } } } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c > b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c > index ce97e09..fe44e85 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c > @@ -38,5 +38,5 @@ int main (void) > > > /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target > { ! avr-*-* } } } } */ > -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 > "vect" { target { ! avr-*-* } } } } */ > -/* { dg-final { scan-tree-dump-times "Alignment of access forced using > peeling" 1 "vect" { target { ! avr-*-* } } } } */ > +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 > "vect" { target { ! { avr-*-* s390*-*-* } } } } } */ > +/* { dg-final { scan-tree-dump-times "Alignment of access forced using > peeling" 1 "vect" { target { ! { avr-*-* s390*-*-* } } } } } */ > -- > 2.9.1 >