gcc/ChangeLog:
2017-09-28 Andreas Krebbel
* doc/sourcebuild.texi: Document vect_can_peel.
gcc/testsuite/ChangeLog:
2017-09-28 Andreas Krebbel
* g++.dg/vect/slp-pr56812.cc: xfail for targets which don't want
vector loop peeling.
* lib/target-supports.exp (check_effective_target_vect_can_peel):
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 e09bca1..01d8595 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1404,6 +1404,9 @@ Target supports a vector misalign access.
@item vect_no_align
Target does not support a vector alignment mechanism.
+@item vect_can_peel
+Target might require to peel loops 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..7d1cd71 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" { xfail
{ ! vect_can_peel } } } } */
diff --git a/gcc/testsuite/lib/target-supports.exp
b/gcc/testsuite/lib/target-supports.exp
index 4f752ec2..49a7aef 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -3277,6 +3277,28 @@ proc check_effective_target_vect_floatuint_cvt { } {
return $et_vect_floatuint_cvt_saved($et_index)
}
+# Return 1 if peeling for alignment might be profitable on the target
+#
+
+proc check_effective_target_vect_can_peel { } {
+global et_vect_can_peel_saved
+global et_index
+
+if [info exists et_vect_can_peel_saved($et_index)] {
+ verbose "check_effective_target_vect_can_peel: using cached result" 2
+} else {
+ set et_vect_can_peel_saved($et_index) 1
+if { ([istarget s390*-*-*]
+ && [check_effective_target_s390_vx]) } {
+ set et_vect_can_peel_saved($et_index) 0
+}
+}
+
+verbose "check_effective_target_vect_can_peel:\
+returning $et_vect_can_peel_saved($et_index)" 2
+return $et_vect_can_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