https://gcc.gnu.org/g:f5ed4bb4a23e5d8e532881c3cfb2bd21bfc71cf6
commit f5ed4bb4a23e5d8e532881c3cfb2bd21bfc71cf6 Author: Alexandre Oliva <[email protected]> Date: Tue Mar 10 04:20:06 2026 -0300 testsuite: vect: ppc: introduce vect_no_store_align for altivec When testing powerpc-elf with an emulator configuration that doesn't support any vector instructions whatsoever, we fall back to compiling for altivec. With that configuration, a number of tests fail to achieve the expected vectorization because altivec doesn't support misaligned vector stores, and it has no realignment support for stores either, despite having realign support for loads. We don't seem to have any means to distinguish these two features from testcases, so I'm proposing vect_no_store_align as a partial overrider of vect_no_align, and adjusting affected tests to expect a failure to vectorize when neither alignment adjustment is possible. In most of the adjustments, I've gone for xfail instead of a target constraint, not because I expect the tests could possibly be made to pass under these conditions, but because of preexisting practice with vect_no_align. In some cases I suppose alignment could be attained by prologue/epilogue or versioning, and I guess that might have been the reason for xfails. Without being sure about the rationale or the reasoning behind it, I can't assert that I've followed them. But in some cases in which vect_no_align wasn't present at all but vect_no_store_align was found necessary, and another target constraint was already there, I've tended to compound the target condition instead of adding an xfail. for gcc/ChangeLog * doc/sourcebuild.texi (vect_no_align): Clarify. (vect_no_store_align): Document. for gcc/testsuite/ChangeLog * lib/target-supports.exp (check_effective_target_vect_no_store_align): New. * gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c: Tolerate failure without means to deal with unaligned stores. * gcc.dg/vect/tsvc/vect-tsvc-s2244.c: Likewise. * gcc.dg/vect/tsvc/vect-tsvc-s3251.c: Likewise. * gcc.dg/vect/vect-31.c: Likewise. * gcc.dg/vect/vect-44.c: Likewise. * gcc.dg/vect/vect-50.c: Likewise. * gcc.dg/vect/no-vfa-vect-depend-2.c: Use vect_no_store_align instead of vect_no_align. * gcc.dg/vect/no-vfa-vect-depend-3.c: Likewise. * gcc.dg/vect/vect-109.c: Likewise. * gcc.dg/vect/section-anchors-vect-69.c: Require some means to deal with unaligned stores. * gcc.dg/vect/vect-alias-check-18.c: Likewise. * gcc.dg/vect/vect-93.c: Adjust expectations according to vect_no_store_align. Diff: --- gcc/doc/sourcebuild.texi | 5 ++++- gcc/testsuite/gcc.dg/vect/bb-slp-pr50730.c | 2 +- gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c | 2 +- gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c | 2 +- gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c | 2 +- gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s2244.c | 2 +- gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s3251.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-109.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-31.c | 3 ++- gcc/testsuite/gcc.dg/vect/vect-44.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-50.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-93.c | 7 +++---- gcc/testsuite/gcc.dg/vect/vect-alias-check-18.c | 2 +- gcc/testsuite/lib/target-supports.exp | 18 ++++++++++++++++++ 14 files changed, 37 insertions(+), 16 deletions(-) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 3bccb1384d9f..518c41dc7c50 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1724,7 +1724,10 @@ Target aligns arrays to vector alignment boundary. Target supports a vector misalign access. @item vect_no_align -Target does not support a vector alignment mechanism. +Target does not support any vector alignment mechanism. + +@item vect_no_store_align +Target does not support any vector alignment mechanism for stores. @item vect_peeling_profitable Target might require to peel loops for alignment purposes. diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr50730.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr50730.c index 9bbf573ba2a2..5dfab6299c34 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-pr50730.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr50730.c @@ -14,4 +14,4 @@ A sum(A a,A b) return a; } -/* { dg-final { scan-tree-dump-times "optimized: basic block" 1 "slp2" } } */ +/* { dg-final { scan-tree-dump-times "optimized: basic block" 1 "slp2" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c index 2cabb77f5d9a..be74a09817c1 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-2.c @@ -53,6 +53,6 @@ int main (void) return main1 (); } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-times "dependence distance negative" 1 "vect" { target { ! vect_multiple_sizes } } } } */ /* { dg-final { scan-tree-dump "dependence distance negative" "vect" { target vect_multiple_sizes } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c index 7a80d89da8d3..68f737ac680e 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-3.c @@ -184,5 +184,5 @@ int main () return main1 (); } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c b/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c index 5aa5888743a2..22dc3ead4314 100644 --- a/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c +++ b/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c @@ -122,7 +122,7 @@ int main (void) return main1 (); } -/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target vect_int } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target { vect_int && { ! { vect_no_store_align && { ! vect_hw_misalign } } } } } } } */ /* Alignment forced using versioning until the pass that increases alignment is extended to handle structs. */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 4 "vect" { target {vect_int && {! vector_alignment_reachable} } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s2244.c b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s2244.c index 277ebb83c60b..9d9226bf8d88 100644 --- a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s2244.c +++ b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s2244.c @@ -37,4 +37,4 @@ int main (int argc, char **argv) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ \ No newline at end of file +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s3251.c b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s3251.c index 51ca17396bec..e05b0b84b1cb 100644 --- a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s3251.c +++ b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s3251.c @@ -38,4 +38,4 @@ int main (int argc, char **argv) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ \ No newline at end of file +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-109.c b/gcc/testsuite/gcc.dg/vect/vect-109.c index 63813dbdb390..8d72081112aa 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-109.c +++ b/gcc/testsuite/gcc.dg/vect/vect-109.c @@ -1,6 +1,6 @@ /* Disabling epilogues until we find a better way to deal with scans. */ /* { dg-additional-options "--param vect-epilogues-nomask=0 -fdump-tree-optimized-details-blocks" } */ -/* { dg-skip-if "" { vect_no_align } } */ +/* { dg-skip-if "" { vect_no_store_align } } */ /* { dg-require-effective-target vect_int } */ /* { dg-add-options bind_pic_locally } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-31.c b/gcc/testsuite/gcc.dg/vect/vect-31.c index 6c4e0f12cff4..5815dabf908a 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-31.c +++ b/gcc/testsuite/gcc.dg/vect/vect-31.c @@ -91,5 +91,6 @@ int main (void) return main1 (); } -/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */ +/* The first loop is not vectorized on powerpc-elf altivec. */ +/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { xfail { vect_no_store_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-44.c b/gcc/testsuite/gcc.dg/vect/vect-44.c index 0396aefb8f83..9452176d5a24 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-44.c +++ b/gcc/testsuite/gcc.dg/vect/vect-44.c @@ -68,7 +68,7 @@ int main (void) two loads to be aligned). */ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { xfail { ! vect_unaligned_possible } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { xfail { { vect_no_store_align && { ! vect_hw_misalign} } || { ! vect_unaligned_possible } } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { xfail { { vect_no_align && { ! vect_hw_misalign } } || {! vector_alignment_reachable} } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 3 "vect" { target { vect_no_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" { target { {! vector_alignment_reachable} && {{! vect_no_align} && {! vect_hw_misalign} } } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-50.c b/gcc/testsuite/gcc.dg/vect/vect-50.c index 88739b61dcb1..ef17923c8cd6 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-50.c +++ b/gcc/testsuite/gcc.dg/vect/vect-50.c @@ -64,7 +64,7 @@ int main (void) align the store will not force the two loads to be aligned). */ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { xfail { ! vect_unaligned_possible } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { xfail { { vect_no_store_align && { ! vect_hw_misalign} } || { ! vect_unaligned_possible } } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { xfail { { vect_no_align && { ! vect_hw_misalign } } || {! vector_alignment_reachable} } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 3 "vect" { target { vect_no_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" { target { {! vector_alignment_reachable} && { {! vect_no_align } && {! vect_hw_misalign } } } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-93.c b/gcc/testsuite/gcc.dg/vect/vect-93.c index 75af52d64349..c1de030cc234 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-93.c +++ b/gcc/testsuite/gcc.dg/vect/vect-93.c @@ -81,13 +81,12 @@ int main (void) the second loop in main requires vectorization of misaligned load. */ /* main && main1 together: */ -/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target { { powerpc*-*-* i?86-*-* x86_64-*-* } && { ! { vect_no_store_align && { ! vect_hw_misalign } } } } } } } */ /* in main1: */ -/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target !powerpc*-*-* !i?86-*-* !x86_64-*-* } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { vect_no_align && { ! vect_hw_misalign } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { ! { { powerpc*-*-* i?86-*-* x86_64-*-* } && { ! { vect_no_store_align && { ! vect_hw_misalign } } } } } } } } */ /* in main: */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_no_align && { ! vect_hw_misalign } } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_no_store_align && { ! vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-alias-check-18.c b/gcc/testsuite/gcc.dg/vect/vect-alias-check-18.c index 3b576a4dc432..29c3a42a4ecd 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-alias-check-18.c +++ b/gcc/testsuite/gcc.dg/vect/vect-alias-check-18.c @@ -61,5 +61,5 @@ main (void) } /* { dg-final { scan-tree-dump {flags: *WAR\n} "vect" { target vect_int } } } */ -/* { dg-final { scan-tree-dump "using an index-based WAR/WAW test" "vect" { target { vect_int && vect_perm } } } } */ +/* { dg-final { scan-tree-dump "using an index-based WAR/WAW test" "vect" { target { vect_int && { vect_perm && { ! { vect_no_store_align && { ! vect_hw_misalign } } } } } } } } */ /* { dg-final { scan-tree-dump-not "using an address-based" "vect" } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index e7cdaa1b2fbc..6fbaaf5b8435 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -9109,6 +9109,24 @@ proc check_effective_target_vect_no_align { } { && [et-is-effective-target mips_loongson_mmi]) }}] } +# Return 1 if the target plus current options does not support a vector +# alignment mechanism for stores, 0 otherwise. +# +# This won't change for different subtargets so cache the result. + +proc check_effective_target_vect_no_store_align { } { + return [check_cached_effective_target_indexed vect_no_store_align { + # power8 vectors support misalignment, which makes for some + # vectorization opportunities covered by vect_hw_misalign, but + # neither vsx (without misalign) nor vmx support any mechanism + # for realigning vector stores. + if { [istarget powerpc*-*-*] } { + return 1 + } + return [check_effective_target_vect_no_align] + }] +} + # Return 1 if the target supports a vector misalign access, 0 otherwise. # # This won't change for different subtargets so cache the result.
