https://gcc.gnu.org/g:28a5efd15695250003534abf91af3210e7a88921

commit r15-8294-g28a5efd15695250003534abf91af3210e7a88921
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Wed Mar 19 12:58:14 2025 +0000

    middle-end: update early-break tests for non-load-lanes targets [PR119286]
    
    Broadly speaking, these tests were failing because the BB limitation for 
SLP'ing
    loads in an || in an early break makes the loads end up in different BBs 
and so
    today we can't SLP them.  This results in load_lanes being required to 
vectorize
    them because the alternative is loads with permutes which we don't allow.
    
    The original checks were only checking partial vectors, which ended up 
working
    because e.g. Adv. SIMD isn't a partial vector target, so it failed, and SVE 
was
    a partial vector target but also has load lanes so it passes.
    
    GCN however is a partial vector target without load lanes which makes the 
tests
    fail.  As we require load_lanes for now, also check for them.
    
    Bootstrapped Regtested on aarch64-none-linux-gnu,
    arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
    -m32, -m64 and no issues.
    
    Cross checked the failing cases on amdgcn-amdhsa
    and all pass now.
    
    gcc/testsuite/ChangeLog:
    
            PR target/119286
            * gcc.dg/vect/bb-slp-41.c: Add pragma novector.
            * gcc.dg/vect/vect-early-break_133_pfa11.c: Should never vectorize 
today
            as indexes can be out of range.
            * gcc.dg/vect/vect-early-break_128.c: Require load_lanes as well.
            * gcc.dg/vect/vect-early-break_133_pfa10.c: Likewise.
            * gcc.dg/vect/vect-early-break_133_pfa8.c: Likewise.
            * gcc.dg/vect/vect-early-break_133_pfa9.c: Likewise.
            * gcc.dg/vect/vect-early-break_22.c: Likewise.
            * gcc.dg/vect/vect-early-break_26.c: Likewise.
            * gcc.dg/vect/vect-early-break_43.c: Likewise.
            * gcc.dg/vect/vect-early-break_44.c: Likewise.
            * gcc.dg/vect/vect-early-break_6.c: Likewise.
            * gcc.dg/vect/vect-early-break_56.c: Expect failures on group 
misalign.

Diff:
---
 gcc/testsuite/gcc.dg/vect/bb-slp-41.c                  | 1 +
 gcc/testsuite/gcc.dg/vect/vect-early-break_128.c       | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa10.c | 6 +++---
 gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa11.c | 5 ++---
 gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c  | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c  | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_22.c        | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_26.c        | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_43.c        | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_44.c        | 4 ++--
 gcc/testsuite/gcc.dg/vect/vect-early-break_56.c        | 2 +-
 gcc/testsuite/gcc.dg/vect/vect-early-break_6.c         | 4 ++--
 12 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-41.c 
b/gcc/testsuite/gcc.dg/vect/bb-slp-41.c
index 72245115f305..5a2bd4d2a33e 100644
--- a/gcc/testsuite/gcc.dg/vect/bb-slp-41.c
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-41.c
@@ -51,6 +51,7 @@ int main ()
   foo (a1, b);
   bar (a2, b);
 
+#pragma GCC novector
   for (i = 0; i < ARR_SIZE; i++)
     if (a1[i] != a2[i])
       return 1;
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_128.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_128.c
index ed6baf2d451f..3d51d52358fc 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_128.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_128.c
@@ -3,8 +3,8 @@
 /* { dg-require-effective-target vect_early_break } */
 /* { dg-require-effective-target vect_int } */
 
