aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog182
-rw-r--r--gcc/testsuite/c-c++-common/gomp/assume-2.c4
-rw-r--r--gcc/testsuite/c-c++-common/gomp/assumes-2.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/begin-assumes-2.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/imperfect1.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/imperfect4.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/metadirective-2.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr120180-1.c (renamed from gcc/testsuite/c-c++-common/gomp/pr120180.c)6
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr120180-2.c66
-rw-r--r--gcc/testsuite/g++.dg/cpp/embed-27.C38
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr122302.C40
-rw-r--r--gcc/testsuite/g++.dg/ext/is_implicit_lifetime.C139
-rw-r--r--gcc/testsuite/g++.dg/gomp/attrs-imperfect1.C2
-rw-r--r--gcc/testsuite/g++.dg/gomp/attrs-imperfect4.C2
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr120180-1.C26
-rw-r--r--gcc/testsuite/g++.target/i386/mv16.C6
-rw-r--r--gcc/testsuite/gcc.dg/c2y-generic-6.c11
-rw-r--r--gcc/testsuite/gcc.dg/c2y-generic-7.c15
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec1.c19
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-cb-spec2.c21
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-cb1.c25
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr101024-1.c39
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr110068-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-div-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-div.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-mod.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-udiv.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-ceil-umod.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-div-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-div-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-div.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-mod-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-floor-mod.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-div-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-div-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-div.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-mod-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-mod-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-mod.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-udiv-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-udiv.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-umod-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-umod-pow2.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116-round-umod.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr104116.h9
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-pr122370.c17
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-pr122371.c20
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-bool-9.c27
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-chain-4.c31
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-chain-5.c31
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-1.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-10.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-11.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-12.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-13.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-14.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-15.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-16.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-17.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-18.c60
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-2.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-3.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-4.c52
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-5.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-6.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-7.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-8.c50
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vect-reduc-bool-9.c59
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-1.c51
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-2.c51
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-3.c51
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-4.c51
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-5.c49
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-6.c49
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-7.c49
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-8.c49
-rw-r--r--gcc/testsuite/gcc.target/aarch64/vect-reduc-bool-9.c63
-rw-r--r--gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_s32.c10
-rw-r--r--gcc/testsuite/gcc.target/arm/mve/intrinsics/vadcq_m_u32.c10
-rw-r--r--gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_s32.c10
-rw-r--r--gcc/testsuite/gcc.target/arm/mve/intrinsics/vsbcq_m_u32.c10
-rw-r--r--gcc/testsuite/gcc.target/i386/funcspec-56.inc1
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask16.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask2.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask32.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask4.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask64.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122320-mask8.c32
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-stv-10.c13
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-stv-11.c14
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-stv-12.c14
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-8.c2
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f902
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/declare-variant-20.f901
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr120180-1.f9031
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr120180-2.f9090
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr122306-1.f9021
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr122306-2.f9033
-rw-r--r--gcc/testsuite/jit.dg/all-non-failing-tests.h20
-rw-r--r--gcc/testsuite/jit.dg/test-arrays-u64.c165
-rw-r--r--gcc/testsuite/jit.dg/test-error-array-bounds.c10
-rw-r--r--gcc/testsuite/jit.dg/test-sized-float.c167
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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*)&uarr;
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, &param_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, &param_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));
+}