- vect_nopeel renamed to vect_no_peel - documentation added. gcc/testsuite/ChangeLog:
2017-09-26 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * doc/sourcebuild.texi: Document vect_no_peel. gcc/testsuite/ChangeLog: 2017-09-26 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * g++.dg/vect/slp-pr56812.cc: Check vect_nopeel. * lib/target-supports.exp (check_effective_target_vect_nopeel): New proc. --- gcc/doc/sourcebuild.texi | 3 +++ gcc/testsuite/g++.dg/vect/slp-pr56812.cc | 4 +++- gcc/testsuite/lib/target-supports.exp | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 307c726..3acfd85 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1398,6 +1398,9 @@ Target supports a vector misalign access. @item vect_no_align Target does not support a vector alignment mechanism. +@item vect_no_peel +Target does not require any loop peeling for alignment purposes. + @item vect_no_int_min_max Target does not support a vector min and max instruction on @code{int}. diff --git a/gcc/testsuite/g++.dg/vect/slp-pr56812.cc b/gcc/testsuite/g++.dg/vect/slp-pr56812.cc index 80bdcdd..3dbaf76 100644 --- a/gcc/testsuite/g++.dg/vect/slp-pr56812.cc +++ b/gcc/testsuite/g++.dg/vect/slp-pr56812.cc @@ -17,4 +17,6 @@ void mydata::Set (float x) data[i] = x; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */ +/* For targets without vector loop peeling the loop becomes cheap + enough to be vectorized. */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target { ! vect_no_peel } } } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 7fdfbbb..31e802d 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -3199,6 +3199,28 @@ proc check_effective_target_vect_floatuint_cvt { } { return $et_vect_floatuint_cvt_saved($et_index) } +# Return 1 if peeling for alignment is never profitable on the target +# + +proc check_effective_target_vect_no_peel { } { + global et_vect_no_peel_saved + global et_index + + if [info exists et_vect_no_peel_saved($et_index)] { + verbose "check_effective_target_vect_no_peel: using cached result" 2 + } else { + set et_vect_no_peel_saved($et_index) 0 + if { ([istarget s390*-*-*] + && [check_effective_target_s390_vx]) } { + set et_vect_no_peel_saved($et_index) 1 + } + } + + verbose "check_effective_target_vect_no_peel:\ + returning $et_vect_no_peel_saved($et_index)" 2 + return $et_vect_no_peel_saved($et_index) +} + # Return 1 if the target supports #pragma omp declare simd, 0 otherwise. # # This won't change for different subtargets so cache the result. -- 2.9.1