-/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" { target 
vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "vectorizing stmts using SLP" "vect" { 
target { ! vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" { target { 
vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "vectorizing stmts using SLP" "vect" { 
target { { ! vect_partial_vectors } || { ! vect_load_lanes } } } } } */
 /* { dg-final { scan-tree-dump "Loop contains only SLP stmts" "vect" } } */
 
 #ifndef N
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa10.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa10.c
index dd0504698252..2a58fb014012 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa10.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa10.c
@@ -6,9 +6,9 @@
 /* { dg-additional-options "-Ofast" } */
 
 /* Alignment requirement too big, load lanes targets can't safely vectorize 
this.  */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { 
vect_partial_vectors || vect_load_lanes } } } } */
-/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! { 
vect_partial_vectors || vect_load_lanes } } } } } */
-/* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" 
"vect" { target { ! { vect_partial_vectors || vect_load_lanes } } } } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { 
vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! 
vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" 
"vect" { target { ! vect_load_lanes } } } } */
 
 unsigned test4(char x, char *restrict vect_a, char *restrict vect_b, int n)
 {  
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa11.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa11.c
index 085dd9b81bb6..514bd3719174 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa11.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa11.c
@@ -3,9 +3,8 @@
 /* { dg-require-effective-target vect_early_break } */
 /* { dg-require-effective-target vect_int } */
 
-/* Gathers and scatters are not save to speculate across early breaks.  */
-/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! 
vect_partial_vectors } } } } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target 
vect_partial_vectors } } } */
+/* Gathers and scatters are not safe to speculate across early breaks.  */
+/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */
 
 #define N 1024
 int vect_a[N];
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c
index 25d3a62356ba..90e59986dea8 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c
@@ -5,8 +5,8 @@
 
 /* { dg-additional-options "-Ofast" } */
 
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target 
vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! 
vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { 
vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { { ! 
vect_partial_vectors } || { ! vect_load_lanes } } } } } */
 
 char vect_a[1025];
 char vect_b[1025];
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c
index 10eb98b726ac..fa2b32e9b859 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c
@@ -6,8 +6,8 @@
 /* { dg-additional-options "-Ofast" } */
 
 /* Group size is uneven and second group is misaligned.  Needs partial 
vectors.  */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target 
vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! 
vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { 
vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { { ! 
vect_partial_vectors } || { ! vect_load_lanes } } } } } */
 /* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" 
"vect" } } */
 
 
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c
index f8f84fab97ab..8e91ac6b843b 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c
@@ -43,5 +43,5 @@ main ()
 }
 
 /* This will fail because we cannot SLP the load groups yet.  */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" 
{ target vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" 
{ target { ! vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" 
{ target { vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" 
{ target { { ! vect_partial_vectors } || { ! vect_load_lanes } } } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c
index 643016b2ccfe..f6688fc8ead1 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c
@@ -42,5 +42,5 @@ main ()
 }
 
 /* This will fail because we cannot SLP the load groups yet.  */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" 
{ target vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" 
{ target { ! vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" 
{ target { vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" 
{ target { { ! vect_partial_vectors } || { ! vect_load_lanes } } } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c
index 0cfa2428cc61..e6866deaa08f 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c
@@ -28,5 +28,5 @@ unsigned test4(unsigned x)
 }
 
 /* This will fail because we cannot SLP the load groups yet.  */
-/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { 
target vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "vectorized 1 loops in function" "vect" { 
target { ! vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { 
target { vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "vectorized 1 loops in function" "vect" { 
target { { ! vect_partial_vectors } || { ! vect_load_lanes } } } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c
index 0cfa2428cc61..e6866deaa08f 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c
@@ -28,5 +28,5 @@ unsigned test4(unsigned x)
 }
 
 /* This will fail because we cannot SLP the load groups yet.  */
-/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { 
target vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "vectorized 1 loops in function" "vect" { 
target { ! vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { 
target { vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "vectorized 1 loops in function" "vect" { 
target { { ! vect_partial_vectors } || { ! vect_load_lanes } } } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c
index b35e737fa3b9..76a1f9b3f55c 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c
@@ -99,5 +99,5 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { xfail { 
vect_early_break && { ! vect_hw_misalign } } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { 
vect_early_break && { ! vect_hw_misalign } } } } } */
 
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c
index c7cce81f52c8..485cee63c63e 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c
@@ -6,8 +6,8 @@
 /* { dg-additional-options "-Ofast" } */
 
 /* This will fail because we cannot SLP the load groups yet.  */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target 
vect_partial_vectors } } } */
-/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { ! 
vect_partial_vectors } } } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { 
vect_partial_vectors && vect_load_lanes } } } } */
+/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" { target { { ! 
vect_partial_vectors } || { ! vect_load_lanes } } } } } */
 
 #define N 1024
 unsigned vect_a[N];

Reply via email to