diff mbox series

[5/5] New target check: vect_can_peel

Message ID 20170928115044.21422-6-krebbel@linux.vnet.ibm.com
State New
Headers show
Series vect testsuite adjustments for S/390 - v2 | expand

Commit Message

Andreas Krebbel Sept. 28, 2017, 11:50 a.m. UTC
gcc/ChangeLog:

2017-09-28  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	* doc/sourcebuild.texi: Document vect_can_peel.

gcc/testsuite/ChangeLog:

2017-09-28  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	* 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(-)

Comments

Jeff Law Oct. 2, 2017, 10:36 p.m. UTC | #1
On 09/28/2017 05:50 AM, Andreas Krebbel wrote:
> gcc/ChangeLog:
> 
> 2017-09-28  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
> 
> 	* doc/sourcebuild.texi: Document vect_can_peel.
> 
> gcc/testsuite/ChangeLog:
> 
> 2017-09-28  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
> 
> 	* 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.
Can you come up with a better name than vect_can_peel?  The comments
indicate it's more about peeling to improve alignment is profitable on
the target rather than the target's ability to peel.

OK with a better name.

jeff
diff mbox series

Patch

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.