diff options
Diffstat (limited to 'gcc/testsuite')
112 files changed, 2943 insertions, 111 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 58055c5..d0c104e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,185 @@ +2025-10-21 Martin Uecker <uecker@tugraz.at> + + * gcc.dg/c2y-generic-6.c: New test. + * gcc.dg/c2y-generic-7.c: New test. + +2025-10-21 Jakub Jelinek <jakub@redhat.com> + + * g++.dg/ext/is_implicit_lifetime.C: New test. + +2025-10-21 Christophe Lyon <christophe.lyon@linaro.org> + + PR target/122189 + * gcc.target/arm/mve/intrinsics/vadcq_m_s32.c + * gcc.target/arm/mve/intrinsics/vadcq_m_u32.c + * gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c + * gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c + +2025-10-21 Paul-Antoine Arras <parras@baylibre.com> + + PR c/120180 + PR fortran/122306 + * c-c++-common/gomp/imperfect1.c: Adjust dg-error. + * c-c++-common/gomp/imperfect4.c: Likewise. + * c-c++-common/gomp/pr120180.c: Move to... + * c-c++-common/gomp/pr120180-1.c: ...here. Remove dg-error. + * g++.dg/gomp/attrs-imperfect1.C: Adjust dg-error. + * g++.dg/gomp/attrs-imperfect4.C: Likewise. + * gfortran.dg/gomp/declare-variant-2.f90: Adjust dg-error. + * gfortran.dg/gomp/declare-variant-20.f90: Likewise. + * c-c++-common/gomp/pr120180-2.c: New test. + * g++.dg/gomp/pr120180-1.C: New test. + * gfortran.dg/gomp/pr120180-1.f90: New test. + * gfortran.dg/gomp/pr120180-2.f90: New test. + * gfortran.dg/gomp/pr122306-1.f90: New file. + * gfortran.dg/gomp/pr122306-2.f90: New file. + +2025-10-21 Roger Sayle <roger@nextmovesoftware.com> + + * gcc.target/i386/sse4_1-stv-10.c: New test case. + * gcc.target/i386/sse4_1-stv-11.c: Likewise. + * gcc.target/i386/sse4_1-stv-12.c: Likewise. + +2025-10-21 Tobias Burnus <tburnus@baylibre.com> + + * c-c++-common/gomp/assumes-2.c: Change for 'invalid' + to 'unknown' change for end directives. + * c-c++-common/gomp/begin-assumes-2.c: Likewise. + * c-c++-common/gomp/assume-2.c: Likewise. Check 'declare + mapper'. + +2025-10-21 Richard Biener <rguenther@suse.de> + + PR tree-optimization/120687 + * gcc.dg/vect/vect-reduc-chain-4.c: New testcase. + +2025-10-21 Avinash Jayakar <avinashd@linux.ibm.com> + + PR target/104116 + * gcc.dg/vect/pr104116-ceil-div-2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-div-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-div.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-mod-2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-mod-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-mod.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-udiv-2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-udiv-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-udiv.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-umod-2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-umod-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-ceil-umod.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-div-2.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-div-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-div.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-mod-2.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-mod-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-floor-mod.c: disable vectorization. + * gcc.dg/vect/pr104116-round-div-2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-div-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-div.c: disable vectorization. + * gcc.dg/vect/pr104116-round-mod-2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-mod-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-mod.c: disable vectorization. + * gcc.dg/vect/pr104116-round-udiv-2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-udiv-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-udiv.c: disable vectorization. + * gcc.dg/vect/pr104116-round-umod-2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-umod-pow2.c: disable vectorization. + * gcc.dg/vect/pr104116-round-umod.c: disable vectorization. + * gcc.dg/vect/pr104116.h (init_arr): use std idiom, correct + indentation. + (init_uarr): use std idiom. + +2025-10-21 Andrew Pinski <andrew.pinski@oss.qualcomm.com> + + PR tree-optimization/95699 + PR tree-optimization/101024 + PR tree-optimization/110068 + * gcc.dg/tree-ssa/pr101024-1.c: New test. + * gcc.dg/tree-ssa/pr110068-1.c: New test. + +2025-10-20 Jeff Law <jlaw@ventanamicro.com> + + * gcc.target/riscv/rvv/autovec/reduc/reduc-8.c: Adjust expected output. + +2025-10-20 Antoni Boucher <bouanto@zoho.com> + + * jit.dg/all-non-failing-tests.h: Add test-arrays-u64.c. + * jit.dg/test-arrays-u64.c: New test. + +2025-10-20 Josef Melcr <jmelcr02@gmail.com> + + * gcc.dg/ipa/ipcp-cb-spec1.c: Moved to libgomp/testsuite/libgomp.c/. + * gcc.dg/ipa/ipcp-cb-spec2.c: Likewise. + * gcc.dg/ipa/ipcp-cb1.c: Likewise. + +2025-10-20 Antoni Boucher <bouanto@zoho.com> + + * jit.dg/test-error-array-bounds.c: Fix test. + +2025-10-20 Thomas Schwinge <tschwinge@baylibre.com> + + PR c++/114457 + * c-c++-common/goacc/kernels-decompose-pr100280-1.c: Skip for + c++26 until PR121975 is fixed. + +2025-10-20 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/component_value1.adb: New test. + +2025-10-20 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/use_type3.adb: New test. + +2025-10-20 Srinath Parvathaneni <srinath.parvathaneni@arm.com> + + * gcc.target/aarch64/acle/asm-inlined-sysreg-1.c: New test. + * gcc.target/aarch64/acle/asm-inlined-sysreg-2.c: Likewise. + * gcc.target/aarch64/acle/rwsr-gated-1.c: Likewise. + * gcc.target/aarch64/acle/rwsr-gated-2.c: Likewise. + * lib/target-supports.exp + (check_effective_target_aarch64_sysreg_guarding_ok): Check + assembler support of -menable-sysreg-checking flag. + +2025-10-20 Jeff Law <jlaw@ventanamicro.com> + + * gcc.target/riscv/rvv/vsetvl/imm_switch-6.c: Skip scan-asm test for -O1 too. + * gcc.target/riscv/rvv/vsetvl/imm_switch-7.c: Likewise. + * gcc.target/riscv/shrink-wrap-1.c: Likewise. Skip for -Og as well. + * gcc.target/riscv/xandes/xandesperf-1.c: Adjust expected output. + +2025-10-20 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/renaming18.adb: New test. + +2025-10-20 Richard Biener <rguenther@suse.de> + + PR tree-optimization/101639 + PR tree-optimization/103495 + * gcc.dg/vect/vect-reduc-bool-1.c: New testcase. + * gcc.dg/vect/vect-reduc-bool-2.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-3.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-4.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-5.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-6.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-7.c: Likewise. + * gcc.dg/vect/vect-reduc-bool-8.c: Likewise. + +2025-10-20 H.J. Lu <hjl.tools@gmail.com> + + PR target/99930 + PR target/122323 + * gcc.target/i386/builtin-copysign-2.c: New test. + * gcc.target/i386/builtin-copysign-3.c: Likewise. + * gcc.target/i386/builtin-copysign-4.c: Likewise. + * gcc.target/i386/builtin-copysign-5.c: Likewise. + * gcc.target/i386/builtin-copysign-6.c: Likewise. + * gcc.target/i386/builtin-copysign-7.c: Likewise. + * gcc.target/i386/builtin-copysign-8a.c: Likewise. + * gcc.target/i386/builtin-copysign-8b.c: Likewise. + * gcc.target/i386/builtin-fabs-1.c: Likewise. + * gcc.target/i386/builtin-fabs-2.c: Likewise. + 2025-10-19 Georg-Johann Lay <avr@gjlay.de> PR testsuite/122212 diff --git a/gcc/testsuite/c-c++-common/gomp/assume-2.c b/gcc/testsuite/c-c++-common/gomp/assume-2.c index 95a65fd..2cc066f 100644 --- a/gcc/testsuite/c-c++-common/gomp/assume-2.c +++ b/gcc/testsuite/c-c++-common/gomp/assume-2.c @@ -31,12 +31,14 @@ foo (int i, int *a) ; #pragma omp assume contains (begin assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ ; - #pragma omp assume contains (end assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ + #pragma omp assume contains (end assumes) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ ; #pragma omp assume contains (foo) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ ; #pragma omp assume absent (target enter something) /* { dg-error "unknown OpenMP directive name in 'absent' clause argument" } */ ; + #pragma omp assume contains (declare mapper) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument: declarative, informational, and meta directives not permitted" } */ + ; #pragma omp assume foobar /* { dg-error "expected assumption clause" } */ ; #pragma omp assume ext_GCC_foobarbaz, ext_GCC_baz (1, 12, 1 < 17), no_parallelism /* { dg-warning "unknown assumption clause 'ext_GCC_foobarbaz'" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/assumes-2.c b/gcc/testsuite/c-c++-common/gomp/assumes-2.c index 68b88be..ee03b09 100644 --- a/gcc/testsuite/c-c++-common/gomp/assumes-2.c +++ b/gcc/testsuite/c-c++-common/gomp/assumes-2.c @@ -13,7 +13,7 @@ #pragma omp assumes absent (assume) /* { dg-error "invalid OpenMP directive name in 'absent' clause argument" } */ #pragma omp assumes absent (assumes) /* { dg-error "invalid OpenMP directive name in 'absent' clause argument" } */ #pragma omp assumes contains (begin assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ -#pragma omp assumes contains (end assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ +#pragma omp assumes contains (end assumes) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ #pragma omp assumes contains (foo) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ #pragma omp assumes absent (target enter something) /* { dg-error "unknown OpenMP directive name in 'absent' clause argument" } */ #pragma omp assumes foobar /* { dg-error "expected assumption clause" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c b/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c index ff401c8..bdb41e1 100644 --- a/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c +++ b/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c @@ -62,7 +62,7 @@ main (void) when (device={arch("gcn")}: teams num_teams(256)), default (teams num_teams(4)))]] { - //__label__ l1, l2; + __label__ l1, l2; if (x) goto l1; diff --git a/gcc/testsuite/c-c++-common/gomp/begin-assumes-2.c b/gcc/testsuite/c-c++-common/gomp/begin-assumes-2.c index 66b9180..189026d 100644 --- a/gcc/testsuite/c-c++-common/gomp/begin-assumes-2.c +++ b/gcc/testsuite/c-c++-common/gomp/begin-assumes-2.c @@ -43,7 +43,7 @@ void f14 (void) {} #pragma omp begin assumes contains (begin assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ void f15 (void) {} #pragma omp end assumes -#pragma omp begin assumes contains (end assumes) /* { dg-error "invalid OpenMP directive name in 'contains' clause argument" } */ +#pragma omp begin assumes contains (end assumes) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ void f16 (void) {} #pragma omp end assumes #pragma omp begin assumes contains (foo) /* { dg-error "unknown OpenMP directive name in 'contains' clause argument" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/imperfect1.c b/gcc/testsuite/c-c++-common/gomp/imperfect1.c index 705626a..bef783b 100644 --- a/gcc/testsuite/c-c++-common/gomp/imperfect1.c +++ b/gcc/testsuite/c-c++-common/gomp/imperfect1.c @@ -15,7 +15,7 @@ void s1 (int a1, int a2, int a3) f1 (0, i); for (j = 0; j < a2; j++) { -#pragma omp barrier /* { dg-error "intervening code must not contain OpenMP directives" } */ +#pragma omp barrier /* { dg-error "intervening code must not contain executable OpenMP directives" } */ f1 (1, j); if (i == 2) continue; /* { dg-error "invalid exit" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/imperfect4.c b/gcc/testsuite/c-c++-common/gomp/imperfect4.c index 1a0c07c..30d1cc6 100644 --- a/gcc/testsuite/c-c++-common/gomp/imperfect4.c +++ b/gcc/testsuite/c-c++-common/gomp/imperfect4.c @@ -21,7 +21,7 @@ void s1 (int a1, int a2, int a3) /* According to the grammar, this is intervening code; we don't know that we are also missing a nested for loop until we have parsed this whole compound expression. */ -#pragma omp barrier /* { dg-error "intervening code must not contain OpenMP directives" } */ +#pragma omp barrier /* { dg-error "intervening code must not contain executable OpenMP directives" } */ f1 (2, k); f2 (2, k); } diff --git a/gcc/testsuite/c-c++-common/gomp/metadirective-2.c b/gcc/testsuite/c-c++-common/gomp/metadirective-2.c index 4b05cb9..9f8169a 100644 --- a/gcc/testsuite/c-c++-common/gomp/metadirective-2.c +++ b/gcc/testsuite/c-c++-common/gomp/metadirective-2.c @@ -61,7 +61,7 @@ main (void) when (device={arch("gcn")}: teams num_teams(256)) \ default (teams num_teams(4)) { - //__label__ l1, l2; + __label__ l1, l2; if (x) goto l1; diff --git a/gcc/testsuite/c-c++-common/gomp/pr120180.c b/gcc/testsuite/c-c++-common/gomp/pr120180-1.c index cb5a0d5..52b5082 100644 --- a/gcc/testsuite/c-c++-common/gomp/pr120180.c +++ b/gcc/testsuite/c-c++-common/gomp/pr120180-1.c @@ -1,7 +1,7 @@ /* { dg-do compile } */ -/* This test used to ICE after erroring on the metadirective in the - loop nest. */ +/* This test case checks that the inner metadirective is accepted as intervening + code since it resolves to 'omp nothing'. */ int main() { @@ -14,7 +14,7 @@ int main() when(user={condition(1)}: target teams loop collapse(2) map(qq[:0]) private(i)) for(k=0; k<blksize; k++) { -#pragma omp metadirective when(user={condition(0)}: simd) default() // { dg-error "intervening code must not contain OpenMP directives" } +#pragma omp metadirective when(user={condition(0)}: simd) default() for (i=0; i<nq; i++) qq[k*nq + i] = 0.0; } diff --git a/gcc/testsuite/c-c++-common/gomp/pr120180-2.c b/gcc/testsuite/c-c++-common/gomp/pr120180-2.c new file mode 100644 index 0000000..9d9ef30 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr120180-2.c @@ -0,0 +1,66 @@ +/* { dg-do compile } */ + +/* This test case checks that a non-executable OpenMP directive is accepted + as intervening code. */ + +int +test1 () +{ + int blksize = 15000; + double *qq; + int i, k, nq; +#pragma omp target parallel for collapse(2) map(qq[ : 0]) private(i) + for (k = 0; k < blksize; k++) + { +#pragma omp nothing + for (i = 0; i < nq; i++) + qq[k * nq + i] = 0.0; + } + return 0; +} + +int +test2 () +{ + int i, k, m, n; + double *qq, x, z; +#pragma omp for collapse(2) + for (i = 1; i < n; i++) + { +#pragma omp assume holds(x > 1) + z = __builtin_fabs (x - i); + for (k = 0; k < m; k++) + qq[k * m + i] = z; + } + return 0; +} + +int +test3 () +{ + int i, k, m, n; + double *qq, z; +#pragma omp for collapse(2) + for (i = 1; i < n; i++) + { +#pragma omp error at(compilation) /* { dg-error "'pragma omp error' encountered" } */ + for (k = 0; k < m; k++) + qq[k * m + i] = z; + } + return 0; +} + +int +test4 () +{ + int i, k, m, n; + double *qq, z; +#pragma omp for collapse(2) + for (i = 1; i < n; i++) + { +#pragma omp error at(execution) /* { dg-error "pragma omp error' with 'at\\(execution\\)' clause may not be used in intervening code" } */ + for (k = 0; k < m; k++) + qq[k * m + i] = z; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp/embed-27.C b/gcc/testsuite/g++.dg/cpp/embed-27.C new file mode 100644 index 0000000..dffb8b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/embed-27.C @@ -0,0 +1,38 @@ +// PR c++/122302 +// { dg-do run { target c++11 } } +// { dg-options "-O2" } + +unsigned char b[] = { +#embed "embed-27.C" +}; + +struct A { + unsigned char a[sizeof (b)] = { +#embed "embed-27.C" + }; +}; + +void +foo () +{ + A a; + for (int i = 0; i < sizeof (b); ++i) + if (a.a[i] != b[i]) + __builtin_abort (); +} + +void +bar () +{ + A a; + for (int i = 0; i < sizeof (b); ++i) + if (a.a[i] != b[i]) + __builtin_abort (); +} + +int +main () +{ + foo (); + bar (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr122302.C b/gcc/testsuite/g++.dg/cpp0x/pr122302.C new file mode 100644 index 0000000..248b6a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr122302.C @@ -0,0 +1,40 @@ +// PR c++/122302 +// { dg-do run { target c++11 } } +// { dg-options "-O2" } + +struct A { + unsigned char a[130] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2 }; +}; + +void +foo () +{ + A a; + for (int i = 0; i < 130; ++i) + if (a.a[i] != (i & 15) + 1) + __builtin_abort (); +} + +void +bar () +{ + A a; + for (int i = 0; i < 130; ++i) + if (a.a[i] != (i & 15) + 1) + __builtin_abort (); +} + +int +main () +{ + foo (); + bar (); +} diff --git a/gcc/testsuite/g++.dg/ext/is_implicit_lifetime.C b/gcc/testsuite/g++.dg/ext/is_implicit_lifetime.C new file mode 100644 index 0000000..22c600d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_implicit_lifetime.C @@ -0,0 +1,139 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } +// { dg-add-options float16 } +// { dg-add-options float32 } +// { dg-add-options float64 } +// { dg-add-options float128 } + +struct A { int a, b, c; }; +class B { static int a; private: static int b; public: int c; }; +struct C { C () {} int a, b, c; }; +struct D { explicit D (int) {} int a, b, c; }; +struct E : public A { int d, e, f; }; +struct F : public C { using C::C; int d, e, f; }; +class G { int a, b; }; +struct H { private: int a, b; }; +struct I { protected: int a, b; }; +struct J { int a, b; void foo (); }; +struct K { int a, b; virtual void foo (); }; +struct L : virtual public A { int d, e; }; +struct M : protected A { int d, e; }; +struct N : private A { int d, e; }; +struct O { O () = delete; int a, b, c; }; +struct P { P () = default; int a, b, c; }; +struct Q { Q (); Q (const Q &); int a, b, c; }; +struct R { R (); R (const R &); R (R &&) = default; int a, b, c; }; +struct S { S (); ~S (); int a, b, c; }; +struct T { T (); ~T () = default; int a, b, c; }; +struct U { U (); U (const U &) = default; int a, b, c; }; +struct V { V () = default; V (const V &); int a, b, c; }; +enum W { W1 }; +enum class X : int { X1 }; +struct Y { int g; int foo (int); }; +struct Z; +struct AA { Q a; Q b; }; +struct AB { Q a; Q b; ~AB () = default; }; +struct AC { Q a; Q b; ~AC () {} }; +struct AD : public Q {}; +struct AE : public Q { ~AE () = default; }; +struct AF : public Q { ~AF () {} }; + +#define SA(X) static_assert ((X), #X) + +SA (!__builtin_is_implicit_lifetime (void)); +SA (!__builtin_is_implicit_lifetime (const void)); +SA (!__builtin_is_implicit_lifetime (volatile void)); +SA (__builtin_is_implicit_lifetime (char)); +SA (__builtin_is_implicit_lifetime (signed char)); +SA (__builtin_is_implicit_lifetime (const unsigned char)); +SA (__builtin_is_implicit_lifetime (short)); +SA (__builtin_is_implicit_lifetime (volatile unsigned short)); +SA (__builtin_is_implicit_lifetime (int)); +SA (__builtin_is_implicit_lifetime (unsigned int)); +SA (__builtin_is_implicit_lifetime (const volatile long)); +SA (__builtin_is_implicit_lifetime (unsigned long)); +SA (__builtin_is_implicit_lifetime (long long)); +SA (__builtin_is_implicit_lifetime (unsigned long long)); +#ifdef __SIZEOF_INT128__ +SA (__builtin_is_implicit_lifetime (__int128)); +SA (__builtin_is_implicit_lifetime (unsigned __int128)); +#endif +SA (__builtin_is_implicit_lifetime (float)); +SA (__builtin_is_implicit_lifetime (double)); +SA (__builtin_is_implicit_lifetime (long double volatile)); +#ifdef __STDCPP_FLOAT16_T__ +SA (__builtin_is_implicit_lifetime (_Float16)); +#endif +#ifdef __STDCPP_FLOAT32_T__ +SA (__builtin_is_implicit_lifetime (_Float32)); +#endif +#ifdef __STDCPP_FLOAT64_T__ +SA (__builtin_is_implicit_lifetime (const _Float64)); +#endif +#ifdef __STDCPP_FLOAT128_T__ +SA (__builtin_is_implicit_lifetime (_Float128)); +#endif +#ifdef __STDCPP_BFLOAT16_T__ +SA (__builtin_is_implicit_lifetime (decltype(0.bf16))); +#endif +SA (__builtin_is_implicit_lifetime (W)); +SA (__builtin_is_implicit_lifetime (const volatile X)); +SA (__builtin_is_implicit_lifetime (int *)); +SA (__builtin_is_implicit_lifetime (int (*) (int))); +SA (__builtin_is_implicit_lifetime (int (Y::*))); +SA (__builtin_is_implicit_lifetime (int (Y::*) (int))); +SA (!__builtin_is_implicit_lifetime (int &)); +SA (!__builtin_is_implicit_lifetime (char &&)); +SA (__builtin_is_implicit_lifetime (int [])); +SA (!__builtin_is_implicit_lifetime (int [0])); +SA (__builtin_is_implicit_lifetime (int [1])); +SA (__builtin_is_implicit_lifetime (const Y [42])); +SA (!__builtin_is_implicit_lifetime (int ())); +SA (!__builtin_is_implicit_lifetime (int () &)); +SA (!__builtin_is_implicit_lifetime (int () const)); +SA (!__builtin_is_implicit_lifetime (int (&) ())); +SA (!__builtin_is_implicit_lifetime (Z)); // { dg-error "invalid use of incomplete type 'struct Z'" } +SA (__builtin_is_implicit_lifetime (Z [])); +SA (__builtin_is_implicit_lifetime (Z [5])); +SA (__builtin_is_implicit_lifetime (A)); +SA (__builtin_is_implicit_lifetime (B)); +SA (__builtin_is_implicit_lifetime (C)); +SA (__builtin_is_implicit_lifetime (D)); +SA (__builtin_is_implicit_lifetime (E)); +SA (__builtin_is_implicit_lifetime (F)); +SA (__builtin_is_implicit_lifetime (G)); +SA (__builtin_is_implicit_lifetime (H)); +SA (__builtin_is_implicit_lifetime (I)); +SA (__builtin_is_implicit_lifetime (J)); +SA (!__builtin_is_implicit_lifetime (K)); +SA (!__builtin_is_implicit_lifetime (L)); +SA (__builtin_is_implicit_lifetime (M)); +SA (__builtin_is_implicit_lifetime (N)); +SA (__builtin_is_implicit_lifetime (O)); +SA (__builtin_is_implicit_lifetime (P)); +SA (!__builtin_is_implicit_lifetime (Q)); +SA (__builtin_is_implicit_lifetime (R)); +SA (!__builtin_is_implicit_lifetime (S)); +SA (__builtin_is_implicit_lifetime (S [3])); +SA (__builtin_is_implicit_lifetime (T)); +SA (__builtin_is_implicit_lifetime (U)); +SA (__builtin_is_implicit_lifetime (V)); +SA (__builtin_is_implicit_lifetime (_Complex double)); +SA (__builtin_is_implicit_lifetime (int [[gnu::vector_size (4 * sizeof (int))]])); +SA (__builtin_is_implicit_lifetime (AA)); +SA (__builtin_is_implicit_lifetime (AB)); +SA (!__builtin_is_implicit_lifetime (AC)); +#if __cplusplus >= 201703L +SA (__builtin_is_implicit_lifetime (AD)); +SA (__builtin_is_implicit_lifetime (AE)); +#else +SA (!__builtin_is_implicit_lifetime (AD)); +SA (!__builtin_is_implicit_lifetime (AE)); +#endif +SA (!__builtin_is_implicit_lifetime (AF)); + +void +foo (int n) +{ + SA (__builtin_is_implicit_lifetime (char [n])); +} diff --git a/gcc/testsuite/g++.dg/gomp/attrs-imperfect1.C b/gcc/testsuite/g++.dg/gomp/attrs-imperfect1.C index cf293b5..b43139c 100644 --- a/gcc/testsuite/g++.dg/gomp/attrs-imperfect1.C +++ b/gcc/testsuite/g++.dg/gomp/attrs-imperfect1.C @@ -15,7 +15,7 @@ void s1 (int a1, int a2, int a3) f1 (0, i); for (j = 0; j < a2; j++) { - [[ omp :: directive (barrier) ]] ; /* { dg-error "intervening code must not contain OpenMP directives" } */ + [[ omp :: directive (barrier) ]] ; /* { dg-error "intervening code must not contain executable OpenMP directives" } */ f1 (1, j); if (i == 2) continue; /* { dg-error "invalid exit" } */ diff --git a/gcc/testsuite/g++.dg/gomp/attrs-imperfect4.C b/gcc/testsuite/g++.dg/gomp/attrs-imperfect4.C index 16636ab..94b4db8 100644 --- a/gcc/testsuite/g++.dg/gomp/attrs-imperfect4.C +++ b/gcc/testsuite/g++.dg/gomp/attrs-imperfect4.C @@ -21,7 +21,7 @@ void s1 (int a1, int a2, int a3) /* According to the grammar, this is intervening code; we don't know that we are also missing a nested for loop until we have parsed this whole compound expression. */ - [[ omp :: directive (barrier) ]] ; /* { dg-error "intervening code must not contain OpenMP directives" } */ + [[ omp :: directive (barrier) ]] ; /* { dg-error "intervening code must not contain executable OpenMP directives" } */ f1 (2, k); f2 (2, k); } diff --git a/gcc/testsuite/g++.dg/gomp/pr120180-1.C b/gcc/testsuite/g++.dg/gomp/pr120180-1.C new file mode 100644 index 0000000..819b3ee --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr120180-1.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-additional-options "-std=c++11" } + +// This test case checks that the inner metadirective is accepted as intervening +// code since it resolves to 'omp nothing'. + +int main() +{ + constexpr int use_teams = 1; + constexpr int use_simd = 0; + + int blksize = 15000; + double *qq; + int i, k, nq; + + #pragma omp metadirective when(user={condition(use_teams)}: teams distribute parallel for collapse(2)) \ + otherwise(parallel for collapse(1)) + for(k=0; k<blksize; k++) + { + #pragma omp metadirective when(user={condition(use_simd)}: simd) \ + otherwise(nothing) + for (i=0; i<nq; i++) + qq[k*nq + i] = 0.0; + } + return 0; +} diff --git a/gcc/testsuite/g++.target/i386/mv16.C b/gcc/testsuite/g++.target/i386/mv16.C index 75198f5..87126a0 100644 --- a/gcc/testsuite/g++.target/i386/mv16.C +++ b/gcc/testsuite/g++.target/i386/mv16.C @@ -128,6 +128,10 @@ int __attribute__ ((target("arch=diamondrapids"))) foo () { return 33; } +int __attribute__ ((target("arch=novalake"))) foo () { + return 34; +} + int main () { int val = foo (); @@ -184,6 +188,8 @@ int main () assert (val == 32); else if (__builtin_cpu_is ("diamondrapids")) assert (val == 33); + else if (__builtin_cpu_is ("novalake")) + assert (val == 34); else assert (val == 0); diff --git a/gcc/testsuite/gcc.dg/c2y-generic-6.c b/gcc/testsuite/gcc.dg/c2y-generic-6.c new file mode 100644 index 0000000..7220d94 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2y-generic-6.c @@ -0,0 +1,11 @@ +/* { dg-do "compile" } */ +/* { dg-options "-std=c2y -Wpedantic" } */ + +void f() +{ + _Generic(1, int[*]: 1, default: 0); + _Generic(1, int(*)[*]: 1, default: 0); + _Generic(1, int[sizeof(int[*])]: 1, default: 0); /* { dg-warning "not in a declaration" } */ + _Generic(1, struct { int a[*]; }: 1, default: 0); /* { dg-warning "variably modified" } */ +} + diff --git a/gcc/testsuite/gcc.dg/c2y-generic-7.c b/gcc/testsuite/gcc.dg/c2y-generic-7.c new file mode 100644 index 0000000..6ca046c --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2y-generic-7.c @@ -0,0 +1,15 @@ +/* { dg-do "run" } */ +/* { dg-options "-std=c2y" } */ + +int main() +{ + int n = 1; + int a[1]; + _Generic(typeof(a), int[n++]: 0); + float b[1]; + _Generic(typeof(b), int[n++]: 0, default: 1); + if (n != 1) + __builtin_abort(); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec1.c b/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec1.c deleted file mode 100644 index a85e623..0000000 --- a/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec1.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test that GOMP_task is special cased when cpyfn is NULL. */ - -/* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ -/* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ - -void test(int c) { - for (int i = 0; i < c; i++) - if (!__builtin_constant_p(c)) - __builtin_abort(); -} -int main() { -#pragma omp task - test(7); - return 0; -} - -/* { dg-final { scan-wpa-ipa-dump "Creating a specialized node of main._omp_fn" "cp" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec2.c b/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec2.c deleted file mode 100644 index 01d7425..0000000 --- a/gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec2.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Check that GOMP_task doesn't produce callback edges when cpyfn is not - NULL. */ - -/* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ -/* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ - -void test(int *a) { - for (int i = 0; i < 100; i++) { - a[i] = i; - } -} -int main() { - int a[100]; - __builtin_memset (a, 0, sizeof (a)); - #pragma omp task - test (a); -} - -/* { dg-final { scan-ipa-dump-not "Created callback edge" "cp" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-cb1.c b/gcc/testsuite/gcc.dg/ipa/ipcp-cb1.c deleted file mode 100644 index 3418b5d..0000000 --- a/gcc/testsuite/gcc.dg/ipa/ipcp-cb1.c +++ /dev/null @@ -1,25 +0,0 @@ -/* Test that we can propagate constants into outlined OpenMP kernels. - This tests the underlying callback attribute and its related edges. */ - -/* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ -/* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ - -int a[100]; -void test(int c) { -#pragma omp parallel for - for (int i = 0; i < c; i++) { - if (!__builtin_constant_p(c)) { - __builtin_abort(); - } - a[i] = i; - } -} -int main() { - test(100); - return a[5] - 5; -} - -/* { dg-final { scan-wpa-ipa-dump "Creating a specialized node of test._omp_fn" "cp" } } */ -/* { dg-final { scan-wpa-ipa-dump "Aggregate replacements: 0\\\[0]=100\\(by_ref\\)" "cp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101024-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101024-1.c new file mode 100644 index 0000000..14379bf --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr101024-1.c @@ -0,0 +1,39 @@ +/* PR tree-optimization/95699 */ +/* PR tree-optimization/101024 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-phiopt1" } */ +unsigned long long +f2 (unsigned long long x) +{ + if (x < 0x8000000000000000ULL) + x = 0x8000000000000000ULL; + else + { + if (x >= 0x8000000000000023ULL) + x = 0x8000000000000023ULL; + } + return x; +} +unsigned long long +f1 (unsigned long long x) +{ + if (x >= 100) + { + if (x >= 0x8000000000000000ULL) + x = 0x8000000000000000ULL; + } + else + x = 100; + return x; +} +/* f2: */ +/* { dg-final { scan-tree-dump "MIN_EXPR <\[^>\n\r]*9223372036854775843>" "optimized" } } */ +/* { dg-final { scan-tree-dump "MAX_EXPR <\[^>\n\r]*9223372036854775808>" "optimized" } } */ +/* { dg-final { scan-tree-dump "MIN_EXPR <\[^>\n\r]*9223372036854775843>" "phiopt1" } } */ +/* { dg-final { scan-tree-dump "MAX_EXPR <\[^>\n\r]*9223372036854775808>" "phiopt1" } } */ + +/* f1: */ +/* { dg-final { scan-tree-dump "MIN_EXPR <\[^>\n\r]*9223372036854775808>" "optimized" } } */ +/* { dg-final { scan-tree-dump "MAX_EXPR <\[^>\n\r]*100>" "optimized" } } */ +/* { dg-final { scan-tree-dump "MIN_EXPR <\[^>\n\r]*9223372036854775808>" "phiopt1" } } */ +/* { dg-final { scan-tree-dump "MAX_EXPR <\[^>\n\r]*100>" "phiopt1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110068-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr110068-1.c new file mode 100644 index 0000000..df88553 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110068-1.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/95699 */ +/* PR tree-optimization/110068 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-phiopt1" } */ +/* { dg-final { scan-tree-dump-times "MIN_EXPR " 2 "phiopt1" } } */ + +#define min1(x,y) ((x) < (y) ? (x) : (y)) +unsigned +f1 (unsigned x) +{ + return min1(x, 1U<<(sizeof(x)*8-1)); +} +unsigned +f5 (unsigned x) +{ + bool t = x >= 1U<<(sizeof(x)*8-1); + if (!t) + ; + else + x = 1U<<(sizeof(x)*8-1); + return x; +} diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-2.c index 7078776..cc0cb45 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-2.c @@ -16,6 +16,7 @@ int main (void) int *a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = cl_div (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-pow2.c index 7aa9ae8..8abd353 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-pow2.c @@ -17,6 +17,7 @@ int main (void) int *a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = cl_div (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div.c index 6f903ff..e4a8d30 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-div.c @@ -17,6 +17,7 @@ int main (void) int *a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = cl_div (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-2.c index ee6dfb9..6e559ab 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-2.c @@ -17,6 +17,7 @@ int main (void) int *a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = cl_mod (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-pow2.c index de409ea..9fdbf27 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-pow2.c @@ -17,6 +17,7 @@ int main (void) unsigned int *a = (unsigned int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_mod (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod.c index f2ba936..3f85218 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod.c @@ -17,6 +17,7 @@ int main (void) int *a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = cl_mod (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-2.c index db1f797..d8365c0 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-2.c @@ -16,6 +16,7 @@ int main (void) unsigned int *ua = (unsigned int*)↑ init_uarr(ua, N); udiv(ua); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_udiv (0xf0000000 + i, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-pow2.c index 06b4257..389b6c3 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-pow2.c @@ -16,6 +16,7 @@ int main (void) unsigned int *ua = (unsigned int*)↑ init_uarr(ua, N); udiv(ua); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_udiv (0xf0000000 + i, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv.c index ef6e856..54aa4fb 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv.c @@ -16,6 +16,7 @@ int main (void) unsigned int *ua = (unsigned int*)↑ init_uarr(ua, N); udiv(ua); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_udiv (0xf0000000 + i, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-2.c index 2d0a5db..190b805 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-2.c @@ -17,6 +17,7 @@ int main (void) unsigned int *a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_umod (0xf0000000 + i, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-pow2.c index 2d0a5db..190b805 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-pow2.c @@ -17,6 +17,7 @@ int main (void) unsigned int *a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_umod (0xf0000000 + i, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod.c b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod.c index 949a509..632fd46 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod.c @@ -17,6 +17,7 @@ int main (void) unsigned int *a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { unsigned int expected = cl_umod (0xf0000000 + i, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-2.c index d93e051..b9db0d2 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div_2(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_div (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-pow2.c index 9e986a7..5000c29 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div-pow2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div_2(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_div (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div.c index 89dd270..ed34249 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-div.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-div.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div_2(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_div (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-2.c index 0c5c162..62995bb 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_mod (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-pow2.c index f3de145..b92243d 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-pow2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_mod (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod.c b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod.c index 3e6bbe9..63843b9 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-floor-mod.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = fl_mod (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-div-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-div-2.c index c242ccb..c72866a 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-div-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-div-2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_div (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-div-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-div-pow2.c index 365c2c59..9e3e1ed 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-div-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-div-pow2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_div (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-div.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-div.c index 5c377d1..5dd0f37 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-div.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-div.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); div(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_div (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-2.c index 6430b3e..fe8f8bb 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_mod (i - N/2, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-pow2.c index 46c1789..cd3bbda 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod-pow2.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_mod (i - N/2, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod.c index e7ca44e..e617623 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-mod.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-mod.c @@ -16,6 +16,7 @@ int main (void) int * a = (int*)&arr; init_arr(a, N); mod(a); + #pragma GCC novector for (int i=0; i<N; i++) { int expected = rd_mod (i - N/2, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-2.c index 4d42f4e..de5e0a4 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-2.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); div(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_udiv (0xf0000000 + i, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-pow2.c index 137b249..a802b97 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-pow2.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); div(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_udiv (0xf0000000 + i, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv.c index 183a930..7d5db92 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-udiv.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); div(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_udiv (0xf0000000 + i, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-2.c index f321e0e..155b26a 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-2.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_umod (0xf0000000 + i, 2); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-pow2.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-pow2.c index 041ecd1..1b4911a 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-pow2.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod-pow2.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_umod (0xf0000000 + i, 8); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod.c b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod.c index b5ddad1..3db289e 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116-round-umod.c +++ b/gcc/testsuite/gcc.dg/vect/pr104116-round-umod.c @@ -16,6 +16,7 @@ int main (void) unsigned int * a = (unsigned int*)↑ init_uarr(a, N); mod(a); + #pragma GCC novector for (unsigned int i=0; i<N; i++) { unsigned int expected = rd_umod (0xf0000000 + i, 19); diff --git a/gcc/testsuite/gcc.dg/vect/pr104116.h b/gcc/testsuite/gcc.dg/vect/pr104116.h index 6f14e4b..c097353 100644 --- a/gcc/testsuite/gcc.dg/vect/pr104116.h +++ b/gcc/testsuite/gcc.dg/vect/pr104116.h @@ -82,17 +82,17 @@ NAME (unsigned int * a) \ #define N 1024 int arr[N]; -__attribute__((optimize("O0"))) void init_arr (int *a, int n) { - for (int i=0; i<n; i++) - a[i] = i - n/2; + #pragma GCC novector + for (int i=0; i<n; i++) + a[i] = i - n/2; } unsigned int uarr[N]; -__attribute__((optimize("O0"))) void init_uarr (unsigned int *a, int n) { + #pragma GCC novector for (unsigned int i=0; i<n; i++) a[i] = 0xf0000000 + i; } @@ -141,7 +141,6 @@ int fl_div (int x, int y) return q; } - int fl_mod (int x, int y) { int r = x % y; diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr122370.c b/gcc/testsuite/gcc.dg/vect/vect-pr122370.c new file mode 100644 index 0000000..8e536bf --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr122370.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-mavx512vl -mavx512bw" { target { avx512vl && avx512bw } } } */ + +bool f(bool splat, bool swizzle_splat, + int *elems, int length) +{ + int input = elems[0]; + for (int i = 0; i < length; i++) + { + if (input != elems[i]) + { + splat = false; + swizzle_splat = false; + } + } + return (splat && swizzle_splat); +} diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr122371.c b/gcc/testsuite/gcc.dg/vect/vect-pr122371.c new file mode 100644 index 0000000..fd03b84 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr122371.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +struct { + double lsum; +} AnalyzeSamples_rgData; + +float *AnalyzeSamples_curleft; +float AnalyzeSamples_sum_l; +int AnalyzeSamples_i; + +void AnalyzeSamples() { + while (AnalyzeSamples_i--) { + float l1 = AnalyzeSamples_curleft[1] * AnalyzeSamples_curleft[1], + l3 = AnalyzeSamples_curleft[3] * AnalyzeSamples_curleft[3], + sl = l1 + l3; + AnalyzeSamples_sum_l += sl; + AnalyzeSamples_curleft += 4; + } + AnalyzeSamples_rgData.lsum += AnalyzeSamples_sum_l; +} diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-bool-9.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-bool-9.c new file mode 100644 index 0000000..4ec141c --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-bool-9.c @@ -0,0 +1,27 @@ +/* PR122365 */ +/* { dg-do compile } */ + +struct TDTI { + float V[4]; +}; +struct TDTI4D { + struct TDTI S[]; +}; +void bar(); +struct TDTI4D nii_readParRec_dti4D; +int nii_readParRec_d_0_0; +void nii_readParRec() { + for (int i;;) { + bool v1varies = false, v2varies = false, v3varies = false; + for (; i < nii_readParRec_d_0_0; i++) { + if (nii_readParRec_dti4D.S[i].V[1]) + v1varies = true; + if (nii_readParRec_dti4D.S[i].V[2]) + v2varies = true; + if (nii_readParRec_dti4D.S[i].V[3]) + v3varies = true; + } + if (v1varies || v2varies || v3varies) + bar(); + } +} diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-4.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-4.c new file mode 100644 index 0000000..d79676d --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-4.c @@ -0,0 +1,31 @@ +#include "tree-vect.h" + +int q[32]; + +int __attribute__((noipa)) +foo () +{ + int res = 0; + for (int i = 0; i < 8; ++i) + res += q[4*i] + q[4*i+1] + q[4*i+2] + q[4*i+3]; + return res; +} + +int main() +{ + check_vect (); + + int sum = 0; +#pragma GCC novector + for (int i = 0; i < 32; ++i) + { + q[i] = i; + sum += i; + } + + if (foo () != sum) + abort (); +} + +/* { dg-final { scan-tree-dump "vectorizing a reduction chain" "vect" } } */ +/* { dg-final { scan-tree-dump "optimized: loop vectorized" "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-5.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-5.c new file mode 100644 index 0000000..1566e5f --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-5.c @@ -0,0 +1,31 @@ +#include "tree-vect.h" + +int q[32]; + +unsigned __attribute__((noipa)) +foo () +{ + unsigned res = 0; + for (int i = 0; i < 8; ++i) + res += q[4*i] + q[4*i+1] + q[4*i+2] + q[4*i+3]; + return res; +} + +int main() +{ + check_vect (); + + unsigned sum = 0; +#pragma GCC novector + for (int i = 0; i < 32; ++i) + { + q[i] = i; + sum += i; + } + + if (foo () != sum) + abort (); +} + +/* { dg-final { scan-tree-dump "vectorizing a reduction chain" "vect" } } */ +/* { dg-final { scan-tree-dump "optimized: loop vectorized" "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-1.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-1.c new file mode 100644 index 0000000..177a7dd --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-1.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-10.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-10.c new file mode 100644 index 0000000..c0ff50e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-10.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-11.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-11.c new file mode 100644 index 0000000..3597fc4 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-11.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-12.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-12.c new file mode 100644 index 0000000..b117362 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-12.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-13.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-13.c new file mode 100644 index 0000000..a2b8a71 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-13.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-14.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-14.c new file mode 100644 index 0000000..c24e132 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-14.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-15.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-15.c new file mode 100644 index 0000000..0233b8a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-15.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-16.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-16.c new file mode 100644 index 0000000..e731b55 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-16.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-17.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-17.c new file mode 100644 index 0000000..efbec01 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-17.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" { target { vect_int && vect_condition } } } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-18.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-18.c new file mode 100644 index 0000000..a47c306 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-18.c @@ -0,0 +1,60 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=asimd-only -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2 -fdump-tree-vect-details" }*/ +/* { dg-final { check-function-bodies "**" "" } } */ + +char p[128]; + +/* +** fand: +** ... +** ptrue p[0-9]+.b, vl16 +** cmpeq p[0-9]+.b, p[0-9]+/z, z[0-9]+.b, #0 +** cset w[0-9]+, none +** ... +*/ +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +/* +** fior: +** ... +** ptrue p[0-9]+.b, vl16 +** cmpne p[0-9]+.b, p[0-9]+/z, z[0-9]+.b, #0 +** cset w[0-9]+, any +** ... +*/ +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +/* +** fxor: +** ... +** ptrue p[0-9]+.b, vl16 +** cmpne p[0-9]+.b, p[0-9]+/z, z[0-9]+.b, #0 +** cntp x[0-9]+, p[0-9]+, p[0-9]+.b +** and w[0-9]+, w[0-9]+, 1 +** ... +*/ +bool __attribute__((noipa)) +fxor (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 3 "vect" } } */ + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-2.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-2.c new file mode 100644 index 0000000..dd6e393 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-2.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-3.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-3.c new file mode 100644 index 0000000..cae2ac8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-3.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-4.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-4.c new file mode 100644 index 0000000..3526d8c --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-4.c @@ -0,0 +1,52 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-5.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-5.c new file mode 100644 index 0000000..b6477af --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-5.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-6.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-6.c new file mode 100644 index 0000000..7333aa4 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-6.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-7.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-7.c new file mode 100644 index 0000000..a28ee16 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-7.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-8.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-8.c new file mode 100644 index 0000000..71695b5 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-8.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-require-effective-target aarch64_sve_hw } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" { target { vect_int && vect_condition } } } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-9.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-9.c new file mode 100644 index 0000000..ebccb8d --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-9.c @@ -0,0 +1,59 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=armv8-a+sve -mautovec-preference=sve-only -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2 -fdump-tree-vect-details" }*/ +/* { dg-final { check-function-bodies "**" "" } } */ + +char p[128]; + +/* +** fand: +** ... +** ptrue p[0-9]+.s, all +** nots p[0-9]+.b, p[0-9]+/z, p[0-9]+.b +** cset w[0-9]+, none +** and w[0-9]+, w[0-9]+, w[0-9]+ +** ... +*/ +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +/* +** fior: +** ... +** ptest p[0-9]+, p[0-9]+.b +** cset w[0-9]+, any +** orr w[0-9]+, w[0-9]+, w[0-9]+ +** ... +*/ +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +/* +** fxor: +** ... +** cntp x[0-9]+, p[0-9]+, p[0-9]+.h +** and w[0-9]+, w[0-9]+, 1 +** eor w[0-9]+, w[0-9]+, w[0-9]+ +** ... +*/ +bool __attribute__((noipa)) +fxor (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 3 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-1.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-1.c new file mode 100644 index 0000000..c9b1c85 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-1.c @@ -0,0 +1,51 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-2.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-2.c new file mode 100644 index 0000000..598d6c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-2.c @@ -0,0 +1,51 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-3.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-3.c new file mode 100644 index 0000000..9517965 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-3.c @@ -0,0 +1,51 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-4.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-4.c new file mode 100644 index 0000000..3cd577f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-4.c @@ -0,0 +1,51 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fand (n)) + __builtin_abort (); + + p[0] = 0; + for (int n = 1; n < 77; ++n) + if (fand (n)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fior (n)) + __builtin_abort (); + + p[0] = 1; + for (int n = 1; n < 77; ++n) + if (!fior (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-5.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-5.c new file mode 100644 index 0000000..c6fa63b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-5.c @@ -0,0 +1,49 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +char p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-6.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-6.c new file mode 100644 index 0000000..6d12e6a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-6.c @@ -0,0 +1,49 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +short p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-7.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-7.c new file mode 100644 index 0000000..58d6a78 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-7.c @@ -0,0 +1,49 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +int p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-8.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-8.c new file mode 100644 index 0000000..18ad94a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-8.c @@ -0,0 +1,49 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fdump-tree-vect-details" }*/ + +long long p[128]; + +bool __attribute__((noipa)) +fxort (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +bool __attribute__((noipa)) +fxorf (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +int main() +{ + __builtin_memset (p, 1, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (fxort (n) != !(n & 1)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n) != (n & 1)) + __builtin_abort (); + + __builtin_memset (p, 0, sizeof(p)); + + for (int n = 0; n < 77; ++n) + if (!fxort (n)) + __builtin_abort (); + + for (int n = 0; n < 77; ++n) + if (fxorf (n)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 2 "vect" { target { vect_int && vect_condition } } } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-9.c b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-9.c new file mode 100644 index 0000000..7d9a82f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-9.c @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=armv8-a -mautovec-preference=asimd-only -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2 -fdump-tree-vect-details" }*/ +/* { dg-final { check-function-bodies "**" "" } } */ + +char p[128]; + +/* +** fand: +** ... +** uminp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** fmov x[0-9]+, d[0-9]+ +** cmn x[0-9]+, #1 +** cset w[0-9]+, eq +** ... +*/ +bool __attribute__((noipa)) +fand (int n) +{ + bool r = true; + for (int i = 0; i < n; ++i) + r &= (p[i] != 0); + return r; +} + +/* +** fior: +** ... +** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** fmov x[0-9]+, d[0-9]+ +** cmp x[0-9]+, 0 +** cset w[0-9]+, ne +** ... +*/ +bool __attribute__((noipa)) +fior (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r |= (p[i] != 0); + return r; +} + +/* +** fxor: +** ... +** movi v[0-9]+.16b, 0x1 +** and v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +** addv b[0-9]+, v[0-9]+.16b +** fmov w[0-9]+, s[0-9]+ +** and w[0-9]+, w[0-9]+, 1 +** ... +*/ +bool __attribute__((noipa)) +fxor (int n) +{ + bool r = false; + for (int i = 0; i < n; ++i) + r ^= (p[i] != 0); + return r; +} + +/* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 3 "vect" } } */ + diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_s32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_s32.c index c5a5878..1802c20 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_s32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_s32.c @@ -1,6 +1,6 @@ /* { dg-require-effective-target arm_v8_1m_mve_ok } */ /* { dg-add-options arm_v8_1m_mve } */ -/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-O2 -fno-schedule-insns -fno-schedule-insns2" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include "arm_mve.h" @@ -14,12 +14,12 @@ extern "C" { ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vadct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) @@ -41,12 +41,12 @@ foo (int32x4_t inactive, int32x4_t a, int32x4_t b, unsigned *carry, mve_pred16_t ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vadct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_u32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_u32.c index 23908a4..64f221d 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_u32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_u32.c @@ -1,6 +1,6 @@ /* { dg-require-effective-target arm_v8_1m_mve_ok } */ /* { dg-add-options arm_v8_1m_mve } */ -/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-O2 -fno-schedule-insns -fno-schedule-insns2" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include "arm_mve.h" @@ -14,12 +14,12 @@ extern "C" { ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vadct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) @@ -41,12 +41,12 @@ foo (uint32x4_t inactive, uint32x4_t a, uint32x4_t b, unsigned *carry, mve_pred1 ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vadct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c index 940e2ed..da36d69 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c @@ -1,6 +1,6 @@ /* { dg-require-effective-target arm_v8_1m_mve_ok } */ /* { dg-add-options arm_v8_1m_mve } */ -/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-O2 -fno-schedule-insns -fno-schedule-insns2" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include "arm_mve.h" @@ -14,12 +14,12 @@ extern "C" { ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vsbct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) @@ -41,12 +41,12 @@ foo (int32x4_t inactive, int32x4_t a, int32x4_t b, unsigned *carry, mve_pred16_t ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vsbct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c index 478b938..555690f 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c @@ -1,6 +1,6 @@ /* { dg-require-effective-target arm_v8_1m_mve_ok } */ /* { dg-add-options arm_v8_1m_mve } */ -/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-O2 -fno-schedule-insns -fno-schedule-insns2" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include "arm_mve.h" @@ -14,12 +14,12 @@ extern "C" { ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vsbct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) @@ -41,12 +41,12 @@ foo (uint32x4_t inactive, uint32x4_t a, uint32x4_t b, unsigned *carry, mve_pred1 ** ... ** vmrs (?:ip|fp|r[0-9]+), FPSCR_nzcvqc(?: @.*|) ** ... -** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) -** ... ** bfi (?:ip|fp|r[0-9]+), (?:ip|fp|r[0-9]+), #29, #1(?: @.*|) ** ... ** vmsr FPSCR_nzcvqc, (?:ip|fp|r[0-9]+)(?: @.*|) ** ... +** vmsr p0, (?:ip|fp|r[0-9]+)(?: @.*|) +** ... ** vpst(?: @.*|) ** ... ** vsbct.i32 q[0-9]+, q[0-9]+, q[0-9]+(?: @.*|) diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc b/gcc/testsuite/gcc.target/i386/funcspec-56.inc index 3d9af7a..f56b344 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc +++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc @@ -217,6 +217,7 @@ extern void test_arch_arrowlake (void) __attribute__((__target__("arch=arrowlak extern void test_arch_arrowlake_s (void) __attribute__((__target__("arch=arrowlake-s"))); extern void test_arch_pantherlake (void) __attribute__((__target__("arch=pantherlake"))); extern void test_arch_diamondrapids (void) __attribute__((__target__("arch=diamondrapids"))); +extern void test_arch_novalake (void) __attribute__((__target__("arch=novalake"))); extern void test_arch_lujiazui (void) __attribute__((__target__("arch=lujiazui"))); extern void test_arch_yongfeng (void) __attribute__((__target__("arch=yongfeng"))); extern void test_arch_shijidadao (void) __attribute__((__target__("arch=shijidadao"))); diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask16.c b/gcc/testsuite/gcc.target/i386/pr122320-mask16.c new file mode 100644 index 0000000..2796d74 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask16.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask16 dumpy_eq (__m512i vx){ + return _mm512_cmp_epi32_mask (vx, vx, 0); +} + +__mmask16 dumpy_lt (__m512i vx) +{ + return _mm512_cmp_epi32_mask (vx, vx, 1); +} + +__mmask16 dumpy_le (__m512i vx){ + return _mm512_cmp_epi32_mask (vx, vx, 2); +} + +__mmask16 dumpy_ne (__m512i vx) +{ + return _mm512_cmp_epi32_mask (vx, vx, 4); +} + +__mmask16 dumpy_nlt (__m512i vx) +{ + return _mm512_cmp_epi32_mask (vx, vx, 5); +} + +__mmask16 dumpy_nle (__m512i vx){ + return _mm512_cmp_epi32_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask2.c b/gcc/testsuite/gcc.target/i386/pr122320-mask2.c new file mode 100644 index 0000000..bcbc47a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask2.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask8 dumpy_eq (__m128i vx){ + return _mm_cmp_epi64_mask (vx, vx, 0); +} + +__mmask8 dumpy_lt (__m128i vx) +{ + return _mm_cmp_epi64_mask (vx, vx, 1); +} + +__mmask8 dumpy_le (__m128i vx){ + return _mm_cmp_epi64_mask (vx, vx, 2); +} + +__mmask8 dumpy_ne (__m128i vx) +{ + return _mm_cmp_epi64_mask (vx, vx, 4); +} + +__mmask8 dumpy_nlt (__m128i vx) +{ + return _mm_cmp_epi64_mask (vx, vx, 5); +} + +__mmask8 dumpy_nle (__m128i vx){ + return _mm_cmp_epi64_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask32.c b/gcc/testsuite/gcc.target/i386/pr122320-mask32.c new file mode 100644 index 0000000..d75c8b0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask32.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask32 dumpy_eq (__m512i vx){ + return _mm512_cmp_epi16_mask (vx, vx, 0); +} + +__mmask32 dumpy_lt (__m512i vx) +{ + return _mm512_cmp_epi16_mask (vx, vx, 1); +} + +__mmask32 dumpy_le (__m512i vx){ + return _mm512_cmp_epi16_mask (vx, vx, 2); +} + +__mmask32 dumpy_ne (__m512i vx) +{ + return _mm512_cmp_epi16_mask (vx, vx, 4); +} + +__mmask32 dumpy_nlt (__m512i vx) +{ + return _mm512_cmp_epi16_mask (vx, vx, 5); +} + +__mmask32 dumpy_nle (__m512i vx){ + return _mm512_cmp_epi16_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask4.c b/gcc/testsuite/gcc.target/i386/pr122320-mask4.c new file mode 100644 index 0000000..7f2ec7d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask4.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask8 dumpy_eq (__m256i vx){ + return _mm256_cmp_epi64_mask (vx, vx, 0); +} + +__mmask8 dumpy_lt (__m256i vx) +{ + return _mm256_cmp_epi64_mask (vx, vx, 1); +} + +__mmask8 dumpy_le (__m256i vx){ + return _mm256_cmp_epi64_mask (vx, vx, 2); +} + +__mmask8 dumpy_ne (__m256i vx) +{ + return _mm256_cmp_epi64_mask (vx, vx, 4); +} + +__mmask8 dumpy_nlt (__m256i vx) +{ + return _mm256_cmp_epi64_mask (vx, vx, 5); +} + +__mmask8 dumpy_nle (__m256i vx){ + return _mm256_cmp_epi64_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask64.c b/gcc/testsuite/gcc.target/i386/pr122320-mask64.c new file mode 100644 index 0000000..6a7ce51 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask64.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask64 dumpy_eq (__m512i vx){ + return _mm512_cmp_epi8_mask (vx, vx, 0); +} + +__mmask64 dumpy_lt (__m512i vx) +{ + return _mm512_cmp_epi8_mask (vx, vx, 1); +} + +__mmask64 dumpy_le (__m512i vx){ + return _mm512_cmp_epi8_mask (vx, vx, 2); +} + +__mmask64 dumpy_ne (__m512i vx) +{ + return _mm512_cmp_epi8_mask (vx, vx, 4); +} + +__mmask64 dumpy_nlt (__m512i vx) +{ + return _mm512_cmp_epi8_mask (vx, vx, 5); +} + +__mmask64 dumpy_nle (__m512i vx){ + return _mm512_cmp_epi8_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/pr122320-mask8.c b/gcc/testsuite/gcc.target/i386/pr122320-mask8.c new file mode 100644 index 0000000..e724a68 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr122320-mask8.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-march=x86-64-v4 -O2" } */ +/* { dg-final { scan-assembler-not "vpcmp" } } */ + +#include <immintrin.h> + +__mmask8 dumpy_eq (__m512i vx){ + return _mm512_cmp_epi64_mask (vx, vx, 0); +} + +__mmask8 dumpy_lt (__m512i vx) +{ + return _mm512_cmp_epi64_mask (vx, vx, 1); +} + +__mmask8 dumpy_le (__m512i vx){ + return _mm512_cmp_epi64_mask (vx, vx, 2); +} + +__mmask8 dumpy_ne (__m512i vx) +{ + return _mm512_cmp_epi64_mask (vx, vx, 4); +} + +__mmask8 dumpy_nlt (__m512i vx) +{ + return _mm512_cmp_epi64_mask (vx, vx, 5); +} + +__mmask8 dumpy_nle (__m512i vx){ + return _mm512_cmp_epi64_mask (vx, vx, 6); +} diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-stv-10.c b/gcc/testsuite/gcc.target/i386/sse4_1-stv-10.c new file mode 100644 index 0000000..229bc45 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse4_1-stv-10.c @@ -0,0 +1,13 @@ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O2 -msse4.1 -mstv -mno-stackrealign" } */ + +__int128 m0,m1,m2,m3; +void foo(__int128 m) +{ + m0 = m; + m1 = m; + m2 = m; + m3 = m; +} + +/* { dg-final { scan-assembler-times "movaps" 4 } } */ diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-stv-11.c b/gcc/testsuite/gcc.target/i386/sse4_1-stv-11.c new file mode 100644 index 0000000..3508bfb --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse4_1-stv-11.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O2 -msse4.1 -mstv -mno-stackrealign" } */ + +__int128 m0,m1,m2,m3; +void foo(unsigned long x) +{ + __int128 m = x; + m0 = m; + m1 = m; + m2 = m; + m3 = m; +} + +/* { dg-final { scan-assembler-times "movaps" 4 } } */ diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-stv-12.c b/gcc/testsuite/gcc.target/i386/sse4_1-stv-12.c new file mode 100644 index 0000000..9587b64 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse4_1-stv-12.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O2 -msse4.1 -mstv -mno-stackrealign" } */ + +__int128 m0,m1,m2,m3; +void foo(unsigned int x) +{ + __int128 m = x; + m0 = m; + m1 = m; + m2 = m; + m3 = m; +} + +/* { dg-final { scan-assembler-times "movaps" 4 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-8.c index 1e5dc23..15a1d63 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-8.c @@ -12,4 +12,4 @@ add_loop (int *x, int n, int res) return res; } -/* { dg-final { scan-assembler-times {add\s+[a-x0-9]+,\s*[a-x0-9]+,a2} 1 } } */ +/* { dg-final { scan-assembler-times {add\s+[a-x0-9]+,\s*(?:a2,\s*[a-x0-9]+|[a-x0-9]+,\s*a2)} 1 } } */ diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90 index 11be76e..02bd8623 100644 --- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90 @@ -195,7 +195,7 @@ contains !$omp declare variant (f1) match(implementation={atomic_default_mem_order("relaxed")}) ! { dg-error "expected identifier at .1." } end subroutine subroutine f77 () - !$omp declare variant (f1) match(user={condition(score(f76):.true.)}) ! { dg-error ".score. argument must be constant integer expression at .1." } + !$omp declare variant (f1) match(user={condition(score(f76):.true.)}) ! { dg-error "Unexpected use of subroutine name 'f76'" } end subroutine subroutine f78 () !$omp declare variant (f1) match(user={condition(score(-130):.true.)}) ! { dg-error ".score. argument must be non-negative" } diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-20.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-20.f90 index 17fdcb7..82b8a52 100644 --- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-20.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-20.f90 @@ -44,6 +44,7 @@ contains !$omp declare variant(variant5) match(target_device={device_num(-4)}) ! OK - omp_invalid_device (will never match) ! OK - but not handled -> PR middle-end/113904 !$omp declare variant(variant5) match(target_device={device_num(my_device)}) ! { dg-error "property must be a constant integer expression" } + ! { dg-error "Symbol 'my_device' at .1. has no IMPLICIT type" "" { target *-*-* } .-1 } !$omp declare variant(variant5) match(target_device={device_num(-2)}) ! { dg-error "property must be a conforming device number" } res = 99 diff --git a/gcc/testsuite/gfortran.dg/gomp/pr120180-1.f90 b/gcc/testsuite/gfortran.dg/gomp/pr120180-1.f90 new file mode 100644 index 0000000..f16a256 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr120180-1.f90 @@ -0,0 +1,31 @@ +! { dg-do compile } + +! This test case checks that the inner metadirective is accepted as intervening +! code since it resolves to 'omp nothing'. + +SUBROUTINE test1(x_min, x_max, y_min, y_max, xarea, vol_flux_x) + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: x_min, x_max, y_min, y_max + + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: xarea + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: vol_flux_x + + INTEGER :: j,k + + !$omp metadirective & + !$omp when(user={condition(.false.)}: & + !$omp target teams distribute parallel do simd collapse(2)) & + !$omp when(user={condition(.false.)}: & + !$omp target teams distribute parallel do) & + !$omp default( & + !$omp target teams loop collapse(2)) + DO k=y_min,y_max + !$omp metadirective when(user={condition(.false.)}: simd) + DO j=x_min,x_max + vol_flux_x(j,k)=0.25_8*xarea(j,k) + ENDDO + ENDDO + +END SUBROUTINE test1 diff --git a/gcc/testsuite/gfortran.dg/gomp/pr120180-2.f90 b/gcc/testsuite/gfortran.dg/gomp/pr120180-2.f90 new file mode 100644 index 0000000..ea90ad6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr120180-2.f90 @@ -0,0 +1,90 @@ +! { dg-do compile } + +! This test case checks that a non-executable OpenMP directive is accepted +! as intervening code. + +SUBROUTINE test1(x_min, x_max, y_min, y_max, xarea, vol_flux_x) + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: x_min, x_max, y_min, y_max + + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: xarea + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: vol_flux_x + + INTEGER :: j,k + + !$omp do collapse(2) + DO k=y_min,y_max + !$omp nothing + DO j=x_min,x_max + vol_flux_x(j,k)=0.25_8*xarea(j,k) + ENDDO + ENDDO + +END SUBROUTINE test1 + +SUBROUTINE test2(x_min, x_max, y_min, y_max, x, z, vol_flux_x) + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: x_min, x_max, y_min, y_max + + REAL(KIND=8) :: x, z + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: vol_flux_x + + INTEGER :: j,k + + !$omp do collapse(2) + DO k=y_min,y_max + !$omp assume holds(x>1) + z = abs(x-1) + !$omp end assume + DO j=x_min,x_max + vol_flux_x(j,k)=0.25_8*z + ENDDO + ENDDO + +END SUBROUTINE test2 + +SUBROUTINE test3(x_min, x_max, y_min, y_max, z, vol_flux_x) + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: x_min, x_max, y_min, y_max + + REAL(KIND=8) :: z + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: vol_flux_x + + INTEGER :: j,k + + !$omp do collapse(2) + DO k=y_min,y_max + !$omp error at(compilation) ! { dg-error "OMP ERROR encountered at" } + DO j=x_min,x_max + vol_flux_x(j,k)=0.25_8*z + ENDDO + ENDDO + +END SUBROUTINE test3 + +SUBROUTINE test4(x_min, x_max, y_min, y_max, z, vol_flux_x) + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: x_min, x_max, y_min, y_max + + REAL(KIND=8) :: z + REAL(KIND=8), DIMENSION(x_min:x_max,y_min:y_max) :: vol_flux_x + + INTEGER :: j,k + + !$omp do collapse(2) + DO k=y_min,y_max + !$omp error at(execution) ! { dg-error "OMP DO cannot contain OpenMP directive in intervening code" } + DO j=x_min,x_max + vol_flux_x(j,k)=0.25_8*z + ENDDO + ENDDO + +END SUBROUTINE test4 diff --git a/gcc/testsuite/gfortran.dg/gomp/pr122306-1.f90 b/gcc/testsuite/gfortran.dg/gomp/pr122306-1.f90 new file mode 100644 index 0000000..b7eb44f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr122306-1.f90 @@ -0,0 +1,21 @@ +! { dg-do compile } + +! This test case checks that a function call in a context selector is accepted. + +module m + implicit none (type, external) +contains + integer function f(n) + integer :: i, n + f = 0 + !$omp metadirective & + !$omp& when(user={condition(use_target())}: target parallel do map(f) reduction(+:f)) & + !$omp& otherwise(parallel do reduction(+:f)) + do i = 1, n + f = f + 1 + end do + end + logical function use_target() + use_target = .false. + end +end diff --git a/gcc/testsuite/gfortran.dg/gomp/pr122306-2.f90 b/gcc/testsuite/gfortran.dg/gomp/pr122306-2.f90 new file mode 100644 index 0000000..799c92b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr122306-2.f90 @@ -0,0 +1,33 @@ +! { dg-do compile } + +! This test case checks that various user-condition context selectors correctly +! parsed and resolved. + +SUBROUTINE test1(x_min, x_max, vol_flux_x) + IMPLICIT NONE + INTEGER, INTENT(IN) :: x_min, x_max + REAL(KIND=8), DIMENSION(x_min:x_max) :: vol_flux_x + integer, parameter :: one = 1 + INTEGER :: j + + !$omp begin metadirective when(user={condition(one < 0)}: parallel) + DO j=x_min,x_max + vol_flux_x(j)=0.25_8 + ENDDO + !$omp end metadirective +END SUBROUTINE test1 + +SUBROUTINE test2(x_min, x_max, vol_flux_x, flag) + IMPLICIT NONE + INTEGER, INTENT(IN) :: x_min, x_max + REAL(KIND=8), DIMENSION(x_min:x_max) :: vol_flux_x + LOGICAL :: flag + INTEGER :: j + + !$omp begin metadirective when(user={condition(flag)}: parallel) + DO j=x_min,x_max + vol_flux_x(j)=0.25_8 + ENDDO + !$omp end metadirective +END SUBROUTINE test2 + diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h index 4aa18e3..fe9ad1d 100644 --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h @@ -73,6 +73,13 @@ #undef create_code #undef verify_code +/* test-arrays-u64.c */ +#define create_code create_code_arrays_u64 +#define verify_code verify_code_arrays_u64 +#include "test-arrays-u64.c" +#undef create_code +#undef verify_code + /* test-autovectorize.c */ #define create_code create_code_autovectorize #define verify_code verify_code_autovectorize @@ -397,6 +404,13 @@ #undef create_code #undef verify_code +/* test-sized-float.c */ +#define create_code create_code_sized_float +#define verify_code verify_code_sized_float +#include "test-sized-float.c" +#undef create_code +#undef verify_code + /* test-target-builtins.c: This can't be in the testcases array as it is target-specific. */ @@ -517,6 +531,9 @@ const struct testcase testcases[] = { {"arrays", create_code_arrays, verify_code_arrays}, + {"arrays-u64", + create_code_arrays_u64, + verify_code_arrays_u64}, {"autovectorize", create_code_autovectorize, verify_code_autovectorize}, @@ -628,6 +645,9 @@ const struct testcase testcases[] = { {"sizeof", create_code_sizeof, verify_code_sizeof}, + {"sized-float", + create_code_sized_float, + verify_code_sized_float}, {"string_literal", create_code_string_literal, verify_code_string_literal}, diff --git a/gcc/testsuite/jit.dg/test-arrays-u64.c b/gcc/testsuite/jit.dg/test-arrays-u64.c new file mode 100644 index 0000000..ec8525c --- /dev/null +++ b/gcc/testsuite/jit.dg/test-arrays-u64.c @@ -0,0 +1,165 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stddef.h> + +#include "libgccjit.h" + +#include "harness.h" + +#define ARRAY_SIZE (4) + +/* Verify that struct layout works properly when adding an array field. */ +struct array_holder2 +{ + float m_before; + int m_ints[ARRAY_SIZE]; + float m_after; +}; + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Let's try to inject the equivalent of: + + void + test_array_u64 (struct array_holder2 *ah) + { + ah->m_before = 4.0f; + for i in 0 to (ARRAY_SIZE - 1): + ah->m_ints[i] = (i * i); + ah->m_after = 2.0f; + } + */ + gcc_jit_type *void_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID); + gcc_jit_type *float_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT); + gcc_jit_type *int_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); + + gcc_jit_field *field_m_before = + gcc_jit_context_new_field (ctxt, NULL, float_type, "m_before"); + gcc_jit_field *field_m_ints = + gcc_jit_context_new_field ( + ctxt, NULL, + gcc_jit_context_new_array_type_u64 (ctxt, NULL, int_type, ARRAY_SIZE), + "m_ints"); + gcc_jit_field *field_m_after = + gcc_jit_context_new_field (ctxt, NULL, float_type, "m_after"); + + gcc_jit_field *fields[] = { + field_m_before, + field_m_ints, + field_m_after, + }; + + gcc_jit_struct *struct_type = + gcc_jit_context_new_struct_type ( + ctxt, + NULL, + "array_holder2", + 3, fields); + + gcc_jit_type *struct_ptr_type = + gcc_jit_type_get_pointer (gcc_jit_struct_as_type (struct_type)); + + /* Build the test_fn. */ + gcc_jit_param *param_ah = + gcc_jit_context_new_param (ctxt, NULL, struct_ptr_type, "ah"); + gcc_jit_function *func = + gcc_jit_context_new_function (ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + void_type, + "test_array_u64", + 1, ¶m_ah, + 0); + + gcc_jit_block *initial = gcc_jit_function_new_block (func, "initial"); + gcc_jit_block *loop_test = gcc_jit_function_new_block (func, "loop_test"); + gcc_jit_block *loop_body = gcc_jit_function_new_block (func, "loop_body"); + gcc_jit_block *final = gcc_jit_function_new_block (func, "final"); + + /* "ah->m_before = 4.0f;" */ + gcc_jit_block_add_assignment ( + initial, NULL, + gcc_jit_rvalue_dereference_field ( + gcc_jit_param_as_rvalue (param_ah), NULL, field_m_before), + gcc_jit_context_new_rvalue_from_int (ctxt, float_type, 4)); + + gcc_jit_block_add_comment (initial, NULL, + "for i in 0 to (ARRAY_SIZE - 1):"); + gcc_jit_lvalue *i = + gcc_jit_function_new_local (func, NULL, int_type, "i"); + gcc_jit_block_add_assignment (initial, NULL, + i, + gcc_jit_context_zero (ctxt, int_type)); + + gcc_jit_block_end_with_jump (initial, NULL, loop_test); + + gcc_jit_block_end_with_conditional (loop_test, NULL, + gcc_jit_context_new_comparison ( + ctxt, NULL, + GCC_JIT_COMPARISON_LT, + gcc_jit_lvalue_as_rvalue (i), + gcc_jit_context_new_rvalue_from_int (ctxt, int_type, ARRAY_SIZE)), + loop_body, + final); + + gcc_jit_block_add_comment (loop_body, NULL, "ah->m_ints[i] = (i * i);"); + gcc_jit_block_add_assignment ( + loop_body, NULL, + gcc_jit_context_new_array_access ( + ctxt, NULL, + gcc_jit_lvalue_as_rvalue (gcc_jit_rvalue_dereference_field ( + gcc_jit_param_as_rvalue (param_ah), + NULL, + field_m_ints)), + gcc_jit_lvalue_as_rvalue (i)), + gcc_jit_context_new_binary_op ( + ctxt, NULL, + GCC_JIT_BINARY_OP_MULT, + int_type, + gcc_jit_lvalue_as_rvalue (i), + gcc_jit_lvalue_as_rvalue (i))); + + /* "i++" */ + gcc_jit_block_add_assignment_op ( + loop_body, NULL, + i, + GCC_JIT_BINARY_OP_PLUS, + gcc_jit_context_one (ctxt, int_type)); + + gcc_jit_block_end_with_jump (loop_body, NULL, loop_test); + + /* ah->m_after = 2.0f; */ + gcc_jit_block_add_assignment ( + final, NULL, + gcc_jit_rvalue_dereference_field ( + gcc_jit_param_as_rvalue (param_ah), NULL, field_m_after), + gcc_jit_context_new_rvalue_from_int (ctxt, float_type, 2)); + gcc_jit_block_end_with_void_return (final, NULL); + +} + +void +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) +{ + typedef void (*fn_type) (struct array_holder2 *ah); + + CHECK_NON_NULL (result); + fn_type test_array_u64 = + (fn_type)gcc_jit_result_get_code (result, "test_array_u64"); + CHECK_NON_NULL (test_array_u64); + + struct array_holder2 ah; + memset (&ah, 0xf0, sizeof (ah)); + + test_array_u64 (&ah); + CHECK_VALUE (ah.m_before, 4.0f); + CHECK_VALUE (ah.m_ints[0], 0); + CHECK_VALUE (ah.m_ints[1], 1); + CHECK_VALUE (ah.m_ints[2], 4); + CHECK_VALUE (ah.m_ints[3], 9); + CHECK_VALUE (ah.m_after, 2.0f); + +} diff --git a/gcc/testsuite/jit.dg/test-error-array-bounds.c b/gcc/testsuite/jit.dg/test-error-array-bounds.c index a0dead1..fb5c206 100644 --- a/gcc/testsuite/jit.dg/test-error-array-bounds.c +++ b/gcc/testsuite/jit.dg/test-error-array-bounds.c @@ -64,11 +64,7 @@ create_code (gcc_jit_context *ctxt, void *user_data) void verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) { - /* Verify that the diagnostic led to the context failing... */ - CHECK_VALUE (result, NULL); - - /* ...and that the message was captured by the API. */ - CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt), - "array subscript 10 is above array bounds of" - " 'char[10]' [-Warray-bounds=]"); + /* Verify that the message was captured by the API. */ + CHECK_STRING_VALUE (gcc_jit_context_get_last_error (ctxt), + "while referencing 'buffer'"); } diff --git a/gcc/testsuite/jit.dg/test-sized-float.c b/gcc/testsuite/jit.dg/test-sized-float.c new file mode 100644 index 0000000..fc90f14 --- /dev/null +++ b/gcc/testsuite/jit.dg/test-sized-float.c @@ -0,0 +1,167 @@ +#include <stdio.h> +#include <stddef.h> +#include <stdbool.h> + +#include "libgccjit.h" + +#include "harness.h" + +struct float_zoo +{ + _Float16 m_float16; + _Float32 m_float32; + _Float64 m_float64; + __float128 m_float128; +}; + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Let's try to inject the equivalent of: + + void + test_caller (struct float_zoo *z) + { + for each fields "m_field": + z->m_field = ...some data; + } + */ + gcc_jit_type *void_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID); + +#define CREATE_FIELD(TYPE, NAME) \ + gcc_jit_context_new_field ( \ + ctxt, NULL, \ + gcc_jit_context_get_type (ctxt, TYPE), \ + NAME) + + gcc_jit_context *info_ctxt = gcc_jit_context_acquire (); + gcc_jit_target_info *target_info = gcc_jit_context_get_target_info (info_ctxt); + + enum gcc_jit_types float_type1 = GCC_JIT_TYPE_FLOAT; + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT16)) + float_type1 = GCC_JIT_TYPE_FLOAT16; + + enum gcc_jit_types float_type2 = GCC_JIT_TYPE_FLOAT; + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT32)) + float_type2 = GCC_JIT_TYPE_FLOAT32; + + enum gcc_jit_types float_type3 = GCC_JIT_TYPE_FLOAT; + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT64)) + float_type3 = GCC_JIT_TYPE_FLOAT64; + + enum gcc_jit_types float_type4 = GCC_JIT_TYPE_FLOAT; + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT128)) + float_type4 = GCC_JIT_TYPE_FLOAT128; + + gcc_jit_field *field_m_float16 = CREATE_FIELD(float_type1, "m_float16"); + gcc_jit_field *field_m_float32 = CREATE_FIELD(float_type2, "m_float32"); + gcc_jit_field *field_m_float64 = CREATE_FIELD(float_type3, "m_float64"); + gcc_jit_field *field_m_float128 = CREATE_FIELD(float_type4, "m_float128"); + +#undef CREATE_FIELD + + gcc_jit_field *zoo_fields[] = { + field_m_float16, + field_m_float32, + field_m_float64, + field_m_float128, + }; + + gcc_jit_type *zoo_type = + gcc_jit_struct_as_type ( + gcc_jit_context_new_struct_type ( + ctxt, + NULL, + "float_zoo", + sizeof (zoo_fields) / sizeof (zoo_fields[0]), + zoo_fields)); + + gcc_jit_type *zoo_ptr_type = + gcc_jit_type_get_pointer (zoo_type); + + /* Build the test_fn. */ + gcc_jit_param *param_z = + gcc_jit_context_new_param (ctxt, NULL, zoo_ptr_type, "z"); + gcc_jit_function *test_fn = + gcc_jit_context_new_function (ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + void_type, + "test_float_types", + 1, ¶m_z, + 0); + gcc_jit_block *block = gcc_jit_function_new_block (test_fn, NULL); + + /* Write to the various fields of param "z". */ +#define ASSIGN(FIELD, EXPR) \ + gcc_jit_block_add_assignment ( \ + block, NULL, \ + gcc_jit_rvalue_dereference_field ( \ + gcc_jit_param_as_rvalue (param_z), \ + NULL, \ + (FIELD)), \ + (EXPR)); + + ASSIGN(field_m_float16, + gcc_jit_context_new_rvalue_from_double ( + ctxt, + gcc_jit_context_get_type (ctxt, float_type1), + 3.141)) + ASSIGN(field_m_float32, + gcc_jit_context_new_rvalue_from_double ( + ctxt, + gcc_jit_context_get_type (ctxt, float_type2), + 3.141)) + ASSIGN(field_m_float64, + gcc_jit_context_new_rvalue_from_double ( + ctxt, + gcc_jit_context_get_type (ctxt, float_type3), + 3.141)) + ASSIGN(field_m_float128, + gcc_jit_context_new_rvalue_from_double ( + ctxt, + gcc_jit_context_get_type (ctxt, float_type4), + 3.141)) + +#undef ASSIGN + + gcc_jit_block_end_with_void_return (block, NULL); +} + +void +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) +{ + typedef void (*fn_type) (struct float_zoo *); + CHECK_NON_NULL (result); + + fn_type test_float_types = + (fn_type)gcc_jit_result_get_code (result, "test_float_types"); + CHECK_NON_NULL (test_float_types); + + struct float_zoo z; + memset (&z, 0xf0, sizeof (z)); + + /* Call the JIT-generated function. */ + test_float_types (&z); + + /* Verify that it correctly wrote to the various fields. */ + gcc_jit_context *info_ctxt = gcc_jit_context_acquire (); + gcc_jit_target_info *target_info = gcc_jit_context_get_target_info (info_ctxt); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT16)) + CHECK_VALUE (z.m_float16, (_Float16)3.141); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT32)) + CHECK_VALUE (z.m_float32, (_Float32)3.141); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT64)) + CHECK_VALUE (z.m_float64, (_Float64)3.141); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT128)) + CHECK_VALUE (z.m_float128, (__float128)3.141); + + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT16)) + CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT16)), sizeof (_Float16)); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT32)) + CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT32)), sizeof (_Float32)); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT64)) + CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT64)), sizeof (_Float64)); + if (gcc_jit_target_info_supports_target_dependent_type (target_info, GCC_JIT_TYPE_FLOAT128)) + CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT128)), sizeof (__float128)); +} |