https://gcc.gnu.org/g:273bbf231812f1c31fd8249015a643d30338ed6f
commit r17-4668-g273bbf231812f1c31fd8249015a643d30338ed6f Author: Dominic P <[email protected]> Date: Thu Sep 17 04:47:13 2026 +0100 testsuite: move the vector minmax tests to gcc.dg/vect Four of these tests ask for vect_int from gcc.dg/tree-ssa, and the fifth, minmax-swar-5.c, needs the same guard. The flags those selectors are answered under come from vect.exp, which is also what adds -msse2, -maltivec or the NEON options and what skips a target that cannot vectorize at all. Move all five there, keep the requirement, and drop the ia32 option line vect.exp supplies itself. The rules ask target_supports_op_p for the vector MIN_EXPR, so the vector spelling folds only where the target has one: on cortex-m0 all six functions of minmax-swar-5.c stop at VEC_COND_EXPR. The two tests that assume a 16-byte vector gate their scans on vect128, and the widths come from sizeof. Tested on x86_64-pc-linux-gnu and aarch64-linux-gnu, and with an arm-none-eabi cross on cortex-a15 NEON and cortex-m0 soft. Assisted-by: Claude Opus 5 (Anthropic) gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/minmax-swar-5.c: Move to... * gcc.dg/vect/minmax-swar-5.c: ...here. Require vect_int, take the flags from vect.exp, size the vector with sizeof and gate the scans. * gcc.dg/tree-ssa/minmax-swar-6.c: Move to... * gcc.dg/vect/minmax-swar-6.c: ...here. Take the flags from vect.exp. * gcc.dg/tree-ssa/minmax-swar-7.c: Move to... * gcc.dg/vect/minmax-swar-7.c: ...here. Likewise. * gcc.dg/tree-ssa/minmax-negate-3.c: Move to... * gcc.dg/vect/minmax-negate-3.c: ...here. Likewise. * gcc.dg/tree-ssa/vector-alignup-1.c: Move to... * gcc.dg/vect/vector-alignup-1.c: ...here. Likewise, size the vectors with sizeof and gate the scans. Signed-off-by: Dominic P <[email protected]> Diff: --- gcc/testsuite/gcc.dg/tree-ssa/vector-alignup-1.c | 16 -------------- .../gcc.dg/{tree-ssa => vect}/minmax-negate-3.c | 3 +-- .../gcc.dg/{tree-ssa => vect}/minmax-swar-5.c | 25 ++++++++++++---------- .../gcc.dg/{tree-ssa => vect}/minmax-swar-6.c | 3 +-- .../gcc.dg/{tree-ssa => vect}/minmax-swar-7.c | 3 +-- gcc/testsuite/gcc.dg/vect/vector-alignup-1.c | 15 +++++++++++++ 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vector-alignup-1.c b/gcc/testsuite/gcc.dg/tree-ssa/vector-alignup-1.c deleted file mode 100644 index 5b32c668710a..000000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/vector-alignup-1.c +++ /dev/null @@ -1,16 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target vect_int } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ -/* { dg-additional-options "-msse2" { target ia32 } } */ - -/* Rounding up by adding the padding, spelled with vectors. */ - -typedef unsigned int v4ui __attribute__((vector_size (16))); -typedef int v4si __attribute__((vector_size (16))); - -v4ui f1 (v4ui x) { return x + ((-x) & 15); } -v4si f2 (v4si x) { return x + ((-x) & 63); } - -/* { dg-final { scan-tree-dump-not "= -" "optimized" } } */ -/* { dg-final { scan-tree-dump-times " \\+ " 2 "optimized" } } */ -/* { dg-final { scan-tree-dump-times " & " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-negate-3.c b/gcc/testsuite/gcc.dg/vect/minmax-negate-3.c similarity index 92% rename from gcc/testsuite/gcc.dg/tree-ssa/minmax-negate-3.c rename to gcc/testsuite/gcc.dg/vect/minmax-negate-3.c index 562e76bfde9f..cea581a5daf5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-negate-3.c +++ b/gcc/testsuite/gcc.dg/vect/minmax-negate-3.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target vect_int } */ -/* { dg-options "-O3 -fdump-tree-optimized" } */ -/* { dg-additional-options "-msse2" { target ia32 } } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ /* The rule reaching vector code. It matches the scalar loop body, so what is left to vectorize is a vector MAX or MIN of the unnegated loads and a vector diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-5.c b/gcc/testsuite/gcc.dg/vect/minmax-swar-5.c similarity index 55% rename from gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-5.c rename to gcc/testsuite/gcc.dg/vect/minmax-swar-5.c index 931d5a0d7419..9ab595e36d8a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-5.c +++ b/gcc/testsuite/gcc.dg/vect/minmax-swar-5.c @@ -1,14 +1,17 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -Wno-psabi -fdump-tree-forwprop1-raw" } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-additional-options "-Wno-psabi -fdump-tree-forwprop1-raw" } */ /* All six rules on a vector type. The selects against zero are spelled with - >, not <: a vector x < 0 is canonicalised to the sign mask x >> 31, and the - rule that turns x & (x >> 31) into MIN <x, 0> is scalar, so that spelling - forms no vector MIN_EXPR at all. The scan is on forwprop1, which runs - before the vector lowering that would split a MAX_EXPR the target cannot - do. */ + >, not <: a vector x < 0 is canonicalised to the sign mask + x >> (precision - 1), and the rule that turns x & (x >> (precision - 1)) + into MIN <x, 0> is scalar, so that spelling forms no vector MIN_EXPR at + all. The scan is on forwprop1, which runs before the vector lowering that + would split a MAX_EXPR the target cannot do. The rules ask + target_supports_op_p for the vector MIN_EXPR, hence the selector on the + scans. */ -typedef int v4si __attribute__ ((vector_size (16))); +typedef int v4si __attribute__ ((vector_size (4 * sizeof (int)))); /* Y + MIN (X - Y, 0) -> MIN (X, Y). */ v4si @@ -64,7 +67,7 @@ clamp_hi_vec (v4si x, v4si y) return ((s & m) | (y & ~m)) - y; } -/* { dg-final { scan-tree-dump-not "<plus_expr," "forwprop1" } } */ -/* { dg-final { scan-tree-dump-not "<minus_expr," "forwprop1" } } */ -/* { dg-final { scan-tree-dump-times "<min_expr," 3 "forwprop1" } } */ -/* { dg-final { scan-tree-dump-times "<max_expr," 3 "forwprop1" } } */ +/* { dg-final { scan-tree-dump-not "<plus_expr," "forwprop1" { target { vect128 && { ! vect_no_int_min_max } } } } } */ +/* { dg-final { scan-tree-dump-not "<minus_expr," "forwprop1" { target { vect128 && { ! vect_no_int_min_max } } } } } */ +/* { dg-final { scan-tree-dump-times "<min_expr," 3 "forwprop1" { target { vect128 && { ! vect_no_int_min_max } } } } } */ +/* { dg-final { scan-tree-dump-times "<max_expr," 3 "forwprop1" { target { vect128 && { ! vect_no_int_min_max } } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-6.c b/gcc/testsuite/gcc.dg/vect/minmax-swar-6.c similarity index 92% rename from gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-6.c rename to gcc/testsuite/gcc.dg/vect/minmax-swar-6.c index 4f096a002296..fc17027ff70b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-6.c +++ b/gcc/testsuite/gcc.dg/vect/minmax-swar-6.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target vect_int } */ -/* { dg-options "-O3 -fdump-tree-optimized" } */ -/* { dg-additional-options "-msse2" { target ia32 } } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ /* The two difference pairs reaching vector code through the loop vectorizer: the fold is on the scalar loop body, so what is left to vectorize is a diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-7.c b/gcc/testsuite/gcc.dg/vect/minmax-swar-7.c similarity index 89% rename from gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-7.c rename to gcc/testsuite/gcc.dg/vect/minmax-swar-7.c index 125fcb3016cc..e70fc3091769 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-7.c +++ b/gcc/testsuite/gcc.dg/vect/minmax-swar-7.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target vect_int } */ -/* { dg-options "-O3 -fdump-tree-optimized" } */ -/* { dg-additional-options "-msse2" { target ia32 } } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ /* MINMAX (X + Y, Y) - Y through the loop vectorizer: the vector add and the vector subtract both go, leaving the clamp against zero. */ diff --git a/gcc/testsuite/gcc.dg/vect/vector-alignup-1.c b/gcc/testsuite/gcc.dg/vect/vector-alignup-1.c new file mode 100644 index 000000000000..dd69d1f1eed8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vector-alignup-1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +/* Rounding up by adding the padding, spelled with vectors. */ + +typedef unsigned int v4ui __attribute__((vector_size (4 * sizeof (int)))); +typedef int v4si __attribute__((vector_size (4 * sizeof (int)))); + +v4ui f1 (v4ui x) { return x + ((-x) & 15); } +v4si f2 (v4si x) { return x + ((-x) & 63); } + +/* { dg-final { scan-tree-dump-not "= -" "optimized" { target vect128 } } } */ +/* { dg-final { scan-tree-dump-times " \\+ " 2 "optimized" { target vect128 } } } */ +/* { dg-final { scan-tree-dump-times " & " 2 "optimized" { target vect128 } } } */
