diff options
author | Sam James <sam@gentoo.org> | 2024-01-10 12:08:13 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-01-10 12:08:13 +0000 |
commit | 9d69e54a3b402b0fad067464bd402e92c14504a9 (patch) | |
tree | c570fde82e3b75b87966c046bf75d1a195c793a1 /14.0.0/gentoo | |
parent | 14.0.0: cut patchset 15 (diff) | |
download | gcc-patches-9d69e54a3b402b0fad067464bd402e92c14504a9.tar.gz gcc-patches-9d69e54a3b402b0fad067464bd402e92c14504a9.tar.bz2 gcc-patches-9d69e54a3b402b0fad067464bd402e92c14504a9.zip |
14.0.0: drop reverts
Upstream fixes have started landing.
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to '14.0.0/gentoo')
9 files changed, 11 insertions, 8656 deletions
diff --git a/14.0.0/gentoo/75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch b/14.0.0/gentoo/75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch deleted file mode 100644 index 93bf96b..0000000 --- a/14.0.0/gentoo/75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0d9351ff8ab23e79edc7a468a255a7c009695f21 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:10 +0000 -Subject: [PATCH 1/8] Revert "middle-end: explicitly initialize vec_stmts - [PR113132]" - -This reverts commit fd032cce216e003d58b2394f7e61b03dee27e81a. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/tree-vect-loop.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc -index a06771611ac8..2bd96b56006a 100644 ---- a/gcc/tree-vect-loop.cc -+++ b/gcc/tree-vect-loop.cc -@@ -6207,7 +6207,7 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, - exit_bb = loop_exit->dest; - exit_gsi = gsi_after_labels (exit_bb); - reduc_inputs.create (slp_node ? vec_num : ncopies); -- vec <gimple *> vec_stmts = vNULL; -+ vec <gimple *> vec_stmts; - for (unsigned i = 0; i < vec_num; i++) - { - gimple_seq stmts = NULL; --- -2.43.0 - diff --git a/14.0.0/gentoo/76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch b/14.0.0/gentoo/76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch deleted file mode 100644 index d22a7ae..0000000 --- a/14.0.0/gentoo/76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 21f952dd33ae6037ff1a18cfe1c52dcc9becce19 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:12 +0000 -Subject: [PATCH 2/8] Revert "testsuite: un-xfail TSVC loops that check for - exit control flow vectorization" - -This reverts commit a657c7e3518fcfc796f223d47385cad5e97dc9a5. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s332.c | 3 +-- - gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s481.c | 3 +-- - gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s482.c | 3 +-- - 3 files changed, 3 insertions(+), 6 deletions(-) - -diff --git a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s332.c b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s332.c -index 0d55d0dd67c3..3fd490b3797d 100644 ---- a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s332.c -+++ b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s332.c -@@ -3,7 +3,6 @@ - - /* { dg-additional-options "--param vect-epilogues-nomask=0" } */ - /* { dg-require-effective-target vect_float } */ --/* { dg-add-options vect_early_break } */ - - #include "tsvc.h" - -@@ -50,4 +49,4 @@ int main (int argc, char **argv) - return 0; - } - --/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail { ! vect_early_break } } } } */ -+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s481.c b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s481.c -index 5539f0f08411..bf98e173d2e6 100644 ---- a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s481.c -+++ b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s481.c -@@ -3,7 +3,6 @@ - - /* { dg-additional-options "--param vect-epilogues-nomask=0" } */ - /* { dg-require-effective-target vect_float } */ --/* { dg-add-options vect_early_break } */ - - #include "tsvc.h" - -@@ -40,4 +39,4 @@ int main (int argc, char **argv) - return 0; - } - --/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail { ! vect_early_break} } } } */ -+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s482.c b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s482.c -index 73bed5d4c57a..c4e26806292a 100644 ---- a/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s482.c -+++ b/gcc/testsuite/gcc.dg/vect/tsvc/vect-tsvc-s482.c -@@ -3,7 +3,6 @@ - - /* { dg-additional-options "--param vect-epilogues-nomask=0" } */ - /* { dg-require-effective-target vect_float } */ --/* { dg-add-options vect_early_break } */ - - #include "tsvc.h" - -@@ -38,4 +37,4 @@ int main (int argc, char **argv) - return 0; - } - --/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail { ! vect_early_break } } } } */ -+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail *-*-* } } } */ --- -2.43.0 - diff --git a/14.0.0/gentoo/77_all_Revert_arm_Add_Advanced_SIMD_cbranch_implementation.patch b/14.0.0/gentoo/77_all_Revert_arm_Add_Advanced_SIMD_cbranch_implementation.patch deleted file mode 100644 index e284b9d..0000000 --- a/14.0.0/gentoo/77_all_Revert_arm_Add_Advanced_SIMD_cbranch_implementation.patch +++ /dev/null @@ -1,341 +0,0 @@ -From f7dfd5052edeaa7f433bc296fd3c8b9c5239edb3 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 8 Jan 2024 07:09:10 +0000 -Subject: [PATCH 3/8] Revert "arm: Add Advanced SIMD cbranch implementation" - -This reverts commit d9dd04f9f17e36854387899eb630c64a0c8d1a17. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/config/arm/neon.md | 49 ------- - .../gcc.dg/vect/vect-early-break_2.c | 2 +- - .../gcc.dg/vect/vect-early-break_7.c | 2 +- - .../gcc.dg/vect/vect-early-break_75.c | 2 +- - .../gcc.dg/vect/vect-early-break_77.c | 2 +- - .../gcc.dg/vect/vect-early-break_82.c | 2 +- - .../gcc.dg/vect/vect-early-break_88.c | 2 +- - .../gcc.target/arm/vect-early-break-cbranch.c | 138 ------------------ - gcc/testsuite/lib/target-supports.exp | 7 - - 9 files changed, 6 insertions(+), 200 deletions(-) - delete mode 100644 gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c - -diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md -index bb6e28ff4e74..91ca7e804555 100644 ---- a/gcc/config/arm/neon.md -+++ b/gcc/config/arm/neon.md -@@ -408,55 +408,6 @@ (define_insn "vec_extract<mode><V_elem_l>" - [(set_attr "type" "neon_store1_one_lane<q>,neon_to_gp<q>")] - ) - --;; Patterns comparing two vectors and conditionally jump. --;; Avdanced SIMD lacks a vector != comparison, but this is a quite common --;; operation. To not pay the penalty for inverting == we can map our any --;; comparisons to all i.e. any(~x) => all(x). --;; --;; However unlike the AArch64 version, we can't optimize this further as the --;; chain is too long for combine due to these being unspecs so it doesn't fold --;; the operation to something simpler. --(define_expand "cbranch<mode>4" -- [(set (pc) (if_then_else -- (match_operator 0 "expandable_comparison_operator" -- [(match_operand:VDQI 1 "register_operand") -- (match_operand:VDQI 2 "reg_or_zero_operand")]) -- (label_ref (match_operand 3 "" "")) -- (pc)))] -- "TARGET_NEON" --{ -- rtx mask = operands[1]; -- -- /* If comparing against a non-zero vector we have to do a comparison first -- so we can have a != 0 comparison with the result. */ -- if (operands[2] != CONST0_RTX (<MODE>mode)) -- { -- mask = gen_reg_rtx (<MODE>mode); -- emit_insn (gen_xor<mode>3 (mask, operands[1], operands[2])); -- } -- -- /* For 128-bit vectors we need an additional reductions. */ -- if (known_eq (128, GET_MODE_BITSIZE (<MODE>mode))) -- { -- /* Always reduce using a V4SI. */ -- rtx op1 = lowpart_subreg (V4SImode, mask, <MODE>mode); -- mask = gen_reg_rtx (V2SImode); -- rtx low = gen_reg_rtx (V2SImode); -- rtx high = gen_reg_rtx (V2SImode); -- emit_insn (gen_neon_vget_lowv4si (low, op1)); -- emit_insn (gen_neon_vget_highv4si (high, op1)); -- emit_insn (gen_neon_vpumaxv2si (mask, low, high)); -- } -- -- rtx op1 = lowpart_subreg (V2SImode, mask, GET_MODE (mask)); -- emit_insn (gen_neon_vpumaxv2si (op1, op1, op1)); -- -- rtx val = gen_reg_rtx (SImode); -- emit_move_insn (val, gen_lowpart (SImode, mask)); -- emit_jump_insn (gen_cbranch_cc (operands[0], val, const0_rtx, operands[3])); -- DONE; --}) -- - ;; This pattern is renamed from "vec_extract<mode><V_elem_l>" to - ;; "neon_vec_extract<mode><V_elem_l>" and this pattern is called - ;; by define_expand in vec-common.md file. -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c -index dec0b492ab88..5c32bf94409e 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c -@@ -5,7 +5,7 @@ - - /* { dg-additional-options "-Ofast" } */ - --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ - - #include <complex.h> - -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c -index d218a0686719..8c86c5034d75 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c -@@ -5,7 +5,7 @@ - - /* { dg-additional-options "-Ofast" } */ - --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ - - #include <complex.h> - -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c -index 9dcc3372acd6..ed27f8635730 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c -@@ -3,7 +3,7 @@ - /* { dg-require-effective-target vect_int } */ - - /* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-* arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ - - #include <limits.h> - #include <assert.h> -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c -index 9fa7e6948ebf..225106aab0a3 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c -@@ -3,7 +3,7 @@ - /* { dg-require-effective-target vect_int } */ - - /* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ - - #include "tree-vect.h" - -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c -index 7cd21d33485f..0e9b2d8d385c 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c -@@ -5,7 +5,7 @@ - - /* { dg-additional-options "-Ofast" } */ - --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ - - #include <complex.h> - -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c -index 59ed57c5fb5f..b392dd465539 100644 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c -+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c -@@ -3,7 +3,7 @@ - /* { dg-require-effective-target vect_int } */ - - /* { dg-additional-options "-Ofast --param vect-partial-vector-usage=2" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */ -+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ - - #include "tree-vect.h" - -diff --git a/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c b/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c -deleted file mode 100644 -index f57bbd8be428..000000000000 ---- a/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c -+++ /dev/null -@@ -1,138 +0,0 @@ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target arm_neon_ok } */ --/* { dg-require-effective-target arm32 } */ --/* { dg-options "-O3 -march=armv8-a+simd -mfpu=auto -mfloat-abi=hard -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2" } */ --/* { dg-final { check-function-bodies "**" "" "" } } */ -- --#define N 640 --int a[N] = {0}; --int b[N] = {0}; -- --/* --** f1: --** ... --** vcgt.s32 q[0-9]+, q[0-9]+, #0 --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f1 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] > 0) -- break; -- } --} -- --/* --** f2: --** ... --** vcge.s32 q[0-9]+, q[0-9]+, #0 --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f2 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] >= 0) -- break; -- } --} -- --/* --** f3: --** ... --** vceq.i32 q[0-9]+, q[0-9]+, #0 --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f3 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] == 0) -- break; -- } --} -- --/* --** f4: --** ... --** vceq.i32 q[0-9]+, q[0-9]+, #0 --** vmvn q[0-9]+, q[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f4 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] != 0) -- break; -- } --} -- --/* --** f5: --** ... --** vclt.s32 q[0-9]+, q[0-9]+, #0 --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f5 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] < 0) -- break; -- } --} -- --/* --** f6: --** ... --** vcle.s32 q[0-9]+, q[0-9]+, #0 --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+ --** vmov r[0-9]+, s[0-9]+ @ int --** cmp r[0-9]+, #0 --** bne \.L[0-9]+ --** ... --*/ --void f6 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] <= 0) -- break; -- } --} -- -diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp -index b27c30b8c51b..d65953158651 100644 ---- a/gcc/testsuite/lib/target-supports.exp -+++ b/gcc/testsuite/lib/target-supports.exp -@@ -4069,7 +4069,6 @@ proc check_effective_target_vect_early_break { } { - return [check_cached_effective_target_indexed vect_early_break { - expr { - [istarget aarch64*-*-*] -- || [check_effective_target_arm_v8_neon_ok] - || [check_effective_target_sse4] - }}] - } -@@ -4083,7 +4082,6 @@ proc check_effective_target_vect_early_break_hw { } { - return [check_cached_effective_target_indexed vect_early_break_hw { - expr { - [istarget aarch64*-*-*] -- || [check_effective_target_arm_v8_neon_hw] - || [check_sse4_hw_available] - }}] - } -@@ -4093,11 +4091,6 @@ proc add_options_for_vect_early_break { flags } { - return "$flags" - } - -- if { [check_effective_target_arm_v8_neon_ok] } { -- global et_arm_v8_neon_flags -- return "$flags $et_arm_v8_neon_flags -march=armv8-a" -- } -- - if { [check_effective_target_sse4] } { - return "$flags -msse4.1" - } --- -2.43.0 - diff --git a/14.0.0/gentoo/78_all_Revert_testsuite_add_tests_for_early_break_vectorization.patch b/14.0.0/gentoo/78_all_Revert_testsuite_add_tests_for_early_break_vectorization.patch deleted file mode 100644 index 6fbdd54..0000000 --- a/14.0.0/gentoo/78_all_Revert_testsuite_add_tests_for_early_break_vectorization.patch +++ /dev/null @@ -1,4955 +0,0 @@ -From 2fe83ac81d631810a520e5938224c5d10ffbc269 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:13 +0000 -Subject: [PATCH 4/8] Revert "testsuite: Add tests for early break - vectorization" - -This reverts commit c5232ec14937a34e599e9e386a5975fab9a5e283. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/doc/sourcebuild.texi | 13 - - .../g++.dg/vect/vect-early-break_1.cc | 62 ----- - .../g++.dg/vect/vect-early-break_2.cc | 61 ----- - .../g++.dg/vect/vect-early-break_3.cc | 17 -- - .../gcc.dg/vect/vect-early-break-run_1.c | 11 - - .../gcc.dg/vect/vect-early-break-run_10.c | 11 - - .../gcc.dg/vect/vect-early-break-run_2.c | 11 - - .../gcc.dg/vect/vect-early-break-run_3.c | 11 - - .../gcc.dg/vect/vect-early-break-run_4.c | 11 - - .../gcc.dg/vect/vect-early-break-run_5.c | 11 - - .../gcc.dg/vect/vect-early-break-run_6.c | 11 - - .../gcc.dg/vect/vect-early-break-run_7.c | 11 - - .../gcc.dg/vect/vect-early-break-run_8.c | 11 - - .../gcc.dg/vect/vect-early-break-run_9.c | 11 - - .../gcc.dg/vect/vect-early-break-template_1.c | 50 ---- - .../gcc.dg/vect/vect-early-break-template_2.c | 53 ---- - .../gcc.dg/vect/vect-early-break_1.c | 28 --- - .../gcc.dg/vect/vect-early-break_10.c | 29 --- - .../gcc.dg/vect/vect-early-break_11.c | 32 --- - .../gcc.dg/vect/vect-early-break_12.c | 32 --- - .../gcc.dg/vect/vect-early-break_13.c | 28 --- - .../gcc.dg/vect/vect-early-break_14.c | 26 -- - .../gcc.dg/vect/vect-early-break_15.c | 26 -- - .../gcc.dg/vect/vect-early-break_16.c | 26 -- - .../gcc.dg/vect/vect-early-break_17.c | 26 -- - .../gcc.dg/vect/vect-early-break_18.c | 28 --- - .../gcc.dg/vect/vect-early-break_19.c | 28 --- - .../gcc.dg/vect/vect-early-break_2.c | 28 --- - .../gcc.dg/vect/vect-early-break_20.c | 38 --- - .../gcc.dg/vect/vect-early-break_21.c | 38 --- - .../gcc.dg/vect/vect-early-break_22.c | 45 ---- - .../gcc.dg/vect/vect-early-break_23.c | 65 ----- - .../gcc.dg/vect/vect-early-break_24.c | 46 ---- - .../gcc.dg/vect/vect-early-break_25.c | 11 - - .../gcc.dg/vect/vect-early-break_26.c | 44 ---- - .../gcc.dg/vect/vect-early-break_27.c | 19 -- - .../gcc.dg/vect/vect-early-break_28.c | 16 -- - .../gcc.dg/vect/vect-early-break_29.c | 17 -- - .../gcc.dg/vect/vect-early-break_3.c | 21 -- - .../gcc.dg/vect/vect-early-break_30.c | 29 --- - .../gcc.dg/vect/vect-early-break_31.c | 30 --- - .../gcc.dg/vect/vect-early-break_32.c | 30 --- - .../gcc.dg/vect/vect-early-break_33.c | 29 --- - .../gcc.dg/vect/vect-early-break_34.c | 28 --- - .../gcc.dg/vect/vect-early-break_35.c | 29 --- - .../gcc.dg/vect/vect-early-break_36.c | 29 --- - .../gcc.dg/vect/vect-early-break_37.c | 26 -- - .../gcc.dg/vect/vect-early-break_38.c | 26 -- - .../gcc.dg/vect/vect-early-break_39.c | 26 -- - .../gcc.dg/vect/vect-early-break_4.c | 24 -- - .../gcc.dg/vect/vect-early-break_40.c | 27 -- - .../gcc.dg/vect/vect-early-break_41.c | 25 -- - .../gcc.dg/vect/vect-early-break_42.c | 26 -- - .../gcc.dg/vect/vect-early-break_43.c | 30 --- - .../gcc.dg/vect/vect-early-break_44.c | 30 --- - .../gcc.dg/vect/vect-early-break_45.c | 26 -- - .../gcc.dg/vect/vect-early-break_46.c | 28 --- - .../gcc.dg/vect/vect-early-break_47.c | 26 -- - .../gcc.dg/vect/vect-early-break_48.c | 14 -- - .../gcc.dg/vect/vect-early-break_49.c | 25 -- - .../gcc.dg/vect/vect-early-break_5.c | 25 -- - .../gcc.dg/vect/vect-early-break_50.c | 18 -- - .../gcc.dg/vect/vect-early-break_51.c | 26 -- - .../gcc.dg/vect/vect-early-break_52.c | 21 -- - .../gcc.dg/vect/vect-early-break_53.c | 18 -- - .../gcc.dg/vect/vect-early-break_54.c | 30 --- - .../gcc.dg/vect/vect-early-break_55.c | 29 --- - .../gcc.dg/vect/vect-early-break_56.c | 102 -------- - .../gcc.dg/vect/vect-early-break_57.c | 32 --- - .../gcc.dg/vect/vect-early-break_58.c | 19 -- - .../gcc.dg/vect/vect-early-break_59.c | 18 -- - .../gcc.dg/vect/vect-early-break_6.c | 27 -- - .../gcc.dg/vect/vect-early-break_60.c | 18 -- - .../gcc.dg/vect/vect-early-break_61.c | 18 -- - .../gcc.dg/vect/vect-early-break_62.c | 21 -- - .../gcc.dg/vect/vect-early-break_63.c | 29 --- - .../gcc.dg/vect/vect-early-break_64.c | 18 -- - .../gcc.dg/vect/vect-early-break_65.c | 20 -- - .../gcc.dg/vect/vect-early-break_66.c | 28 --- - .../gcc.dg/vect/vect-early-break_67.c | 42 ---- - .../gcc.dg/vect/vect-early-break_68.c | 42 ---- - .../gcc.dg/vect/vect-early-break_69.c | 80 ------ - .../gcc.dg/vect/vect-early-break_7.c | 28 --- - .../gcc.dg/vect/vect-early-break_70.c | 69 ------ - .../gcc.dg/vect/vect-early-break_71.c | 71 ------ - .../gcc.dg/vect/vect-early-break_72.c | 151 ----------- - .../gcc.dg/vect/vect-early-break_73.c | 71 ------ - .../gcc.dg/vect/vect-early-break_74.c | 165 ------------ - .../gcc.dg/vect/vect-early-break_75.c | 234 ------------------ - .../gcc.dg/vect/vect-early-break_76.c | 169 ------------- - .../gcc.dg/vect/vect-early-break_77.c | 34 --- - .../gcc.dg/vect/vect-early-break_78.c | 77 ------ - .../gcc.dg/vect/vect-early-break_79.c | 28 --- - .../gcc.dg/vect/vect-early-break_8.c | 28 --- - .../gcc.dg/vect/vect-early-break_80.c | 49 ---- - .../gcc.dg/vect/vect-early-break_81.c | 31 --- - .../gcc.dg/vect/vect-early-break_82.c | 28 --- - .../gcc.dg/vect/vect-early-break_83.c | 29 --- - .../gcc.dg/vect/vect-early-break_84.c | 44 ---- - .../gcc.dg/vect/vect-early-break_85.c | 40 --- - .../gcc.dg/vect/vect-early-break_86.c | 26 -- - .../gcc.dg/vect/vect-early-break_87.c | 26 -- - .../gcc.dg/vect/vect-early-break_88.c | 41 --- - .../gcc.dg/vect/vect-early-break_89.c | 21 -- - .../gcc.dg/vect/vect-early-break_9.c | 28 --- - .../gcc.dg/vect/vect-early-break_90.c | 48 ---- - .../gcc.dg/vect/vect-early-break_91.c | 48 ---- - .../gcc.dg/vect/vect-early-break_92.c | 48 ---- - .../gcc.dg/vect/vect-early-break_93.c | 48 ---- - gcc/testsuite/lib/target-supports.exp | 38 --- - 110 files changed, 4025 deletions(-) - delete mode 100644 gcc/testsuite/g++.dg/vect/vect-early-break_1.cc - delete mode 100644 gcc/testsuite/g++.dg/vect/vect-early-break_2.cc - delete mode 100644 gcc/testsuite/g++.dg/vect/vect-early-break_3.cc - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_1.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_10.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_2.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_3.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_4.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_5.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_6.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_7.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_8.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-run_9.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-template_1.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break-template_2.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_1.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_10.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_11.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_12.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_13.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_14.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_15.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_16.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_17.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_18.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_19.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_2.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_20.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_21.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_22.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_23.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_24.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_25.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_26.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_27.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_28.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_29.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_3.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_30.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_31.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_32.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_33.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_34.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_35.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_36.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_37.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_38.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_39.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_4.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_40.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_41.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_42.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_43.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_44.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_45.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_46.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_47.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_48.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_49.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_5.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_50.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_51.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_52.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_53.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_54.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_55.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_56.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_57.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_58.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_59.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_6.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_60.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_61.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_62.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_63.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_64.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_65.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_66.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_67.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_68.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_69.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_7.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_70.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_71.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_72.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_73.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_74.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_75.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_76.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_77.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_78.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_79.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_8.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_80.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_81.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_82.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_83.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_84.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_85.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_86.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_87.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_88.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_89.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_9.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_90.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_91.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_92.c - delete mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_93.c - -diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi -index 3a394e7739b6..35da6c11a5a9 100644 ---- a/gcc/doc/sourcebuild.texi -+++ b/gcc/doc/sourcebuild.texi -@@ -1645,14 +1645,6 @@ Target supports hardware vectors of @code{float} when - @option{-funsafe-math-optimizations} is not in effect. - This implies @code{vect_float}. - --@item vect_early_break --Target supports vectorization codegen of loops with early breaks. --This requires an implementation of the cbranch optab for vectors. -- --@item vect_early_break_hw --Target supports hardware vectorization and running of loops with early breaks. --This requires an implementation of the cbranch optab for vectors. -- - @item vect_int - Target supports hardware vectors of @code{int}. - -@@ -3222,11 +3214,6 @@ instructions, if any. - @item tls - Add the target-specific flags needed to use thread-local storage. - --@item vect_early_break --Add the target-specific flags needed to enable early break vectorization for --a target, if any. This requires the target to have an implementation of the --@code{cbranch} optab. -- - @item weak_undefined - Add the flags needed to enable support for weak undefined symbols. - @end table -diff --git a/gcc/testsuite/g++.dg/vect/vect-early-break_1.cc b/gcc/testsuite/g++.dg/vect/vect-early-break_1.cc -deleted file mode 100644 -index fce8e67f20b3..000000000000 ---- a/gcc/testsuite/g++.dg/vect/vect-early-break_1.cc -+++ /dev/null -@@ -1,62 +0,0 @@ --/* { dg-do compile } */ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- -- --/* { dg-additional-options "-w -O2" } */ -- --void fancy_abort(char *, int, const char *) __attribute__((__noreturn__)); --template <unsigned N, typename> struct poly_int_pod { int coeffs[N]; }; --template <unsigned N, typename> class poly_int : public poly_int_pod<N, int> { --public: -- template <typename Ca> poly_int &operator+=(const poly_int_pod<N, Ca> &); --}; --template <unsigned N, typename C> --template <typename Ca> --poly_int<N, C> &poly_int<N, C>::operator+=(const poly_int_pod<N, Ca> &a) { -- for (int i = 0; i < N; i++) -- this->coeffs[i] += a.coeffs[i]; -- return *this; --} --template <unsigned N, typename Ca, typename Cb> --poly_int<N, long> exact_div(poly_int_pod<N, Ca>, Cb) { -- poly_int<N, long> r; -- return r; --} --struct vec_prefix { -- unsigned m_num; --}; --struct vl_ptr; --struct va_heap { -- typedef vl_ptr default_layout; --}; --template <typename, typename A, typename = typename A::default_layout> --struct vec; --template <typename T, typename A> struct vec<T, A, int> { -- T &operator[](unsigned); -- vec_prefix m_vecpfx; -- T m_vecdata[]; --}; --template <typename T, typename A> T &vec<T, A, int>::operator[](unsigned ix) { -- m_vecpfx.m_num ? fancy_abort("", 9, __FUNCTION__), 0 : 0; -- return m_vecdata[ix]; --} --template <typename T> struct vec<T, va_heap> { -- T &operator[](unsigned ix) { return m_vec[ix]; } -- vec<T, va_heap, int> m_vec; --}; --class auto_vec : public vec<poly_int<2, long>, va_heap> {}; --template <typename> class vector_builder : public auto_vec {}; --class int_vector_builder : public vector_builder<int> { --public: -- int_vector_builder(poly_int<2, long>, int, int); --}; --bool vect_grouped_store_supported() { -- int i; -- poly_int<2, long> nelt; -- int_vector_builder sel(nelt, 2, 3); -- for (i = 0; i < 6; i++) -- sel[i] += exact_div(nelt, 2); --} -- -diff --git a/gcc/testsuite/g++.dg/vect/vect-early-break_2.cc b/gcc/testsuite/g++.dg/vect/vect-early-break_2.cc -deleted file mode 100644 -index dad175a336f7..000000000000 ---- a/gcc/testsuite/g++.dg/vect/vect-early-break_2.cc -+++ /dev/null -@@ -1,61 +0,0 @@ --/* { dg-do compile } */ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-w -O2" } */ -- --void fancy_abort(char *, int, const char *) __attribute__((__noreturn__)); --template <unsigned N, typename> struct poly_int_pod { int coeffs[N]; }; --template <unsigned N, typename> class poly_int : public poly_int_pod<N, int> { --public: -- template <typename Ca> poly_int &operator+=(const poly_int_pod<N, Ca> &); --}; --template <unsigned N, typename C> --template <typename Ca> --poly_int<N, C> &poly_int<N, C>::operator+=(const poly_int_pod<N, Ca> &a) { -- for (int i = 0; i < N; i++) -- this->coeffs[i] += a.coeffs[i]; -- return *this; --} --template <unsigned N, typename Ca, typename Cb> --poly_int<N, long> exact_div(poly_int_pod<N, Ca>, Cb) { -- poly_int<N, long> r; -- return r; --} --struct vec_prefix { -- unsigned m_num; --}; --struct vl_ptr; --struct va_heap { -- typedef vl_ptr default_layout; --}; --template <typename, typename A, typename = typename A::default_layout> --struct vec; --template <typename T, typename A> struct vec<T, A, int> { -- T &operator[](unsigned); -- vec_prefix m_vecpfx; -- T m_vecdata[]; --}; --template <typename T, typename A> T &vec<T, A, int>::operator[](unsigned ix) { -- m_vecpfx.m_num ? fancy_abort("", 9, __FUNCTION__), 0 : 0; -- return m_vecdata[ix]; --} --template <typename T> struct vec<T, va_heap> { -- T &operator[](unsigned ix) { return m_vec[ix]; } -- vec<T, va_heap, int> m_vec; --}; --class auto_vec : public vec<poly_int<2, long>, va_heap> {}; --template <typename> class vector_builder : public auto_vec {}; --class int_vector_builder : public vector_builder<int> { --public: -- int_vector_builder(poly_int<2, long>, int, int); --}; --bool vect_grouped_store_supported() { -- int i; -- poly_int<2, long> nelt; -- int_vector_builder sel(nelt, 2, 3); -- for (i = 0; i < 6; i++) -- sel[i] += exact_div(nelt, 2); --} -- -diff --git a/gcc/testsuite/g++.dg/vect/vect-early-break_3.cc b/gcc/testsuite/g++.dg/vect/vect-early-break_3.cc -deleted file mode 100644 -index 8a4e33b0925b..000000000000 ---- a/gcc/testsuite/g++.dg/vect/vect-early-break_3.cc -+++ /dev/null -@@ -1,17 +0,0 @@ --/* { dg-do compile } */ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-w -O2" } */ -- --int aarch64_advsimd_valid_immediate_hs_val32; --bool aarch64_advsimd_valid_immediate_hs() { -- for (int shift = 0; shift < 32; shift += 8) -- if (aarch64_advsimd_valid_immediate_hs_val32 & shift) -- return aarch64_advsimd_valid_immediate_hs_val32; -- for (;;) -- ; --} -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_1.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_1.c -deleted file mode 100644 -index fb8faea3221f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_1.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 0 --#include "vect-early-break-template_1.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_10.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_10.c -deleted file mode 100644 -index 2fc8551db41e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_10.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 800 --#define P 799 --#include "vect-early-break-template_2.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_2.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_2.c -deleted file mode 100644 -index 8c6d4cebb190..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_2.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 802 --#include "vect-early-break-template_1.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_3.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_3.c -deleted file mode 100644 -index ad25db4e6e22..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_3.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 5 --#include "vect-early-break-template_1.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_4.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_4.c -deleted file mode 100644 -index 804d640cd10b..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_4.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 278 --#include "vect-early-break-template_1.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_5.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_5.c -deleted file mode 100644 -index fd8086aab0de..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_5.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 800 --#define P 799 --#include "vect-early-break-template_1.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_6.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_6.c -deleted file mode 100644 -index 3b4490df0ebd..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_6.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 0 --#include "vect-early-break-template_2.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_7.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_7.c -deleted file mode 100644 -index ab9ff90c3d09..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_7.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 802 --#include "vect-early-break-template_2.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_8.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_8.c -deleted file mode 100644 -index c2ea839d7167..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_8.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 5 --#include "vect-early-break-template_2.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_9.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-run_9.c -deleted file mode 100644 -index a221c879387b..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-run_9.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast -save-temps" } */ -- --#define N 803 --#define P 278 --#include "vect-early-break-template_2.c" -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-template_1.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-template_1.c -deleted file mode 100644 -index acc088282ad0..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-template_1.c -+++ /dev/null -@@ -1,50 +0,0 @@ --#include "tree-vect.h" -- --#ifndef N --#define N 803 --#endif -- --#ifndef P --#define P 0 --#endif -- --unsigned vect_a[N] = {0}; --unsigned vect_b[N] = {0}; -- --__attribute__((noipa, noinline)) --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- int x = 1; -- int idx = P; -- vect_a[idx] = x + 1; -- -- test4(x); -- -- if (vect_b[idx] != (x + idx)) -- abort (); -- -- if (vect_a[idx] != x + 1) -- abort (); -- -- if (idx > 0 && vect_a[idx-1] != x) -- abort (); -- --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break-template_2.c b/gcc/testsuite/gcc.dg/vect/vect-early-break-template_2.c -deleted file mode 100644 -index dce852e760a2..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break-template_2.c -+++ /dev/null -@@ -1,53 +0,0 @@ --#include "tree-vect.h" -- --#ifndef N --#define N 803 --#endif -- --#ifndef P --#define P 0 --#endif -- --unsigned vect_a[N] = {0}; --unsigned vect_b[N] = {0}; -- --__attribute__((noipa, noinline)) --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return i; -- vect_a[i] = x; -- -- } -- return ret; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- int x = 1; -- int idx = P; -- vect_a[idx] = x + 1; -- -- unsigned res = test4(x); -- -- if (res != idx) -- abort (); -- -- if (vect_b[idx] != (x + idx)) -- abort (); -- -- if (vect_a[idx] != x + 1) -- abort (); -- -- if (idx > 0 && vect_a[idx-1] != x) -- abort (); -- --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_1.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_1.c -deleted file mode 100644 -index c1da23e691cf..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_1.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_10.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_10.c -deleted file mode 100644 -index 49bae484967f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_10.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x,int y, int z) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- } -- -- ret = x + y * z; -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_11.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_11.c -deleted file mode 100644 -index 8085383a5687..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_11.c -+++ /dev/null -@@ -1,32 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x, int y) --{ -- unsigned ret = 0; --for (int o = 0; o < y; o++) --{ -- ret += o; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } --} -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_12.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_12.c -deleted file mode 100644 -index 8eeec820be5c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_12.c -+++ /dev/null -@@ -1,32 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x, int y) --{ -- unsigned ret = 0; --for (int o = 0; o < y; o++) --{ -- ret += o; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- -- } --} -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_13.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_13.c -deleted file mode 100644 -index 58f5f0ae7e2e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_13.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i] * x; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_14.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_14.c -deleted file mode 100644 -index 3f0a61fe8b71..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_14.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 803 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --int test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return i; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_15.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_15.c -deleted file mode 100644 -index 08e7faf24023..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_15.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 803 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --int test4(unsigned x) --{ -- int ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return i; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_16.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_16.c -deleted file mode 100644 -index 6bb71555be20..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_16.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 1024 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- ret += vect_a[i] + vect_b[i]; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_17.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_17.c -deleted file mode 100644 -index 264031874eed..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_17.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 1024 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- ret = vect_a[i] + vect_b[i]; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_18.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_18.c -deleted file mode 100644 -index babc79c74c39..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_18.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+=2) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_19.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_19.c -deleted file mode 100644 -index 9555c16a0821..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_19.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x, unsigned step) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+=step) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c -deleted file mode 100644 -index 5c32bf94409e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include <complex.h> -- --#define N 1024 --complex double vect_a[N]; --complex double vect_b[N]; -- --complex double test4(complex double x) --{ -- complex double ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] += x + i; -- if (vect_a[i] == x) -- return i; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_20.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_20.c -deleted file mode 100644 -index 039aac7fd84c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_20.c -+++ /dev/null -@@ -1,38 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include <stdbool.h> -- --#ifndef N --#define N 803 --#endif --unsigned vect_b[N]; --struct testStruct { -- long e; -- long f; -- bool a : 1; -- bool b : 1; -- int c : 14; -- int d; --}; --struct testStruct vect_a[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i].a > x) -- return true; -- vect_a[i].e = x; -- } -- return ret; --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_21.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_21.c -deleted file mode 100644 -index dbe3f8265115..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_21.c -+++ /dev/null -@@ -1,38 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <stdbool.h> -- --#ifndef N --#define N 803 --#endif --unsigned vect_b[N]; --struct testStruct { -- long e; -- long f; -- bool a : 1; -- bool b : 1; -- int c : 14; -- int d; --}; --struct testStruct vect_a[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i].a) -- return true; -- vect_a[i].e = x; -- } -- return ret; --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c -deleted file mode 100644 -index b3f5984f682f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_22.c -+++ /dev/null -@@ -1,45 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-require-effective-target vect_perm } */ --/* { dg-require-effective-target vect_early_break_hw } */ -- --#include "tree-vect.h" -- --void __attribute__((noipa)) --foo (int * __restrict__ a, short * __restrict__ b, int * __restrict__ c) --{ -- int t1 = *c; -- int t2 = *c; -- for (int i = 0; i < 64; i+=2) -- { -- b[i] = a[i] - t1; -- t1 = a[i]; -- b[i+1] = a[i+1] - t2; -- t2 = a[i+1]; -- } --} -- --int a[64]; --short b[64]; -- --int --main () --{ -- check_vect (); -- for (int i = 0; i < 64; ++i) -- { -- a[i] = i; -- __asm__ volatile ("" ::: "memory"); -- } -- int c = 7; -- foo (a, b, &c); -- for (int i = 2; i < 64; i+=2) -- if (b[i] != a[i] - a[i-2] -- || b[i+1] != a[i+1] - a[i-1]) -- abort (); -- if (b[0] != -7 || b[1] != -6) -- abort (); -- return 0; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_23.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_23.c -deleted file mode 100644 -index 3e435af44471..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_23.c -+++ /dev/null -@@ -1,65 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --#include "tree-vect.h" -- --#define N 200 --#define M 4 -- --typedef signed char sc; --typedef unsigned char uc; --typedef signed short ss; --typedef unsigned short us; --typedef int si; --typedef unsigned int ui; --typedef signed long long sll; --typedef unsigned long long ull; -- --#define FOR_EACH_TYPE(M) \ -- M (sc) M (uc) \ -- M (ss) M (us) \ -- M (si) M (ui) \ -- M (sll) M (ull) \ -- M (float) M (double) -- --#define TEST_VALUE(I) ((I) * 17 / 2) -- --#define ADD_TEST(TYPE) \ -- void __attribute__((noinline, noclone)) \ -- test_##TYPE (TYPE *a, TYPE *b) \ -- { \ -- for (int i = 0; i < N; i += 2) \ -- { \ -- a[i + 0] = b[i + 0] + 2; \ -- a[i + 1] = b[i + 1] + 3; \ -- } \ -- } -- --#define DO_TEST(TYPE) \ -- for (int j = 1; j < M; ++j) \ -- { \ -- TYPE a[N + M]; \ -- for (int i = 0; i < N + M; ++i) \ -- a[i] = TEST_VALUE (i); \ -- test_##TYPE (a + j, a); \ -- for (int i = 0; i < N; i += 2) \ -- if (a[i + j] != (TYPE) (a[i] + 2) \ -- || a[i + j + 1] != (TYPE) (a[i + 1] + 3)) \ -- __builtin_abort (); \ -- } -- --FOR_EACH_TYPE (ADD_TEST) -- --int --main (void) --{ -- check_vect (); -- -- FOR_EACH_TYPE (DO_TEST) -- return 0; --} -- --/* { dg-final { scan-tree-dump {flags: [^\n]*ARBITRARY\n} "vect" { target vect_int } } } */ --/* { dg-final { scan-tree-dump "using an address-based overlap test" "vect" } } */ --/* { dg-final { scan-tree-dump-not "using an index-based" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_24.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_24.c -deleted file mode 100644 -index fa2a17ed96f1..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_24.c -+++ /dev/null -@@ -1,46 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_double } */ --/* { dg-require-effective-target vect_early_break_hw } */ -- --#include "tree-vect.h" -- --extern void abort (void); --void __attribute__((noinline,noclone)) --foo (double *b, double *d, double *f) --{ -- int i; -- for (i = 0; i < 1024; i++) -- { -- d[2*i] = 2. * d[2*i]; -- d[2*i+1] = 4. * d[2*i+1]; -- b[i] = d[2*i] - 1.; -- f[i] = d[2*i+1] + 2.; -- } --} --int main() --{ -- double b[1024], d[2*1024], f[1024]; -- int i; -- -- check_vect (); -- -- for (i = 0; i < 2*1024; i++) -- d[i] = 1.; -- foo (b, d, f); -- for (i = 0; i < 1024; i+= 2) -- { -- if (d[2*i] != 2.) -- abort (); -- if (d[2*i+1] != 4.) -- abort (); -- } -- for (i = 0; i < 1024; i++) -- { -- if (b[i] != 1.) -- abort (); -- if (f[i] != 6.) -- abort (); -- } -- return 0; --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_25.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_25.c -deleted file mode 100644 -index 4d8b47ed9aaa..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_25.c -+++ /dev/null -@@ -1,11 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* Disabling epilogues until we find a better way to deal with scans. */ --/* { dg-additional-options "--param vect-epilogues-nomask=0" } */ --/* { dg-require-effective-target vect_int } */ -- --#include "vect-peel-1-src.c" -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ --/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail vect_element_align_preferred } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c -deleted file mode 100644 -index 47d2a50218bd..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_26.c -+++ /dev/null -@@ -1,44 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-require-effective-target vect_perm } */ -- --#include "tree-vect.h" -- --void __attribute__((noipa)) --foo (int * __restrict__ a, int * __restrict__ b, int * __restrict__ c) --{ -- int t1 = *c; -- int t2 = *c; -- for (int i = 0; i < 64; i+=2) -- { -- b[i] = a[i] - t1; -- t1 = a[i]; -- b[i+1] = a[i+1] - t2; -- t2 = a[i+1]; -- } --} -- --int a[64], b[64]; -- --int --main () --{ -- check_vect (); -- for (int i = 0; i < 64; ++i) -- { -- a[i] = i; -- __asm__ volatile ("" ::: "memory"); -- } -- int c = 7; -- foo (a, b, &c); -- for (int i = 2; i < 64; i+=2) -- if (b[i] != a[i] - a[i-2] -- || b[i+1] != a[i+1] - a[i-1]) -- abort (); -- if (b[0] != -7 || b[1] != -6) -- abort (); -- return 0; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_27.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_27.c -deleted file mode 100644 -index ed7b31757a0c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_27.c -+++ /dev/null -@@ -1,19 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --void abort (); --int a[128]; -- --int main () --{ -- int i; -- for (i = 1; i < 128; i++) -- if (a[i] != i%4 + 1) -- abort (); -- if (a[0] != 5) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_28.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_28.c -deleted file mode 100644 -index 9c980b8453d9..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_28.c -+++ /dev/null -@@ -1,16 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --void abort (); --int a[128]; --int main () --{ -- int i; -- for (i = 1; i < 128; i++) -- if (a[i] != i%4 + 1) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_29.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_29.c -deleted file mode 100644 -index b66fe204caee..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_29.c -+++ /dev/null -@@ -1,17 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int in[100]; --int out[100 * 2]; -- --int main (void) --{ -- if (out[0] != in[100 - 1]) -- for (int i = 1; i <= 100; ++i) -- if (out[i] != 2) -- __builtin_abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_3.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_3.c -deleted file mode 100644 -index 4afbc7266765..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_3.c -+++ /dev/null -@@ -1,21 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --unsigned test4(char x, char *vect, int n) --{ -- unsigned ret = 0; -- for (int i = 0; i < n; i++) -- { -- if (vect[i] > x) -- return 1; -- -- vect[i] = x; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_30.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_30.c -deleted file mode 100644 -index 3f6e802ae8f0..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_30.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int x[100]; --int choose1(int); --int choose2(); --void consume(int); --void f() { -- for (int i = 0; i < 100; ++i) { -- if (x[i] == 11) { -- if (choose1(i)) -- goto A; -- else -- goto B; -- } -- } -- if (choose2()) -- goto B; --A: -- for (int i = 0; i < 100; ++i) -- consume(i); --B: -- for (int i = 0; i < 100; ++i) -- consume(i * i); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_31.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_31.c -deleted file mode 100644 -index 1eaf52aaa852..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_31.c -+++ /dev/null -@@ -1,30 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 1025 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- ret += vect_a[i] + vect_b[i]; -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_32.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_32.c -deleted file mode 100644 -index 038be402c2b8..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_32.c -+++ /dev/null -@@ -1,30 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 1024 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- ret = vect_a[i] + vect_b[i]; -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_33.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_33.c -deleted file mode 100644 -index 74116143b260..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_33.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a2[N]; --unsigned vect_a1[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x, int z) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a1[i]*2 > x) -- { -- for (int y = 0; y < z; y++) -- vect_a2 [y] *= vect_a1[i]; -- break; -- } -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 2 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_34.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_34.c -deleted file mode 100644 -index 63f1bb4254c6..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_34.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif -- --unsigned vect_a[N] __attribute__ ((aligned (4)));; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- -- for (int i = 1; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_35.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_35.c -deleted file mode 100644 -index 4c0078fbc675..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_35.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a2[N]; --unsigned vect_a1[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a1[i]*2 > x) -- break; -- vect_a1[i] = x; -- if (vect_a2[i]*4 > x) -- break; -- vect_a2[i] = x*x; -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_36.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_36.c -deleted file mode 100644 -index a83994035b9d..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_36.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a2[N]; --unsigned vect_a1[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a1[i]*2 > x) -- break; -- vect_a1[i] = x; -- if (vect_a2[i]*4 > x) -- return i; -- vect_a2[i] = x*x; -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_37.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_37.c -deleted file mode 100644 -index b7559a9adc7c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_37.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 4 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 != x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_38.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_38.c -deleted file mode 100644 -index 8062fbbf6422..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_38.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+=2) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_39.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_39.c -deleted file mode 100644 -index 9d3c6a5dffe3..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_39.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x, unsigned n) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+= (N % 4)) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_4.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_4.c -deleted file mode 100644 -index bd7107c1736c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_4.c -+++ /dev/null -@@ -1,24 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --#define N 1024 --unsigned vect[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- if (i > 16 && vect[i] > x) -- break; -- -- vect[i] = x; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_40.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_40.c -deleted file mode 100644 -index 428f6249fa68..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_40.c -+++ /dev/null -@@ -1,27 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i*=3) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* SCEV can't currently analyze this loop bounds. */ --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_41.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_41.c -deleted file mode 100644 -index 31a8ed2d3e2f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_41.c -+++ /dev/null -@@ -1,25 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; --#pragma GCC novector --#pragma GCC unroll 4 -- for (int i = 0; i < N; i++) -- { -- vect_b[i] += vect_a[i] + x; -- } -- return ret; --} -- --/* novector should have blocked vectorization. */ --/* { dg-final { scan-tree-dump-not "vectorized \d loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_42.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_42.c -deleted file mode 100644 -index f1ee2f7e9a66..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_42.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 800 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c -deleted file mode 100644 -index 7e9f635a0b5a..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_43.c -+++ /dev/null -@@ -1,30 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 802 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+=2) -- { -- vect_b[i] = x + i; -- vect_b[i+1] = x + i + 1; -- if (vect_a[i]*2 > x) -- break; -- if (vect_a[i+1]*2 > x) -- break; -- vect_a[i] = x; -- vect_a[i+1] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c -deleted file mode 100644 -index 7e9f635a0b5a..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_44.c -+++ /dev/null -@@ -1,30 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 802 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i+=2) -- { -- vect_b[i] = x + i; -- vect_b[i+1] = x + i + 1; -- if (vect_a[i]*2 > x) -- break; -- if (vect_a[i+1]*2 > x) -- break; -- vect_a[i] = x; -- vect_a[i+1] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_45.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_45.c -deleted file mode 100644 -index 7031f237ecce..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_45.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i]*2 > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_46.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_46.c -deleted file mode 100644 -index c9aad909ffd8..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_46.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --#include <complex.h> -- --#define N 1024 --complex double vect_a[N]; --complex double vect_b[N]; -- --complex double test4(complex double x) --{ -- complex double ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] += x + i; -- if (vect_a[i] == x) -- return i; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -- --/* At -O2 we can't currently vectorize this because of the libcalls not being -- lowered. */ --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_47.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_47.c -deleted file mode 100644 -index ef90380ea197..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_47.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --void abort (); -- --float results1[16] = {192.00,240.00,288.00,336.00,384.00,432.00,480.00,528.00,0.00}; --float results2[16] = {0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,54.00,120.00,198.00,288.00,390.00,504.00,630.00}; --float a[16] = {0}; --float e[16] = {0}; --float b[16] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45}; --int main1 () --{ -- int i; -- for (i=0; i<16; i++) -- { -- if (a[i] != results1[i] || e[i] != results2[i]) -- abort(); -- } -- -- if (a[i+3] != b[i-1]) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_48.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_48.c -deleted file mode 100644 -index 0efbb2836bfd..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_48.c -+++ /dev/null -@@ -1,14 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int main (void) --{ -- signed char a[50], b[50], c[50]; -- for (int i = 0; i < 50; ++i) -- if (a[i] != ((((signed int) -1 < 0 ? -126 : 4) + ((signed int) -1 < 0 ? -101 : 26) + i * 9 + 0) >> 1)) -- __builtin_abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_49.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_49.c -deleted file mode 100644 -index 6c4ee40fd5d3..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_49.c -+++ /dev/null -@@ -1,25 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --void abort(); --struct foostr { -- _Complex short f1; -- _Complex short f2; --}; --struct foostr a[16] __attribute__ ((__aligned__(16))) = {}; --struct foostr c[16] __attribute__ ((__aligned__(16))); --struct foostr res[16] = {}; --void --foo (void) --{ -- int i; -- for (i = 0; i < 16; i++) -- { -- if (c[i].f1 != res[i].f1) -- abort (); -- if (c[i].f2 != res[i].f2) -- abort (); -- } --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_5.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_5.c -deleted file mode 100644 -index 1468c795b620..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_5.c -+++ /dev/null -@@ -1,25 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 1024 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- return vect_a[i]; -- vect_a[i] = x; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_50.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_50.c -deleted file mode 100644 -index b3cf2d7f05f0..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_50.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --extern void abort(); --float a[1024], b[1024], c[1024], d[1024]; --_Bool k[1024]; -- --int main () --{ -- int i; -- for (i = 0; i < 1024; i++) -- if (k[i] != ((i % 3) == 0 && ((i / 9) % 3) == 0)) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_51.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_51.c -deleted file mode 100644 -index c06eff5a385f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_51.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int x_in[32]; --int x_out_a[32], x_out_b[32]; --int c[16] = {3,2,1,10,1,42,3,4,50,9,32,8,11,10,1,2}; --int a[16 +1] = {0,16,32,48,64,128,256,512,0,16,32,48,64,128,256,512,1024}; --int b[16 +1] = {17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}; -- --void foo () --{ -- int j, i, x; -- int curr_a, flag, next_a, curr_b, next_b; -- { -- for (i = 0; i < 16; i++) -- { -- next_b = b[i+1]; -- curr_b = flag ? next_b : curr_b; -- } -- x_out_b[j] = curr_b; -- } --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -\ No newline at end of file -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_52.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_52.c -deleted file mode 100644 -index 86a632f2a822..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_52.c -+++ /dev/null -@@ -1,21 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --void abort(); --int main1 (short X) --{ -- unsigned char a[128]; -- unsigned short b[128]; -- unsigned int c[128]; -- short myX = X; -- int i; -- for (i = 0; i < 128; i++) -- { -- if (a[i] != (unsigned char)myX || b[i] != myX || c[i] != (unsigned int)myX++) -- abort (); -- } --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_53.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_53.c -deleted file mode 100644 -index a02d5986ba3c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_53.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --void abort (); --int a[64], b[64]; --int main () --{ -- int c = 7; -- for (int i = 1; i < 64; ++i) -- if (b[i] != a[i] - a[i-1]) -- abort (); -- if (b[0] != -7) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_54.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_54.c -deleted file mode 100644 -index bfc78c262751..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_54.c -+++ /dev/null -@@ -1,30 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- unsigned tmp[N]; -- for (int i = 0; i < N; i++) -- { -- tmp[i] = x + i; -- vect_b[i] = tmp[i]; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_55.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_55.c -deleted file mode 100644 -index c2a823bff7a4..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_55.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- volatile unsigned tmp = x + i; -- vect_b[i] = tmp; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c -deleted file mode 100644 -index 9096f66647c7..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_56.c -+++ /dev/null -@@ -1,102 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* Disabling epilogues until we find a better way to deal with scans. */ --/* { dg-additional-options "--param vect-epilogues-nomask=0" } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-add-options bind_pic_locally } */ --/* { dg-require-effective-target vect_early_break_hw } */ -- --#include <stdarg.h> --#include "tree-vect.h" -- --#define N 32 -- --unsigned short sa[N]; --unsigned short sc[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned short sb[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned int ia[N]; --unsigned int ic[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; --unsigned int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; -- --/* Current peeling-for-alignment scheme will consider the 'sa[i+7]' -- access for peeling, and therefore will examine the option of -- using a peeling factor = VF-7%VF. This will result in a peeling factor 1, -- which will also align the access to 'ia[i+3]', and the loop could be -- vectorized on all targets that support unaligned loads. -- Without cost model on targets that support misaligned stores, no peeling -- will be applied since we want to keep the four loads aligned. */ -- --__attribute__ ((noinline)) --int main1 () --{ -- int i; -- int n = N - 7; -- -- /* Multiple types with different sizes, used in independent -- copmutations. Vectorizable. */ -- for (i = 0; i < n; i++) -- { -- sa[i+7] = sb[i] + sc[i]; -- ia[i+3] = ib[i] + ic[i]; -- } -- -- /* check results: */ -- for (i = 0; i < n; i++) -- { -- if (sa[i+7] != sb[i] + sc[i] || ia[i+3] != ib[i] + ic[i]) -- abort (); -- } -- -- return 0; --} -- --/* Current peeling-for-alignment scheme will consider the 'ia[i+3]' -- access for peeling, and therefore will examine the option of -- using a peeling factor = VF-3%VF. This will result in a peeling factor -- 1 if VF=4,2. This will not align the access to 'sa[i+3]', for which we -- need to peel 5,1 iterations for VF=4,2 respectively, so the loop can not -- be vectorized. However, 'ia[i+3]' also gets aligned if we peel 5 -- iterations, so the loop is vectorizable on all targets that support -- unaligned loads. -- Without cost model on targets that support misaligned stores, no peeling -- will be applied since we want to keep the four loads aligned. */ -- --__attribute__ ((noinline)) --int main2 () --{ -- int i; -- int n = N-3; -- -- /* Multiple types with different sizes, used in independent -- copmutations. Vectorizable. */ -- for (i = 0; i < n; i++) -- { -- ia[i+3] = ib[i] + ic[i]; -- sa[i+3] = sb[i] + sc[i]; -- } -- -- /* check results: */ -- for (i = 0; i < n; i++) -- { -- if (sa[i+3] != sb[i] + sc[i] || ia[i+3] != ib[i] + ic[i]) -- abort (); -- } -- -- return 0; --} -- --int main (void) --{ -- check_vect (); -- -- main1 (); -- main2 (); -- -- return 0; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { xfail { vect_early_break && { ! vect_hw_misalign } } } } } */ -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_57.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_57.c -deleted file mode 100644 -index 319bd125c315..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_57.c -+++ /dev/null -@@ -1,32 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ --/* { dg-final { scan-tree-dump "epilog loop required" "vect" } } */ -- --void abort (); -- --unsigned short sa[32]; --unsigned short sc[32] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned short sb[32] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned int ia[32]; --unsigned int ic[32] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; --unsigned int ib[32] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; -- --int main2 (int n) --{ -- int i; -- for (i = 0; i < n; i++) -- { -- if (sa[i+3] != sb[i] + sc[i] || ia[i+3] != ib[i] + ic[i]) -- abort (); -- } --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_58.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_58.c -deleted file mode 100644 -index 5f18f06d423f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_58.c -+++ /dev/null -@@ -1,19 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --extern void abort(); --float a[1024], b[1024], c[1024], d[1024]; --_Bool k[1024]; -- --int main () --{ -- int i; -- for (i = 0; i < 1024; i++) -- if (k[i] != ((i % 3) == 0)) -- abort (); --} -- --/* Pattern didn't match inside gcond. */ --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_59.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_59.c -deleted file mode 100644 -index aec4ee457d78..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_59.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --extern void abort(); --float a[1024], b[1024], c[1024], d[1024]; --_Bool k[1024]; -- --int main () --{ -- int i; -- for (i = 0; i < 1024; i++) -- if (k[i] != (i == 0)) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c -deleted file mode 100644 -index 7b870e9c60dc..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_6.c -+++ /dev/null -@@ -1,27 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#define N 1024 --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < (N/2); i+=2) -- { -- vect_b[i] = x + i; -- vect_b[i+1] = x + i+1; -- if (vect_a[i] > x || vect_a[i+1] > x) -- break; -- vect_a[i] += x * vect_b[i]; -- vect_a[i+1] += x * vect_b[i+1]; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_60.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_60.c -deleted file mode 100644 -index 75b35f8d423f..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_60.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --extern void abort(); --float a[1024], b[1024], c[1024], d[1024]; --_Bool k[1024]; -- --int main () --{ -- char i; -- for (i = 0; i < 1024; i++) -- if (k[i] != (i == 0)) -- abort (); --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_61.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_61.c -deleted file mode 100644 -index c789ec01f32c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_61.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_float } */ -- --typedef float real_t; --__attribute__((aligned(64))) real_t a[32000], b[32000], c[32000]; --real_t s482() --{ -- for (int nl = 0; nl < 10000; nl++) { -- for (int i = 0; i < 32000; i++) { -- a[i] += b[i] * c[i]; -- if (c[i] > b[i]) break; -- } -- } --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_62.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_62.c -deleted file mode 100644 -index aaad62ef8d78..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_62.c -+++ /dev/null -@@ -1,21 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int a, b; --int e() { -- int d, c; -- d = 0; -- for (; d < b; d++) -- a = 0; -- d = 0; -- for (; d < b; d++) -- if (d) -- c++; -- for (;;) -- if (c) -- break; --} -- --/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_63.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_63.c -deleted file mode 100644 -index 1d9ff4ad6bac..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_63.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* Disabling epilogues until we find a better way to deal with scans. */ --/* { dg-do compile } */ --/* { dg-additional-options "--param vect-epilogues-nomask=0" } */ --/* { dg-require-effective-target vect_long } */ --/* { dg-require-effective-target vect_shift } */ --/* { dg-additional-options "-fno-tree-scev-cprop" } */ -- --/* Statement used outside the loop. -- NOTE: SCEV disabled to ensure the live operation is not removed before -- vectorization. */ --__attribute__ ((noinline)) int --liveloop (int start, int n, int *x, int *y) --{ -- int i = start; -- int j; -- int ret; -- -- for (j = 0; j < n; ++j) -- { -- i += 1; -- x[j] = i; -- ret = y[j]; -- } -- return ret; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ --/* { dg-final { scan-tree-dump-times "vec_stmt_relevant_p: stmt live but not relevant" 1 "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_64.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_64.c -deleted file mode 100644 -index aaa2a46fb67e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_64.c -+++ /dev/null -@@ -1,18 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-additional-options "-fdump-tree-vect-all" } */ -- --int d(unsigned); -- --void a() { -- char b[8]; -- unsigned c = 0; -- while (c < 7 && b[c]) -- ++c; -- if (d(c)) -- return; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_partial_vectors } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_65.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_65.c -deleted file mode 100644 -index 23a8341b529d..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_65.c -+++ /dev/null -@@ -1,20 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-options "-Ofast -fno-vect-cost-model -fdump-tree-vect-details" } */ -- --enum a { b }; -- --struct { -- enum a c; --} d[10], *e; -- --void f() { -- int g; -- for (g = 0, e = d; g < sizeof(1); g++, e++) -- if (e->c) -- return; --} -- --/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_66.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_66.c -deleted file mode 100644 -index e54cc5e1260e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_66.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --int a[0]; --int b; -- --void g(); -- --void f() { -- int d, e; -- for (; e; e++) { -- int c; -- switch (b) -- case '9': { -- for (; d < 1; d++) -- if (a[d]) -- c = 1; -- break; -- case '<': -- g(); -- c = 0; -- } -- while (c) -- ; -- } --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_67.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_67.c -deleted file mode 100644 -index e9da46439f27..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_67.c -+++ /dev/null -@@ -1,42 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target int32plus } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- -- -- --int main() --{ -- int var6 = -1267827473; -- do { -- ++var6; -- double s1_115[4], s2_108[4]; -- int var8 = -161498264; -- do { -- ++var8; -- int var12 = 1260960076; -- for (; var12 <= 1260960080; ++var12) { -- int var13 = 1960990937; -- do { -- ++var13; -- int var14 = 2128638723; -- for (; var14 <= 2128638728; ++var14) { -- int var22 = -1141190839; -- do { -- ++var22; -- if (s2_108 > s1_115) { -- int var23 = -890798748; -- do { -- long long e_119[4]; -- } while (var23 <= -890798746); -- } -- } while (var22 <= -1141190829); -- } -- } while (var13 <= 1960990946); -- } -- } while (var8 <= -161498254); -- } while (var6 <= -1267827462); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_68.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_68.c -deleted file mode 100644 -index dfa90b557e87..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_68.c -+++ /dev/null -@@ -1,42 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 800 --#endif --unsigned vect_a1[N]; --unsigned vect_b1[N]; --unsigned vect_c1[N]; --unsigned vect_d1[N]; -- --unsigned vect_a2[N]; --unsigned vect_b2[N]; --unsigned vect_c2[N]; --unsigned vect_d2[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b1[i] += x + i; -- vect_c1[i] += x + i; -- vect_d1[i] += x + i; -- if (vect_a1[i]*2 != x) -- break; -- vect_a1[i] = x; -- -- vect_b2[i] += x + i; -- vect_c2[i] += x + i; -- vect_d2[i] += x + i; -- if (vect_a2[i]*2 != x) -- break; -- vect_a2[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_69.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_69.c -deleted file mode 100644 -index 916351a14ab4..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_69.c -+++ /dev/null -@@ -1,80 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --# define BITSIZEOF_INT 32 --# define BITSIZEOF_LONG 64 --# define BITSIZEOF_LONG_LONG 64 -- --#define MAKE_FUNS(suffix, type) \ --int my_ffs##suffix(type x) { \ -- int i; \ -- if (x == 0) \ -- return 0; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- break; \ -- return i + 1; \ --} \ -- \ --int my_clz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \ -- break; \ -- return i; \ --} -- -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- -- --unsigned int ints[] = NUMS32; -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- -- for (i = 0; i < N(ints); i++) -- { -- if (__builtin_ffs (ints[i]) != my_ffs (ints[i])) -- abort (); -- if (ints[i] != 0 -- && __builtin_clz (ints[i]) != my_clz (ints[i])) -- abort (); -- } -- -- exit (0); --} -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c -deleted file mode 100644 -index 8c86c5034d75..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include <complex.h> -- --#define N 1024 --complex double vect_a[N]; --complex double vect_b[N]; -- --complex double test4(complex double x) --{ -- complex double ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] += x + i; -- if (vect_a[i] == x) -- break; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_70.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_70.c -deleted file mode 100644 -index 3dbedf610406..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_70.c -+++ /dev/null -@@ -1,69 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --# define BITSIZEOF_INT 32 --# define BITSIZEOF_LONG 64 --# define BITSIZEOF_LONG_LONG 64 -- --#define MAKE_FUNS(suffix, type) \ --__attribute__((noinline)) \ --int my_clz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \ -- break; \ -- return i; \ --} -- -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- -- --unsigned int ints[] = NUMS32; -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- for (i = 0; i < N(ints); i++) -- { -- if (ints[i] != 0 -- && __builtin_clz (ints[i]) != my_clz (ints[i])) -- abort (); -- } -- -- exit (0); -- return 0; --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_71.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_71.c -deleted file mode 100644 -index b15c8de3ed75..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_71.c -+++ /dev/null -@@ -1,71 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --# define BITSIZEOF_INT 32 --# define BITSIZEOF_LONG 64 --# define BITSIZEOF_LONG_LONG 64 -- --#define MAKE_FUNS(suffix, type) \ --__attribute__((noinline)) \ --int my_ffs##suffix(type x) { \ -- int i; \ -- if (x == 0) \ -- return 0; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- break; \ -- return i + 1; \ --} -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- -- --unsigned int ints[] = NUMS32; -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- --#pragma GCC novector -- for (i = 0; i < N(ints); i++) -- { -- if (__builtin_ffs (ints[i]) != my_ffs (ints[i])) -- abort (); -- } -- -- exit (0); --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_72.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_72.c -deleted file mode 100644 -index c6d1e9f5fd26..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_72.c -+++ /dev/null -@@ -1,151 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --#if __INT_MAX__ > 2147483647L --# if __INT_MAX__ >= 9223372036854775807L --# define BITSIZEOF_INT 64 --# else --# define BITSIZEOF_INT 32 --# endif --#else --# if __INT_MAX__ >= 2147483647L --# define BITSIZEOF_INT 32 --# else --# define BITSIZEOF_INT 16 --# endif --#endif -- --#if __LONG_MAX__ > 2147483647L --# if __LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG 64 --# else --# define BITSIZEOF_LONG 32 --# endif --#else --# define BITSIZEOF_LONG 32 --#endif -- --#if __LONG_LONG_MAX__ > 2147483647L --# if __LONG_LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG_LONG 64 --# else --# define BITSIZEOF_LONG_LONG 32 --# endif --#else --# define BITSIZEOF_LONG_LONG 32 --#endif -- --#define MAKE_FUNS(suffix, type) \ --__attribute__((noinline)) \ --int my_ctz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- break; \ -- return i; \ --} -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS16 \ -- { \ -- 0x0000U, \ -- 0x0001U, \ -- 0x8000U, \ -- 0x0002U, \ -- 0x4000U, \ -- 0x0100U, \ -- 0x0080U, \ -- 0xa5a5U, \ -- 0x5a5aU, \ -- 0xcafeU, \ -- 0xffffU \ -- } -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- --#define NUMS64 \ -- { \ -- 0x0000000000000000ULL, \ -- 0x0000000000000001ULL, \ -- 0x8000000000000000ULL, \ -- 0x0000000000000002ULL, \ -- 0x4000000000000000ULL, \ -- 0x0000000100000000ULL, \ -- 0x0000000080000000ULL, \ -- 0xa5a5a5a5a5a5a5a5ULL, \ -- 0x5a5a5a5a5a5a5a5aULL, \ -- 0xcafecafe00000000ULL, \ -- 0x0000cafecafe0000ULL, \ -- 0x00000000cafecafeULL, \ -- 0xffffffffffffffffULL \ -- } -- --unsigned int ints[] = --#if BITSIZEOF_INT == 64 --NUMS64; --#elif BITSIZEOF_INT == 32 --NUMS32; --#else --NUMS16; --#endif -- --unsigned long longs[] = --#if BITSIZEOF_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --unsigned long long longlongs[] = --#if BITSIZEOF_LONG_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- --#pragma GCC novector -- for (i = 0; i < N(ints); i++) -- { -- if (ints[i] != 0 -- && __builtin_ctz (ints[i]) != my_ctz (ints[i])) -- abort (); -- } -- -- exit (0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_73.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_73.c -deleted file mode 100644 -index 7f40dd07e543..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_73.c -+++ /dev/null -@@ -1,71 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --# define BITSIZEOF_INT 32 --# define BITSIZEOF_LONG 64 --# define BITSIZEOF_LONG_LONG 64 -- --#define MAKE_FUNS(suffix, type) \ --__attribute__((noinline)) \ --int my_clz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \ -- break; \ -- return i; \ --} -- -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- -- --unsigned int ints[] = NUMS32; -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- --#pragma GCC novector -- for (i = 0; i < N(ints); i++) -- { -- if (ints[i] != 0 -- && __builtin_clz (ints[i]) != my_clz (ints[i])) -- abort (); -- } -- -- exit (0); --} -- -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_74.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_74.c -deleted file mode 100644 -index afd238618b30..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_74.c -+++ /dev/null -@@ -1,165 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --#if __INT_MAX__ > 2147483647L --# if __INT_MAX__ >= 9223372036854775807L --# define BITSIZEOF_INT 64 --# else --# define BITSIZEOF_INT 32 --# endif --#else --# if __INT_MAX__ >= 2147483647L --# define BITSIZEOF_INT 32 --# else --# define BITSIZEOF_INT 16 --# endif --#endif -- --#if __LONG_MAX__ > 2147483647L --# if __LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG 64 --# else --# define BITSIZEOF_LONG 32 --# endif --#else --# define BITSIZEOF_LONG 32 --#endif -- --#if __LONG_LONG_MAX__ > 2147483647L --# if __LONG_LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG_LONG 64 --# else --# define BITSIZEOF_LONG_LONG 32 --# endif --#else --# define BITSIZEOF_LONG_LONG 32 --#endif -- --#define MAKE_FUNS(suffix, type) \ --int my_clrsb##suffix(type x) { \ -- int i; \ -- int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \ -- for (i = 1; i < CHAR_BIT * sizeof (type); i++) \ -- if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \ -- != leading) \ -- break; \ -- return i - 1; \ --} -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS16 \ -- { \ -- 0x0000U, \ -- 0x0001U, \ -- 0x8000U, \ -- 0x0002U, \ -- 0x4000U, \ -- 0x0100U, \ -- 0x0080U, \ -- 0xa5a5U, \ -- 0x5a5aU, \ -- 0xcafeU, \ -- 0xffffU \ -- } -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- --#define NUMS64 \ -- { \ -- 0x0000000000000000ULL, \ -- 0x0000000000000001ULL, \ -- 0x8000000000000000ULL, \ -- 0x0000000000000002ULL, \ -- 0x4000000000000000ULL, \ -- 0x0000000100000000ULL, \ -- 0x0000000080000000ULL, \ -- 0xa5a5a5a5a5a5a5a5ULL, \ -- 0x5a5a5a5a5a5a5a5aULL, \ -- 0xcafecafe00000000ULL, \ -- 0x0000cafecafe0000ULL, \ -- 0x00000000cafecafeULL, \ -- 0xffffffffffffffffULL \ -- } -- --unsigned int ints[] = --#if BITSIZEOF_INT == 64 --NUMS64; --#elif BITSIZEOF_INT == 32 --NUMS32; --#else --NUMS16; --#endif -- --unsigned long longs[] = --#if BITSIZEOF_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --unsigned long long longlongs[] = --#if BITSIZEOF_LONG_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- -- /* Test constant folding. */ -- --#define TEST(x, suffix) \ -- if (__builtin_clrsb##suffix (x) != my_clrsb##suffix (x)) \ -- abort (); -- --#if BITSIZEOF_INT == 32 -- TEST(0x00000000UL,); -- TEST(0x00000001UL,); -- TEST(0x80000000UL,); -- TEST(0x40000000UL,); -- TEST(0x00010000UL,); -- TEST(0x00008000UL,); -- TEST(0xa5a5a5a5UL,); -- TEST(0x5a5a5a5aUL,); -- TEST(0xcafe0000UL,); -- TEST(0x00cafe00UL,); -- TEST(0x0000cafeUL,); -- TEST(0xffffffffUL,); --#endif -- -- exit (0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c -deleted file mode 100644 -index ed27f8635730..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c -+++ /dev/null -@@ -1,234 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --#if __INT_MAX__ > 2147483647L --# if __INT_MAX__ >= 9223372036854775807L --# define BITSIZEOF_INT 64 --# else --# define BITSIZEOF_INT 32 --# endif --#else --# if __INT_MAX__ >= 2147483647L --# define BITSIZEOF_INT 32 --# else --# define BITSIZEOF_INT 16 --# endif --#endif -- --#if __LONG_MAX__ > 2147483647L --# if __LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG 64 --# else --# define BITSIZEOF_LONG 32 --# endif --#else --# define BITSIZEOF_LONG 32 --#endif -- --#if __LONG_LONG_MAX__ > 2147483647L --# if __LONG_LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG_LONG 64 --# else --# define BITSIZEOF_LONG_LONG 32 --# endif --#else --# define BITSIZEOF_LONG_LONG 32 --#endif -- --#define MAKE_FUNS(suffix, type) \ --__attribute__((noinline)) \ --int my_ffs##suffix(type x) { \ -- int i; \ -- if (x == 0) \ -- return 0; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- break; \ -- return i + 1; \ --} \ -- \ --int my_ctz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- break; \ -- return i; \ --} \ -- \ --__attribute__((noinline)) \ --int my_clz##suffix(type x) { \ -- int i; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \ -- break; \ -- return i; \ --} \ -- \ --int my_clrsb##suffix(type x) { \ -- int i; \ -- int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \ -- for (i = 1; i < CHAR_BIT * sizeof (type); i++) \ -- if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \ -- != leading) \ -- break; \ -- return i - 1; \ --} \ -- \ --__attribute__((noinline)) \ --int my_popcount##suffix(type x) { \ -- int i; \ -- int count = 0; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- count++; \ -- return count; \ --} \ -- \ --__attribute__((noinline)) \ --int my_parity##suffix(type x) { \ -- int i; \ -- int count = 0; \ -- for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ -- if (x & ((type) 1 << i)) \ -- count++; \ -- return count & 1; \ --} -- --MAKE_FUNS (ll, unsigned long long); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS16 \ -- { \ -- 0x0000U, \ -- 0x0001U, \ -- 0x8000U, \ -- 0x0002U, \ -- 0x4000U, \ -- 0x0100U, \ -- 0x0080U, \ -- 0xa5a5U, \ -- 0x5a5aU, \ -- 0xcafeU, \ -- 0xffffU \ -- } -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- --#define NUMS64 \ -- { \ -- 0x0000000000000000ULL, \ -- 0x0000000000000001ULL, \ -- 0x8000000000000000ULL, \ -- 0x0000000000000002ULL, \ -- 0x4000000000000000ULL, \ -- 0x0000000100000000ULL, \ -- 0x0000000080000000ULL, \ -- 0xa5a5a5a5a5a5a5a5ULL, \ -- 0x5a5a5a5a5a5a5a5aULL, \ -- 0xcafecafe00000000ULL, \ -- 0x0000cafecafe0000ULL, \ -- 0x00000000cafecafeULL, \ -- 0xffffffffffffffffULL \ -- } -- --unsigned int ints[] = --#if BITSIZEOF_INT == 64 --NUMS64; --#elif BITSIZEOF_INT == 32 --NUMS32; --#else --NUMS16; --#endif -- --unsigned long longs[] = --#if BITSIZEOF_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --unsigned long long longlongs[] = --#if BITSIZEOF_LONG_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- --#pragma GCC novector -- for (i = 0; i < N(longlongs); i++) -- { -- if (__builtin_ffsll (longlongs[i]) != my_ffsll (longlongs[i])) -- abort (); -- if (longlongs[i] != 0 -- && __builtin_clzll (longlongs[i]) != my_clzll (longlongs[i])) -- abort (); -- if (longlongs[i] != 0 -- && __builtin_ctzll (longlongs[i]) != my_ctzll (longlongs[i])) -- abort (); -- if (__builtin_clrsbll (longlongs[i]) != my_clrsbll (longlongs[i])) -- abort (); -- if (__builtin_popcountll (longlongs[i]) != my_popcountll (longlongs[i])) -- abort (); -- if (__builtin_parityll (longlongs[i]) != my_parityll (longlongs[i])) -- abort (); -- } -- -- /* Test constant folding. */ -- --#define TEST(x, suffix) \ -- if (__builtin_ffs##suffix (x) != my_ffs##suffix (x)) \ -- abort (); \ -- --#if BITSIZEOF_LONG_LONG == 64 -- TEST(0x0000000000000000ULL, ll); -- TEST(0x0000000000000001ULL, ll); -- TEST(0x8000000000000000ULL, ll); -- TEST(0x0000000000000002ULL, ll); -- TEST(0x4000000000000000ULL, ll); -- TEST(0x0000000100000000ULL, ll); -- TEST(0x0000000080000000ULL, ll); -- TEST(0xa5a5a5a5a5a5a5a5ULL, ll); -- TEST(0x5a5a5a5a5a5a5a5aULL, ll); -- TEST(0xcafecafe00000000ULL, ll); -- TEST(0x0000cafecafe0000ULL, ll); -- TEST(0x00000000cafecafeULL, ll); -- TEST(0xffffffffffffffffULL, ll); --#endif -- -- exit (0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_76.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_76.c -deleted file mode 100644 -index a7d8e279c670..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_76.c -+++ /dev/null -@@ -1,169 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --#if __INT_MAX__ > 2147483647L --# if __INT_MAX__ >= 9223372036854775807L --# define BITSIZEOF_INT 64 --# else --# define BITSIZEOF_INT 32 --# endif --#else --# if __INT_MAX__ >= 2147483647L --# define BITSIZEOF_INT 32 --# else --# define BITSIZEOF_INT 16 --# endif --#endif -- --#if __LONG_MAX__ > 2147483647L --# if __LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG 64 --# else --# define BITSIZEOF_LONG 32 --# endif --#else --# define BITSIZEOF_LONG 32 --#endif -- --#if __LONG_LONG_MAX__ > 2147483647L --# if __LONG_LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG_LONG 64 --# else --# define BITSIZEOF_LONG_LONG 32 --# endif --#else --# define BITSIZEOF_LONG_LONG 32 --#endif -- --#define MAKE_FUNS(suffix, type) \ --int my_clrsb##suffix(type x) { \ -- int i; \ -- int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \ -- for (i = 1; i < CHAR_BIT * sizeof (type); i++) \ -- if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \ -- != leading) \ -- break; \ -- return i - 1; \ --} \ -- \ -- --MAKE_FUNS (, unsigned); --MAKE_FUNS (ll, unsigned long long); -- --extern void abort (void); --extern void exit (int); -- --#define NUMS16 \ -- { \ -- 0x0000U, \ -- 0x0001U, \ -- 0x8000U, \ -- 0x0002U, \ -- 0x4000U, \ -- 0x0100U, \ -- 0x0080U, \ -- 0xa5a5U, \ -- 0x5a5aU, \ -- 0xcafeU, \ -- 0xffffU \ -- } -- --#define NUMS32 \ -- { \ -- 0x00000000UL, \ -- 0x00000001UL, \ -- 0x80000000UL, \ -- 0x00000002UL, \ -- 0x40000000UL, \ -- 0x00010000UL, \ -- 0x00008000UL, \ -- 0xa5a5a5a5UL, \ -- 0x5a5a5a5aUL, \ -- 0xcafe0000UL, \ -- 0x00cafe00UL, \ -- 0x0000cafeUL, \ -- 0xffffffffUL \ -- } -- --#define NUMS64 \ -- { \ -- 0x0000000000000000ULL, \ -- 0x0000000000000001ULL, \ -- 0x8000000000000000ULL, \ -- 0x0000000000000002ULL, \ -- 0x4000000000000000ULL, \ -- 0x0000000100000000ULL, \ -- 0x0000000080000000ULL, \ -- 0xa5a5a5a5a5a5a5a5ULL, \ -- 0x5a5a5a5a5a5a5a5aULL, \ -- 0xcafecafe00000000ULL, \ -- 0x0000cafecafe0000ULL, \ -- 0x00000000cafecafeULL, \ -- 0xffffffffffffffffULL \ -- } -- --unsigned int ints[] = --#if BITSIZEOF_INT == 64 --NUMS64; --#elif BITSIZEOF_INT == 32 --NUMS32; --#else --NUMS16; --#endif -- --unsigned long longs[] = --#if BITSIZEOF_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --unsigned long long longlongs[] = --#if BITSIZEOF_LONG_LONG == 64 --NUMS64; --#else --NUMS32; --#endif -- --#define N(table) (sizeof (table) / sizeof (table[0])) -- --int --main (void) --{ -- int i; -- -- check_vect (); -- --#pragma GCC novector -- for (i = 0; i < N(ints); i++) -- { -- if (__builtin_clrsb (ints[i]) != my_clrsb (ints[i])) -- abort (); -- } -- -- /* Test constant folding. */ -- --#define TEST(x, suffix) \ -- if (__builtin_clrsb##suffix (x) != my_clrsb##suffix (x)) \ -- abort (); -- --#if BITSIZEOF_LONG_LONG == 64 -- TEST(0xffffffffffffffffULL, ll); -- TEST(0xffffffffffffffffULL, ll); -- TEST(0xffffffffffffffffULL, ll); -- TEST(0xffffffffffffffffULL, ll); -- TEST(0xffffffffffffffffULL, ll); -- TEST(0xffffffffffffffffULL, ll); --#endif -- -- exit (0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c -deleted file mode 100644 -index 225106aab0a3..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c -+++ /dev/null -@@ -1,34 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --double x[1024]; --int a[1024]; --double __attribute__((noipa)) foo () --{ -- double sum = 0.0; -- for (int i = 0 ; i < 1023; ++i) -- { -- sum += x[i]; -- if (a[i]) -- break; -- } -- return sum; --} -- --int main() --{ -- check_vect (); -- -- for (int i = 0; i < 1024; ++i) -- x[i] = i; -- a[19] = 1; -- if (foo () != 190.) -- __builtin_abort (); -- return 0; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_78.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_78.c -deleted file mode 100644 -index f93babc069e1..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_78.c -+++ /dev/null -@@ -1,77 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-O3" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <limits.h> --#include <assert.h> -- --#include "tree-vect.h" -- --#if __INT_MAX__ > 2147483647L --# if __INT_MAX__ >= 9223372036854775807L --# define BITSIZEOF_INT 64 --# else --# define BITSIZEOF_INT 32 --# endif --#else --# if __INT_MAX__ >= 2147483647L --# define BITSIZEOF_INT 32 --# else --# define BITSIZEOF_INT 16 --# endif --#endif -- --#if __LONG_MAX__ > 2147483647L --# if __LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG 64 --# else --# define BITSIZEOF_LONG 32 --# endif --#else --# define BITSIZEOF_LONG 32 --#endif -- --#if __LONG_LONG_MAX__ > 2147483647L --# if __LONG_LONG_MAX__ >= 9223372036854775807L --# define BITSIZEOF_LONG_LONG 64 --# else --# define BITSIZEOF_LONG_LONG 32 --# endif --#else --# define BITSIZEOF_LONG_LONG 32 --#endif -- --#define MAKE_FUNS(suffix, type) \ --int my_clrsb##suffix(type x) { \ -- int i; \ -- int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \ -- for (i = 1; i < CHAR_BIT * sizeof (type); i++) \ -- if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \ -- != leading) \ -- break; \ -- return i - 1; \ --} -- --MAKE_FUNS (, unsigned); -- --extern void abort (void); --extern void exit (int); -- -- --int --main (void) --{ -- check_vect (); -- --#define TEST(x, suffix) \ -- if (__builtin_clrsb##suffix (x) != my_clrsb##suffix (x)) \ -- abort (); -- --#if BITSIZEOF_INT == 32 -- TEST(0xffffffffUL,); --#endif -- exit (0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_79.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_79.c -deleted file mode 100644 -index 3f21be762514..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_79.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --#undef N --#define N 32 -- --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < 1024; i++) -- { -- vect_b[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_8.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_8.c -deleted file mode 100644 -index 84e19423e2e6..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_8.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --#include <complex.h> -- --#define N 1024 --char vect_a[N]; --char vect_b[N]; -- --char test4(char x, char * restrict res) --{ -- char ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_b[i] += x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] += x * vect_b[i]; -- res[i] *= vect_b[i]; -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_80.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_80.c -deleted file mode 100644 -index 7f563b788ac7..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_80.c -+++ /dev/null -@@ -1,49 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --extern void abort (); -- --int x; --__attribute__ ((noinline, noipa)) --void foo (int *a, int *b) --{ -- int local_x = x; -- for (int i = 0; i < 1024; ++i) -- { -- if (i + local_x == 13) -- break; -- a[i] = 2 * b[i]; -- } --} -- --int main () --{ -- -- check_vect (); -- -- int a[1024] = {0}; -- int b[1024] = {0}; -- -- for (int i = 0; i < 1024; i++) -- b[i] = i; -- -- x = -512; -- foo (a, b); -- -- if (a[524] != 1048) -- abort (); -- -- if (a[525] != 0) -- abort (); -- -- if (a[1023] != 0) -- abort (); -- return 0; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_81.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_81.c -deleted file mode 100644 -index 8a8c076ba92c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_81.c -+++ /dev/null -@@ -1,31 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ --/* { dg-final { scan-tree-dump "epilog loop required" "vect" } } */ --void abort (); -- --unsigned short sa[32]; --unsigned short sc[32] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned short sb[32] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, -- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; --unsigned int ia[32]; --unsigned int ic[32] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; --unsigned int ib[32] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, -- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; -- --int main2 (int n) --{ -- int i; -- for (i = 0; i < n - 3; i++) -- { -- if (sa[i+3] != sb[i] + sc[i] || ia[i+3] != ib[i] + ic[i]) -- abort (); -- } --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c -deleted file mode 100644 -index 0e9b2d8d385c..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include <complex.h> -- --#define N 1024 --complex double vect_a[N]; --complex double vect_b[N]; -- --complex double test4(complex double x, complex double t) --{ -- complex double ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_a[i] = t + i; -- if (vect_a[i] == x) -- return i; -- vect_a[i] += x * vect_a[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_83.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_83.c -deleted file mode 100644 -index 8b0e3fd6c5f5..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_83.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump-not "LOOP VECTORIZED" "vect" } } */ -- --#include <complex.h> -- --#define N 1024 --complex double vect_a[N]; --complex double vect_b[N]; -- --complex double test4(complex double x) --{ -- complex double ret = 0; -- for (int i = 0; i < N; i++) -- { -- volatile complex double z = vect_b[i]; -- vect_b[i] = x + i + z; -- if (vect_a[i] == x) -- return i; -- vect_a[i] += x * vect_b[i]; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_84.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_84.c -deleted file mode 100644 -index 242ba453533e..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_84.c -+++ /dev/null -@@ -1,44 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include <stdbool.h> -- --#include "tree-vect.h" -- --#ifndef N --#define N 17 --#endif --bool vect_a[N] = { false, false, true, false, false, false, -- false, false, false, false, false, false, -- false, false, false, false, false }; --unsigned vect_b[N] = { 0 }; -- --__attribute__ ((noinline, noipa)) --unsigned test4(bool x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- if (vect_a[i] == x) -- return 1; -- vect_a[i] = x; -- -- } -- return ret; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- if (test4 (true) != 1) -- abort (); -- -- if (vect_b[2] != 0 && vect_b[1] == 0) -- abort (); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_85.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_85.c -deleted file mode 100644 -index 3df376935735..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_85.c -+++ /dev/null -@@ -1,40 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 5 --#endif --int vect_a[N] = { 5, 4, 8, 4, 6 }; --unsigned vect_b[N] = { 0 }; -- --__attribute__ ((noinline, noipa)) --unsigned test4(int x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- if (vect_a[i] > x) -- return 1; -- vect_a[i] = x; -- -- } -- return ret; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- if (test4 (7) != 1) -- abort (); -- -- if (vect_b[2] != 0 && vect_b[1] == 0) -- abort (); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_86.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_86.c -deleted file mode 100644 -index 85c0d3a92772..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_86.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-additional-options "-std=gnu89" } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include "tree-vect.h" -- --extern void abort (); --extern void exit (int); -- --__attribute__((noinline, noipa)) --int f(x) { -- int i; -- for (i = 0; i < 8 && (x & 1) == 1; i++) -- x >>= 1; -- return i; --} --main() { -- check_vect (); -- -- if (f(4) != 0) -- abort(); -- exit(0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_87.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_87.c -deleted file mode 100644 -index 3dce0c439bff..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_87.c -+++ /dev/null -@@ -1,26 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-additional-options "-std=gnu89" } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */ -- --#include "tree-vect.h" -- --extern void abort (); --extern void exit (int); -- --__attribute__((noinline, noipa)) --int f(x) { -- int i; -- for (i = 0; i < 8 && (x & 1) == 0; i++) -- x >>= 1; -- return i; --} --main() { -- check_vect (); -- -- if (f(4) != 2) -- abort(); -- exit(0); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c -deleted file mode 100644 -index b392dd465539..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c -+++ /dev/null -@@ -1,41 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast --param vect-partial-vector-usage=2" } */ --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 5 --#endif --float vect_a[N] = { 5.1f, 4.2f, 8.0f, 4.25f, 6.5f }; --unsigned vect_b[N] = { 0 }; -- --__attribute__ ((noinline, noipa)) --unsigned test4(double x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- if (test4 (7.0) != 0) -- abort (); -- -- if (vect_b[2] != 0 && vect_b[1] == 0) -- abort (); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_89.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_89.c -deleted file mode 100644 -index 39b6313b3a15..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_89.c -+++ /dev/null -@@ -1,21 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_int } */ --/* { dg-additional-options "-w" } */ -- --char *a; --extern void d(); --void b() { -- int c = 0; -- while (c < 16) { -- switch (a[c]) { -- case '"': -- case '\'': -- c++; -- continue; -- } -- break; -- } -- if (c) -- d(); --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_9.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_9.c -deleted file mode 100644 -index 12f09c61c331..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_9.c -+++ /dev/null -@@ -1,28 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-do compile } */ --/* { dg-require-effective-target vect_early_break } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-additional-options "-Ofast" } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#ifndef N --#define N 803 --#endif --unsigned vect_a[N]; --unsigned vect_b[N]; -- --unsigned test4(unsigned x) --{ -- unsigned ret = 0; -- for (int i = 0; i < N; i++) -- { -- vect_a[i] = x + i; -- if (vect_a[i] > x) -- break; -- vect_a[i] = x; -- -- } -- return ret; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_90.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_90.c -deleted file mode 100644 -index ac390b6ede47..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_90.c -+++ /dev/null -@@ -1,48 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 30 --#endif -- --#ifndef IDX --#define IDX 1 --#endif -- --int n_earlyclobbers; -- --typedef void* rtx; --rtx reload_earlyclobbers[N] = {0}; -- --rtx foo = (void*)0xbadf00d; -- --int --__attribute__((noinline, noipa)) --earlyclobber_operand_p (rtx x) --{ -- int i; -- -- for (i = 0; i < n_earlyclobbers; i++) -- if (reload_earlyclobbers[i] == x) -- return 1; -- -- return 0; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- n_earlyclobbers = IDX; -- if (earlyclobber_operand_p (foo)) -- abort (); -- -- return 0; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_91.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_91.c -deleted file mode 100644 -index 4b1c558f8a33..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_91.c -+++ /dev/null -@@ -1,48 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 30 --#endif -- --#ifndef IDX --#define IDX 0 --#endif -- --int n_earlyclobbers; -- --typedef void* rtx; --rtx reload_earlyclobbers[N] = {0}; -- --rtx foo = (void*)0xbadf00d; -- --int --__attribute__((noinline, noipa)) --earlyclobber_operand_p (rtx x) --{ -- int i; -- -- for (i = 0; i < n_earlyclobbers; i++) -- if (reload_earlyclobbers[i] == x) -- return 1; -- -- return 0; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- n_earlyclobbers = IDX; -- if (earlyclobber_operand_p (foo)) -- abort (); -- -- return 0; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_92.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_92.c -deleted file mode 100644 -index 1b2403b338fd..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_92.c -+++ /dev/null -@@ -1,48 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 30 --#endif -- --#ifndef IDX --#define IDX 15 --#endif -- --int n_earlyclobbers; -- --typedef void* rtx; --rtx reload_earlyclobbers[N] = {0}; -- --rtx foo = (void*)0xbadf00d; -- --int --__attribute__((noinline, noipa)) --earlyclobber_operand_p (rtx x) --{ -- int i; -- -- for (i = 0; i < n_earlyclobbers; i++) -- if (reload_earlyclobbers[i] == x) -- return 1; -- -- return 0; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- n_earlyclobbers = IDX; -- if (earlyclobber_operand_p (foo)) -- abort (); -- -- return 0; --} -diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_93.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_93.c -deleted file mode 100644 -index 656a7788896d..000000000000 ---- a/gcc/testsuite/gcc.dg/vect/vect-early-break_93.c -+++ /dev/null -@@ -1,48 +0,0 @@ --/* { dg-add-options vect_early_break } */ --/* { dg-require-effective-target vect_early_break_hw } */ --/* { dg-require-effective-target vect_int } */ -- --/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ -- --#include "tree-vect.h" -- --#ifndef N --#define N 30 --#endif -- --#ifndef IDX --#define IDX 29 --#endif -- --int n_earlyclobbers; -- --typedef void* rtx; --rtx reload_earlyclobbers[N] = {0}; -- --rtx foo = (void*)0xbadf00d; -- --int --__attribute__((noinline, noipa)) --earlyclobber_operand_p (rtx x) --{ -- int i; -- -- for (i = 0; i < n_earlyclobbers; i++) -- if (reload_earlyclobbers[i] == x) -- return 1; -- -- return 0; --} -- --extern void abort (); -- --int main () --{ -- check_vect (); -- -- n_earlyclobbers = IDX; -- if (earlyclobber_operand_p (foo)) -- abort (); -- -- return 0; --} -diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp -index d65953158651..dc8e0bc7c2bd 100644 ---- a/gcc/testsuite/lib/target-supports.exp -+++ b/gcc/testsuite/lib/target-supports.exp -@@ -4060,44 +4060,6 @@ proc check_effective_target_vect_int { } { - }}] - } - --# Return 1 if the target supports vectorization of early breaks, --# 0 otherwise. --# --# This won't change for different subtargets so cache the result. -- --proc check_effective_target_vect_early_break { } { -- return [check_cached_effective_target_indexed vect_early_break { -- expr { -- [istarget aarch64*-*-*] -- || [check_effective_target_sse4] -- }}] --} -- --# Return 1 if the target supports hardware execution of early breaks, --# 0 otherwise. --# --# This won't change for different subtargets so cache the result. -- --proc check_effective_target_vect_early_break_hw { } { -- return [check_cached_effective_target_indexed vect_early_break_hw { -- expr { -- [istarget aarch64*-*-*] -- || [check_sse4_hw_available] -- }}] --} -- --proc add_options_for_vect_early_break { flags } { -- if { ! [check_effective_target_vect_early_break] } { -- return "$flags" -- } -- -- if { [check_effective_target_sse4] } { -- return "$flags -msse4.1" -- } -- -- return "$flags" --} -- - # Return 1 if the target supports hardware vectorization of complex additions of - # byte, 0 otherwise. - # --- -2.43.0 - diff --git a/14.0.0/gentoo/79_all_Revert_AArch64_add_implementation_for_vector_cbranch.patch b/14.0.0/gentoo/79_all_Revert_AArch64_add_implementation_for_vector_cbranch.patch deleted file mode 100644 index 3a6aa30..0000000 --- a/14.0.0/gentoo/79_all_Revert_AArch64_add_implementation_for_vector_cbranch.patch +++ /dev/null @@ -1,320 +0,0 @@ -From 31b1a8e79e86712d87ebe8de201636c8bd83a6be Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:13 +0000 -Subject: [PATCH 5/8] Revert "AArch64: Add implementation for vector cbranch - for Advanced SIMD" - -This reverts commit 1bcc07aeb47c0ed7eb50eac8a4e057d6336669ab. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/config/aarch64/aarch64-simd.md | 42 ------ - .../aarch64/sve/vect-early-break-cbranch.c | 108 --------------- - .../aarch64/vect-early-break-cbranch.c | 124 ------------------ - 3 files changed, 274 deletions(-) - delete mode 100644 gcc/testsuite/gcc.target/aarch64/sve/vect-early-break-cbranch.c - delete mode 100644 gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch.c - -diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md -index 3cd184f46fa9..8aa55c641e1c 100644 ---- a/gcc/config/aarch64/aarch64-simd.md -+++ b/gcc/config/aarch64/aarch64-simd.md -@@ -3885,48 +3885,6 @@ (define_expand "vcond_mask_<mode><v_int_equiv>" - DONE; - }) - --;; Patterns comparing two vectors and conditionally jump -- --(define_expand "cbranch<mode>4" -- [(set (pc) -- (if_then_else -- (match_operator 0 "aarch64_equality_operator" -- [(match_operand:VDQ_I 1 "register_operand") -- (match_operand:VDQ_I 2 "aarch64_simd_reg_or_zero")]) -- (label_ref (match_operand 3 "")) -- (pc)))] -- "TARGET_SIMD" --{ -- auto code = GET_CODE (operands[0]); -- rtx tmp = operands[1]; -- -- /* If comparing against a non-zero vector we have to do a comparison first -- so we can have a != 0 comparison with the result. */ -- if (operands[2] != CONST0_RTX (<MODE>mode)) -- { -- tmp = gen_reg_rtx (<MODE>mode); -- emit_insn (gen_xor<mode>3 (tmp, operands[1], operands[2])); -- } -- -- /* For 64-bit vectors we need no reductions. */ -- if (known_eq (128, GET_MODE_BITSIZE (<MODE>mode))) -- { -- /* Always reduce using a V4SI. */ -- rtx reduc = gen_lowpart (V4SImode, tmp); -- rtx res = gen_reg_rtx (V4SImode); -- emit_insn (gen_aarch64_umaxpv4si (res, reduc, reduc)); -- emit_move_insn (tmp, gen_lowpart (<MODE>mode, res)); -- } -- -- rtx val = gen_reg_rtx (DImode); -- emit_move_insn (val, gen_lowpart (DImode, tmp)); -- -- rtx cc_reg = aarch64_gen_compare_reg (code, val, const0_rtx); -- rtx cmp_rtx = gen_rtx_fmt_ee (code, DImode, cc_reg, const0_rtx); -- emit_jump_insn (gen_condjump (cmp_rtx, cc_reg, operands[3])); -- DONE; --}) -- - ;; Patterns comparing two vectors to produce a mask. - - (define_expand "vec_cmp<mode><mode>" -diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vect-early-break-cbranch.c b/gcc/testsuite/gcc.target/aarch64/sve/vect-early-break-cbranch.c -deleted file mode 100644 -index d15053553f94..000000000000 ---- a/gcc/testsuite/gcc.target/aarch64/sve/vect-early-break-cbranch.c -+++ /dev/null -@@ -1,108 +0,0 @@ --/* { dg-do compile } */ --/* { dg-options "-O3 -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2" } */ --/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */ --#define N 640 --int a[N] = {0}; --int b[N] = {0}; --/* --** f1: --** ... --** cmpgt p[0-9]+.s, p[0-9]+/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any \.L[0-9]+ --** ... --*/ --void f1 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] > 0) -- break; -- } --} --/* --** f2: --** ... --** cmpge p[0-9]+.s, p[0-9]+/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any \.L[0-9]+ --** ... --*/ --void f2 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] >= 0) -- break; -- } --} --/* --** f3: --** ... --** cmpeq p[0-9]+.s, p[0-9]+/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any \.L[0-9]+ --** ... --*/ --void f3 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] == 0) -- break; -- } --} --/* --** f4: --** ... --** cmpne p[0-9]+.s, p[0-9]+/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any \.L[0-9]+ --** ... --*/ --void f4 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] != 0) -- break; -- } --} --/* --** f5: --** ... --** cmplt p[0-9]+.s, p7/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any .L[0-9]+ --** ... --*/ --void f5 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] < 0) -- break; -- } --} --/* --** f6: --** ... --** cmple p[0-9]+.s, p[0-9]+/z, z[0-9]+.s, #0 --** ptest p[0-9]+, p[0-9]+.b --** b.any \.L[0-9]+ --** ... --*/ --void f6 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] <= 0) -- break; -- } --} -diff --git a/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch.c b/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch.c -deleted file mode 100644 -index a5e7b94827dd..000000000000 ---- a/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch.c -+++ /dev/null -@@ -1,124 +0,0 @@ --/* { dg-do compile } */ --/* { dg-options "-O3 -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2" } */ --/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */ -- --#pragma GCC target "+nosve" -- --#define N 640 --int a[N] = {0}; --int b[N] = {0}; -- -- --/* --** f1: --** ... --** cmgt v[0-9]+.4s, v[0-9]+.4s, #0 --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f1 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] > 0) -- break; -- } --} -- --/* --** f2: --** ... --** cmge v[0-9]+.4s, v[0-9]+.4s, #0 --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f2 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] >= 0) -- break; -- } --} -- --/* --** f3: --** ... --** cmeq v[0-9]+.4s, v[0-9]+.4s, #0 --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f3 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] == 0) -- break; -- } --} -- --/* --** f4: --** ... --** cmtst v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f4 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] != 0) -- break; -- } --} -- --/* --** f5: --** ... --** cmlt v[0-9]+.4s, v[0-9]+.4s, #0 --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f5 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] < 0) -- break; -- } --} -- --/* --** f6: --** ... --** cmle v[0-9]+.4s, v[0-9]+.4s, #0 --** umaxp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s --** fmov x[0-9]+, d[0-9]+ --** cbnz x[0-9]+, \.L[0-9]+ --** ... --*/ --void f6 () --{ -- for (int i = 0; i < N; i++) -- { -- b[i] += a[i]; -- if (a[i] <= 0) -- break; -- } --} --- -2.43.0 - diff --git a/14.0.0/gentoo/80_all_Revert_middle-end_support_vectorization_of_loops_with_mult.patch b/14.0.0/gentoo/80_all_Revert_middle-end_support_vectorization_of_loops_with_mult.patch deleted file mode 100644 index ac87127..0000000 --- a/14.0.0/gentoo/80_all_Revert_middle-end_support_vectorization_of_loops_with_mult.patch +++ /dev/null @@ -1,2426 +0,0 @@ -From 884068ec19c846246ab55b4820fd2badca329339 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:14 +0000 -Subject: [PATCH 6/8] Revert "middle-end: Support vectorization of loops with - multiple exits." - -This reverts commit 01f4251b8775c832a92d55e2df57c9ac72eaceef. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/tree-if-conv.cc | 2 +- - gcc/tree-vect-data-refs.cc | 237 ------------------ - gcc/tree-vect-loop-manip.cc | 331 +++++-------------------- - gcc/tree-vect-loop.cc | 482 ++++++++++-------------------------- - gcc/tree-vect-patterns.cc | 167 ++----------- - gcc/tree-vect-stmts.cc | 305 ++--------------------- - gcc/tree-vectorizer.cc | 4 +- - gcc/tree-vectorizer.h | 35 +-- - 8 files changed, 233 insertions(+), 1330 deletions(-) - -diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc -index 8e79362f96ab..bb87db382086 100644 ---- a/gcc/tree-if-conv.cc -+++ b/gcc/tree-if-conv.cc -@@ -844,7 +844,7 @@ idx_within_array_bound (tree ref, tree *idx, void *dta) - - /* Return TRUE if ref is a within bound array reference. */ - --bool -+static bool - ref_within_array_bound (gimple *stmt, tree ref) - { - class loop *loop = loop_containing_stmt (stmt); -diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc -index 752c34c26e9b..290303f198b5 100644 ---- a/gcc/tree-vect-data-refs.cc -+++ b/gcc/tree-vect-data-refs.cc -@@ -613,238 +613,6 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, - return opt_result::success (); - } - --/* Funcion vect_analyze_early_break_dependences. -- -- Examime all the data references in the loop and make sure that if we have -- mulitple exits that we are able to safely move stores such that they become -- safe for vectorization. The function also calculates the place where to move -- the instructions to and computes what the new vUSE chain should be. -- -- This works in tandem with the CFG that will be produced by -- slpeel_tree_duplicate_loop_to_edge_cfg later on. -- -- This function tries to validate whether an early break vectorization -- is possible for the current instruction sequence. Returns True i -- possible, otherwise False. -- -- Requirements: -- - Any memory access must be to a fixed size buffer. -- - There must not be any loads and stores to the same object. -- - Multiple loads are allowed as long as they don't alias. -- -- NOTE: -- This implemementation is very conservative. Any overlappig loads/stores -- that take place before the early break statement gets rejected aside from -- WAR dependencies. -- -- i.e.: -- -- a[i] = 8 -- c = a[i] -- if (b[i]) -- ... -- -- is not allowed, but -- -- c = a[i] -- a[i] = 8 -- if (b[i]) -- ... -- -- is which is the common case. */ -- --static opt_result --vect_analyze_early_break_dependences (loop_vec_info loop_vinfo) --{ -- DUMP_VECT_SCOPE ("vect_analyze_early_break_dependences"); -- -- /* List of all load data references found during traversal. */ -- auto_vec<data_reference *> bases; -- basic_block dest_bb = NULL; -- -- hash_set <gimple *> visited; -- class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); -- class loop *loop_nest = loop_outer (loop); -- -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "loop contains multiple exits, analyzing" -- " statement dependencies.\n"); -- -- for (gimple *c : LOOP_VINFO_LOOP_CONDS (loop_vinfo)) -- { -- stmt_vec_info loop_cond_info = loop_vinfo->lookup_stmt (c); -- if (STMT_VINFO_TYPE (loop_cond_info) != loop_exit_ctrl_vec_info_type) -- continue; -- -- gimple_stmt_iterator gsi = gsi_for_stmt (c); -- -- /* Now analyze all the remaining statements and try to determine which -- instructions are allowed/needed to be moved. */ -- while (!gsi_end_p (gsi)) -- { -- gimple *stmt = gsi_stmt (gsi); -- gsi_prev (&gsi); -- if (!gimple_has_ops (stmt) -- || is_gimple_debug (stmt)) -- continue; -- -- stmt_vec_info stmt_vinfo = loop_vinfo->lookup_stmt (stmt); -- auto dr_ref = STMT_VINFO_DATA_REF (stmt_vinfo); -- if (!dr_ref) -- continue; -- -- /* We currently only support statically allocated objects due to -- not having first-faulting loads support or peeling for -- alignment support. Compute the size of the referenced object -- (it could be dynamically allocated). */ -- tree obj = DR_BASE_ADDRESS (dr_ref); -- if (!obj || TREE_CODE (obj) != ADDR_EXPR) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "early breaks only supported on statically" -- " allocated objects.\n"); -- return opt_result::failure_at (c, -- "can't safely apply code motion to " -- "dependencies of %G to vectorize " -- "the early exit.\n", c); -- } -- -- tree refop = TREE_OPERAND (obj, 0); -- tree refbase = get_base_address (refop); -- if (!refbase || !DECL_P (refbase) || !DECL_SIZE (refbase) -- || TREE_CODE (DECL_SIZE (refbase)) != INTEGER_CST) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "early breaks only supported on" -- " statically allocated objects.\n"); -- return opt_result::failure_at (c, -- "can't safely apply code motion to " -- "dependencies of %G to vectorize " -- "the early exit.\n", c); -- } -- -- /* Check if vector accesses to the object will be within bounds. -- must be a constant or assume loop will be versioned or niters -- bounded by VF so accesses are within range. */ -- if (!ref_within_array_bound (stmt, DR_REF (dr_ref))) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "early breaks not supported: vectorization " -- "would %s beyond size of obj.", -- DR_IS_READ (dr_ref) ? "read" : "write"); -- return opt_result::failure_at (c, -- "can't safely apply code motion to " -- "dependencies of %G to vectorize " -- "the early exit.\n", c); -- } -- -- if (DR_IS_READ (dr_ref)) -- bases.safe_push (dr_ref); -- else if (DR_IS_WRITE (dr_ref)) -- { -- /* We are moving writes down in the CFG. To be sure that this -- is valid after vectorization we have to check all the loads -- we are sinking the stores past to see if any of them may -- alias or are the same object. -- -- Same objects will not be an issue because unless the store -- is marked volatile the value can be forwarded. If the -- store is marked volatile we don't vectorize the loop -- anyway. -- -- That leaves the check for aliasing. We don't really need -- to care about the stores aliasing with each other since the -- stores are moved in order so the effects are still observed -- correctly. This leaves the check for WAR dependencies -- which we would be introducing here if the DR can alias. -- The check is quadratic in loads/stores but I have not found -- a better API to do this. I believe all loads and stores -- must be checked. We also must check them when we -- encountered the store, since we don't care about loads past -- the store. */ -- -- for (auto dr_read : bases) -- if (dr_may_alias_p (dr_ref, dr_read, loop_nest)) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, -- vect_location, -- "early breaks not supported: " -- "overlapping loads and stores " -- "found before the break " -- "statement.\n"); -- -- return opt_result::failure_at (stmt, -- "can't safely apply code motion to dependencies" -- " to vectorize the early exit. %G may alias with" -- " %G\n", stmt, dr_read->stmt); -- } -- } -- -- if (gimple_vdef (stmt)) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "==> recording stmt %G", stmt); -- -- LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo).safe_push (stmt); -- } -- else if (gimple_vuse (stmt)) -- { -- LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo).safe_insert (0, stmt); -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "marked statement for vUSE update: %G", stmt); -- } -- } -- -- /* Save destination as we go, BB are visited in order and the last one -- is where statements should be moved to. */ -- if (!dest_bb) -- dest_bb = gimple_bb (c); -- else -- { -- basic_block curr_bb = gimple_bb (c); -- if (dominated_by_p (CDI_DOMINATORS, curr_bb, dest_bb)) -- dest_bb = curr_bb; -- } -- } -- -- basic_block dest_bb0 = EDGE_SUCC (dest_bb, 0)->dest; -- basic_block dest_bb1 = EDGE_SUCC (dest_bb, 1)->dest; -- dest_bb = flow_bb_inside_loop_p (loop, dest_bb0) ? dest_bb0 : dest_bb1; -- /* We don't allow outer -> inner loop transitions which should have been -- trapped already during loop form analysis. */ -- gcc_assert (dest_bb->loop_father == loop); -- -- gcc_assert (dest_bb); -- LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo) = dest_bb; -- -- if (!LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo).is_empty ()) -- { -- /* All uses shall be updated to that of the first load. Entries are -- stored in reverse order. */ -- tree vuse = gimple_vuse (LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo).last ()); -- for (auto g : LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo)) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "will update use: %T, mem_ref: %G", vuse, g); -- } -- } -- -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "recorded statements to be moved to BB %d\n", -- LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo)->index); -- -- return opt_result::success (); --} -- - /* Function vect_analyze_data_ref_dependences. - - Examine all the data references in the loop, and make sure there do not -@@ -889,11 +657,6 @@ vect_analyze_data_ref_dependences (loop_vec_info loop_vinfo, - return res; - } - -- /* If we have early break statements in the loop, check to see if they -- are of a form we can vectorizer. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- return vect_analyze_early_break_dependences (loop_vinfo); -- - return opt_result::success (); - } - -diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc -index 9330183bfb9e..9182192710eb 100644 ---- a/gcc/tree-vect-loop-manip.cc -+++ b/gcc/tree-vect-loop-manip.cc -@@ -448,20 +448,6 @@ vect_adjust_loop_lens_control (tree iv_type, gimple_seq *seq, - } - } - --/* Stores the standard position for induction variable increment in belonging to -- LOOP_EXIT (just before the exit condition of the given exit to BSI. -- INSERT_AFTER is set to true if the increment should be inserted after -- *BSI. */ -- --void --vect_iv_increment_position (edge loop_exit, gimple_stmt_iterator *bsi, -- bool *insert_after) --{ -- basic_block bb = loop_exit->src; -- *bsi = gsi_last_bb (bb); -- *insert_after = false; --} -- - /* Helper for vect_set_loop_condition_partial_vectors. Generate definitions - for all the rgroup controls in RGC and return a control that is nonzero - when the loop needs to iterate. Add any new preheader statements to -@@ -545,8 +531,7 @@ vect_set_loop_controls_directly (class loop *loop, loop_vec_info loop_vinfo, - tree index_before_incr, index_after_incr; - gimple_stmt_iterator incr_gsi; - bool insert_after; -- edge exit_e = LOOP_VINFO_IV_EXIT (loop_vinfo); -- vect_iv_increment_position (exit_e, &incr_gsi, &insert_after); -+ standard_iv_increment_position (loop, &incr_gsi, &insert_after); - if (LOOP_VINFO_USING_DECREMENTING_IV_P (loop_vinfo)) - { - /* Create an IV that counts down from niters_total and whose step -@@ -951,18 +936,7 @@ vect_set_loop_condition_partial_vectors (class loop *loop, edge exit_edge, - - if (final_iv) - { -- gassign *assign; -- /* If vectorizing an inverted early break loop we have to restart the -- scalar loop at niters - vf. This matches what we do in -- vect_gen_vector_loop_niters_mult_vf for non-masked loops. */ -- if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) -- { -- tree ftype = TREE_TYPE (orig_niters); -- tree vf = build_int_cst (ftype, LOOP_VINFO_VECT_FACTOR (loop_vinfo)); -- assign = gimple_build_assign (final_iv, MINUS_EXPR, orig_niters, vf); -- } -- else -- assign = gimple_build_assign (final_iv, orig_niters); -+ gassign *assign = gimple_build_assign (final_iv, orig_niters); - gsi_insert_on_edge_immediate (exit_edge, assign); - } - -@@ -1043,7 +1017,7 @@ vect_set_loop_condition_partial_vectors_avx512 (class loop *loop, - tree index_before_incr, index_after_incr; - gimple_stmt_iterator incr_gsi; - bool insert_after; -- vect_iv_increment_position (exit_edge, &incr_gsi, &insert_after); -+ standard_iv_increment_position (loop, &incr_gsi, &insert_after); - create_iv (niters_adj, MINUS_EXPR, iv_step, NULL_TREE, loop, - &incr_gsi, insert_after, &index_before_incr, - &index_after_incr); -@@ -1199,19 +1173,8 @@ vect_set_loop_condition_partial_vectors_avx512 (class loop *loop, - - if (final_iv) - { -- gassign *assign; -- /* If vectorizing an inverted early break loop we have to restart the -- scalar loop at niters - vf. This matches what we do in -- vect_gen_vector_loop_niters_mult_vf for non-masked loops. */ -- if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) -- { -- tree ftype = TREE_TYPE (orig_niters); -- tree vf = build_int_cst (ftype, LOOP_VINFO_VECT_FACTOR (loop_vinfo)); -- assign = gimple_build_assign (final_iv, MINUS_EXPR, orig_niters, vf); -- } -- else -- assign = gimple_build_assign (final_iv, orig_niters); -- gsi_insert_on_edge_immediate (exit_edge, assign); -+ gassign *assign = gimple_build_assign (final_iv, orig_niters); -+ gsi_insert_on_edge_immediate (single_exit (loop), assign); - } - - return cond_stmt; -@@ -1315,7 +1278,7 @@ vect_set_loop_condition_normal (loop_vec_info /* loop_vinfo */, edge exit_edge, - } - } - -- vect_iv_increment_position (exit_edge, &incr_gsi, &insert_after); -+ standard_iv_increment_position (loop, &incr_gsi, &insert_after); - create_iv (init, PLUS_EXPR, step, NULL_TREE, loop, - &incr_gsi, insert_after, &indx_before_incr, &indx_after_incr); - indx_after_incr = force_gimple_operand_gsi (&loop_cond_gsi, indx_after_incr, -@@ -1440,16 +1403,13 @@ vect_set_loop_condition (class loop *loop, edge loop_e, loop_vec_info loop_vinfo - copies remains the same. - - If UPDATED_DOMS is not NULL it is update with the list of basic blocks whoms -- dominators were updated during the peeling. When doing early break vectorization -- then LOOP_VINFO needs to be provided and is used to keep track of any newly created -- memory references that need to be updated should we decide to vectorize. */ -+ dominators were updated during the peeling. */ - - class loop * - slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - class loop *scalar_loop, - edge scalar_exit, edge e, edge *new_e, -- bool flow_loops, -- vec<basic_block> *updated_doms) -+ bool flow_loops) - { - class loop *new_loop; - basic_block *new_bbs, *bbs, *pbbs; -@@ -1566,9 +1526,7 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - } - - auto loop_exits = get_loop_exit_edges (loop); -- bool multiple_exits_p = loop_exits.length () > 1; - auto_vec<basic_block> doms; -- class loop *update_loop = NULL; - - if (at_exit) /* Add the loop copy at exit. */ - { -@@ -1578,65 +1536,39 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - flush_pending_stmts (new_exit); - } - -- bool multiple_exits_p = loop_exits.length () > 1; -- basic_block main_loop_exit_block = new_preheader; -- basic_block alt_loop_exit_block = NULL; -- /* Create intermediate edge for main exit. But only useful for early -- exits. */ -- if (multiple_exits_p) -- { -- edge loop_e = single_succ_edge (new_preheader); -- new_preheader = split_edge (loop_e); -- } -- - auto_vec <gimple *> new_phis; - hash_map <tree, tree> new_phi_args; - /* First create the empty phi nodes so that when we flush the - statements they can be filled in. However because there is no order - between the PHI nodes in the exits and the loop headers we need to - order them base on the order of the two headers. First record the new -- phi nodes. Then redirect the edges and flush the changes. This writes -- out the new SSA names. */ -- for (auto gsi_from = gsi_start_phis (loop_exit->dest); -+ phi nodes. */ -+ for (auto gsi_from = gsi_start_phis (scalar_exit->dest); - !gsi_end_p (gsi_from); gsi_next (&gsi_from)) - { - gimple *from_phi = gsi_stmt (gsi_from); - tree new_res = copy_ssa_name (gimple_phi_result (from_phi)); -- gphi *res = create_phi_node (new_res, main_loop_exit_block); -+ gphi *res = create_phi_node (new_res, new_preheader); - new_phis.safe_push (res); - } - -- for (auto exit : loop_exits) -+ /* Then redirect the edges and flush the changes. This writes out the new -+ SSA names. */ -+ for (edge exit : loop_exits) - { -- basic_block dest = main_loop_exit_block; -- if (exit != loop_exit) -- { -- if (!alt_loop_exit_block) -- { -- alt_loop_exit_block = split_edge (exit); -- edge res = redirect_edge_and_branch ( -- single_succ_edge (alt_loop_exit_block), -- new_preheader); -- flush_pending_stmts (res); -- continue; -- } -- dest = alt_loop_exit_block; -- } -- edge e = redirect_edge_and_branch (exit, dest); -- flush_pending_stmts (e); -+ edge temp_e = redirect_edge_and_branch (exit, new_preheader); -+ flush_pending_stmts (temp_e); - } -- - /* Record the new SSA names in the cache so that we can skip materializing - them again when we fill in the rest of the LCSSA variables. */ - for (auto phi : new_phis) - { -- tree new_arg = gimple_phi_arg (phi, loop_exit->dest_idx)->def; -+ tree new_arg = gimple_phi_arg (phi, 0)->def; - - if (!SSA_VAR_P (new_arg)) - continue; -- - /* If the PHI MEM node dominates the loop then we shouldn't create -- a new LC-SSSA PHI for it in the intermediate block. */ -+ a new LC-SSSA PHI for it in the intermediate block. */ - /* A MEM phi that consitutes a new DEF for the vUSE chain can either - be a .VDEF or a PHI that operates on MEM. And said definition - must not be inside the main loop. Or we must be a parameter. -@@ -1652,9 +1584,6 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - remove_phi_node (&gsi, true); - continue; - } -- -- /* If we decide to remove the PHI node we should also not -- rematerialize it later on. */ - new_phi_args.put (new_arg, gimple_phi_result (phi)); - - if (TREE_CODE (new_arg) != SSA_NAME) -@@ -1666,77 +1595,34 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - preheader block and still find the right LC nodes. */ - edge loop_entry = single_succ_edge (new_preheader); - if (flow_loops) -- { -- bool peeled_iters = single_pred (loop->latch) != loop_exit->src; -- /* Link through the main exit first. */ -- for (auto gsi_from = gsi_start_phis (loop->header), -- gsi_to = gsi_start_phis (new_loop->header); -- !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); -- gsi_next (&gsi_from), gsi_next (&gsi_to)) -- { -- gimple *from_phi = gsi_stmt (gsi_from); -- gimple *to_phi = gsi_stmt (gsi_to); -- tree new_arg = PHI_ARG_DEF_FROM_EDGE (from_phi, -- loop_latch_edge (loop)); -- -- /* Check if we've already created a new phi node during edge -- redirection. If we have, only propagate the value -- downwards. */ -- if (tree *res = new_phi_args.get (new_arg)) -- { -- if (multiple_exits_p) -- new_arg = *res; -- else -- { -- adjust_phi_and_debug_stmts (to_phi, loop_entry, *res); -- continue; -- } -- } -- /* If we have multiple exits and the vector loop is peeled then we -- need to use the value at start of loop. */ -- if (peeled_iters) -- { -- tree tmp_arg = gimple_phi_result (from_phi); -- if (!new_phi_args.get (tmp_arg)) -- new_arg = tmp_arg; -- } -- -- tree new_res = copy_ssa_name (gimple_phi_result (from_phi)); -- gphi *lcssa_phi = create_phi_node (new_res, new_preheader); -+ for (auto gsi_from = gsi_start_phis (loop->header), -+ gsi_to = gsi_start_phis (new_loop->header); -+ !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); -+ gsi_next (&gsi_from), gsi_next (&gsi_to)) -+ { -+ gimple *from_phi = gsi_stmt (gsi_from); -+ gimple *to_phi = gsi_stmt (gsi_to); -+ tree new_arg = PHI_ARG_DEF_FROM_EDGE (from_phi, -+ loop_latch_edge (loop)); - -- /* Otherwise, main loop exit should use the final iter value. */ -- SET_PHI_ARG_DEF (lcssa_phi, loop_exit->dest_idx, new_arg); -+ /* Check if we've already created a new phi node during edge -+ redirection. If we have, only propagate the value downwards. */ -+ if (tree *res = new_phi_args.get (new_arg)) -+ { -+ adjust_phi_and_debug_stmts (to_phi, loop_entry, *res); -+ continue; -+ } - -- adjust_phi_and_debug_stmts (to_phi, loop_entry, new_res); -- } -+ tree new_res = copy_ssa_name (gimple_phi_result (from_phi)); -+ gphi *lcssa_phi = create_phi_node (new_res, new_preheader); - -- set_immediate_dominator (CDI_DOMINATORS, main_loop_exit_block, -- loop_exit->src); -+ /* Main loop exit should use the final iter value. */ -+ add_phi_arg (lcssa_phi, new_arg, loop_exit, UNKNOWN_LOCATION); - -- /* Now link the alternative exits. */ -- if (multiple_exits_p) -- { -- set_immediate_dominator (CDI_DOMINATORS, new_preheader, -- main_loop_exit_block); -- for (auto gsi_from = gsi_start_phis (loop->header), -- gsi_to = gsi_start_phis (new_preheader); -- !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); -- gsi_next (&gsi_from), gsi_next (&gsi_to)) -- { -- gimple *from_phi = gsi_stmt (gsi_from); -- gimple *to_phi = gsi_stmt (gsi_to); -- -- tree alt_arg = gimple_phi_result (from_phi); -- edge main_e = single_succ_edge (alt_loop_exit_block); -- for (edge e : loop_exits) -- if (e != loop_exit) -- SET_PHI_ARG_DEF (to_phi, main_e->dest_idx, alt_arg); -- } -+ adjust_phi_and_debug_stmts (to_phi, loop_entry, new_res); -+ } - -- set_immediate_dominator (CDI_DOMINATORS, new_preheader, -- loop->header); -- } -- } -+ set_immediate_dominator (CDI_DOMINATORS, new_preheader, e->src); - - if (was_imm_dom || duplicate_outer_loop) - set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_exit->src); -@@ -1748,21 +1634,6 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - delete_basic_block (preheader); - set_immediate_dominator (CDI_DOMINATORS, scalar_loop->header, - loop_preheader_edge (scalar_loop)->src); -- -- /* Finally after wiring the new epilogue we need to update its main exit -- to the original function exit we recorded. Other exits are already -- correct. */ -- if (multiple_exits_p) -- { -- update_loop = new_loop; -- for (edge e : get_loop_exit_edges (loop)) -- doms.safe_push (e->dest); -- doms.safe_push (exit_dest); -- -- /* Likely a fall-through edge, so update if needed. */ -- if (single_succ_p (exit_dest)) -- doms.safe_push (single_succ (exit_dest)); -- } - } - else /* Add the copy at entry. */ - { -@@ -1810,34 +1681,6 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, - delete_basic_block (new_preheader); - set_immediate_dominator (CDI_DOMINATORS, new_loop->header, - loop_preheader_edge (new_loop)->src); -- -- if (multiple_exits_p) -- update_loop = loop; -- } -- -- if (multiple_exits_p) -- { -- for (edge e : get_loop_exit_edges (update_loop)) -- { -- edge ex; -- edge_iterator ei; -- FOR_EACH_EDGE (ex, ei, e->dest->succs) -- { -- /* Find the first non-fallthrough block as fall-throughs can't -- dominate other blocks. */ -- if (single_succ_p (ex->dest)) -- { -- doms.safe_push (ex->dest); -- ex = single_succ_edge (ex->dest); -- } -- doms.safe_push (ex->dest); -- } -- doms.safe_push (e->dest); -- } -- -- iterate_fix_dominators (CDI_DOMINATORS, doms, false); -- if (updated_doms) -- updated_doms->safe_splice (doms); - } - - free (new_bbs); -@@ -1912,10 +1755,12 @@ slpeel_can_duplicate_loop_p (const class loop *loop, const_edge exit_e, - edge entry_e = loop_preheader_edge (loop); - gcond *orig_cond = get_loop_exit_condition (exit_e); - gimple_stmt_iterator loop_exit_gsi = gsi_last_bb (exit_e->src); -+ unsigned int num_bb = loop->inner? 5 : 2; - - /* All loops have an outer scope; the only case loop->outer is NULL is for - the function itself. */ - if (!loop_outer (loop) -+ || loop->num_nodes != num_bb - || !empty_block_p (loop->latch) - || !exit_e - /* Verify that new loop exit condition can be trivially modified. */ -@@ -2204,8 +2049,12 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, - gphi_iterator gsi, gsi1; - class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); - basic_block update_bb = update_e->dest; -+ - basic_block exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; -- gimple_stmt_iterator last_gsi = gsi_last_bb (exit_bb); -+ -+ /* Make sure there exists a single-predecessor exit bb: */ -+ gcc_assert (single_pred_p (exit_bb)); -+ gcc_assert (single_succ_edge (exit_bb) == update_e); - - for (gsi = gsi_start_phis (loop->header), gsi1 = gsi_start_phis (update_bb); - !gsi_end_p (gsi) && !gsi_end_p (gsi1); -@@ -2215,6 +2064,7 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, - tree step_expr, off; - tree type; - tree var, ni, ni_name; -+ gimple_stmt_iterator last_gsi; - - gphi *phi = gsi.phi (); - gphi *phi1 = gsi1.phi (); -@@ -2250,8 +2100,7 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, - { - tree stype = TREE_TYPE (step_expr); - off = fold_build2 (MULT_EXPR, stype, -- fold_convert (stype, niters), step_expr); -- -+ fold_convert (stype, niters), step_expr); - if (POINTER_TYPE_P (type)) - ni = fold_build_pointer_plus (init_expr, off); - else -@@ -2270,9 +2119,9 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, - - var = create_tmp_var (type, "tmp"); - -+ last_gsi = gsi_last_bb (exit_bb); - gimple_seq new_stmts = NULL; - ni_name = force_gimple_operand (ni, &new_stmts, false, var); -- - /* Exit_bb shouldn't be empty. */ - if (!gsi_end_p (last_gsi)) - { -@@ -2770,19 +2619,11 @@ vect_gen_vector_loop_niters_mult_vf (loop_vec_info loop_vinfo, - int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo).to_constant (); - tree type = TREE_TYPE (niters_vector); - tree log_vf = build_int_cst (type, exact_log2 (vf)); -- tree tree_vf = build_int_cst (type, vf); - basic_block exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; - - gcc_assert (niters_vector_mult_vf_ptr != NULL); - tree niters_vector_mult_vf = fold_build2 (LSHIFT_EXPR, type, - niters_vector, log_vf); -- -- /* If we've peeled a vector iteration then subtract one full vector -- iteration. */ -- if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) -- niters_vector_mult_vf = fold_build2 (MINUS_EXPR, type, -- niters_vector_mult_vf, tree_vf); -- - if (!is_gimple_val (niters_vector_mult_vf)) - { - tree var = create_tmp_var (type, "niters_vector_mult_vf"); -@@ -3023,12 +2864,6 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - bound_epilog += vf - 1; - if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)) - bound_epilog += 1; -- -- /* For early breaks the scalar loop needs to execute at most VF times -- to find the element that caused the break. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- bound_epilog = vf; -- - bool epilog_peeling = maybe_ne (bound_epilog, 0U); - poly_uint64 bound_scalar = bound_epilog; - -@@ -3163,17 +2998,14 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - bound_prolog + bound_epilog) - : (!LOOP_REQUIRES_VERSIONING (loop_vinfo) - || vect_epilogues)); -- - /* Epilog loop must be executed if the number of iterations for epilog - loop is known at compile time, otherwise we need to add a check at - the end of vector loop and skip to the end of epilog loop. */ - bool skip_epilog = (prolog_peeling < 0 - || !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) - || !vf.is_constant ()); -- /* PEELING_FOR_GAPS and peeling for early breaks are special because epilog -- loop must be executed. */ -- if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) -- || LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -+ /* PEELING_FOR_GAPS is special because epilog loop must be executed. */ -+ if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)) - skip_epilog = false; - - class loop *scalar_loop = LOOP_VINFO_SCALAR_LOOP (loop_vinfo); -@@ -3302,14 +3134,11 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - epilog = vect_epilogues ? get_loop_copy (loop) : scalar_loop; - edge epilog_e = vect_epilogues ? e : scalar_e; - edge new_epilog_e = NULL; -- auto_vec<basic_block> doms; -- epilog -- = slpeel_tree_duplicate_loop_to_edge_cfg (loop, e, epilog, epilog_e, e, -- &new_epilog_e, true, &doms); -- -+ epilog = slpeel_tree_duplicate_loop_to_edge_cfg (loop, e, epilog, -+ epilog_e, e, -+ &new_epilog_e); - LOOP_VINFO_EPILOGUE_IV_EXIT (loop_vinfo) = new_epilog_e; - gcc_assert (epilog); -- gcc_assert (new_epilog_e); - epilog->force_vectorize = false; - bb_before_epilog = loop_preheader_edge (epilog)->src; - -@@ -3360,11 +3189,10 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - - /* Only need to handle basic block before epilog loop if it's not - the guard_bb, which is the case when skip_vector is true. */ -- if (guard_bb != bb_before_epilog && single_pred_p (bb_before_epilog)) -+ if (guard_bb != bb_before_epilog) - bb_before_epilog->count = single_pred_edge (bb_before_epilog)->count (); - bb_before_epilog = loop_preheader_edge (epilog)->src; - } -- - /* If loop is peeled for non-zero constant times, now niters refers to - orig_niters - prolog_peeling, it won't overflow even the orig_niters - overflows. */ -@@ -3388,22 +3216,13 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - niters_vector_mult_vf steps. */ - gcc_checking_assert (vect_can_advance_ivs_p (loop_vinfo)); - update_e = skip_vector ? e : loop_preheader_edge (epilog); -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- update_e = single_succ_edge (LOOP_VINFO_IV_EXIT (loop_vinfo)->dest); -- -- /* If we have a peeled vector iteration, all exits are the same, leave it -- and so the main exit needs to be treated the same as the alternative -- exits in that we leave their updates to vectorizable_live_operations. -- */ -- if (!LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) -- vect_update_ivs_after_vectorizer (loop_vinfo, niters_vector_mult_vf, -- update_e); -- -- if (skip_epilog || LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -+ vect_update_ivs_after_vectorizer (loop_vinfo, niters_vector_mult_vf, -+ update_e); -+ -+ if (skip_epilog) - { - guard_cond = fold_build2 (EQ_EXPR, boolean_type_node, - niters, niters_vector_mult_vf); -- - guard_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; - edge epilog_e = LOOP_VINFO_EPILOGUE_IV_EXIT (loop_vinfo); - guard_to = epilog_e->dest; -@@ -3411,7 +3230,6 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - skip_vector ? anchor : guard_bb, - prob_epilog.invert (), - irred_flag); -- doms.safe_push (guard_to); - if (vect_epilogues) - epilogue_vinfo->skip_this_loop_edge = guard_e; - edge main_iv = LOOP_VINFO_IV_EXIT (loop_vinfo); -@@ -3450,20 +3268,10 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, - scale_loop_profile (epilog, prob_epilog, -1); - } - -- /* Recalculate the dominators after adding the guard edge. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- iterate_fix_dominators (CDI_DOMINATORS, doms, false); -- - unsigned HOST_WIDE_INT bound; - if (bound_scalar.is_constant (&bound)) - { - gcc_assert (bound != 0); -- /* Adjust the upper bound by the extra peeled vector iteration if we -- are an epilogue of an peeled vect loop and not VLA. For VLA the -- loop bounds are unknown. */ -- if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo) -- && vf.is_constant ()) -- bound += vf.to_constant (); - /* -1 to convert loop iterations to latch iterations. */ - record_niter_bound (epilog, bound - 1, false, true); - scale_loop_profile (epilog, profile_probability::always (), -@@ -4082,23 +3890,12 @@ vect_loop_versioning (loop_vec_info loop_vinfo, - If loop versioning wasn't done from loop, but scalar_loop instead, - merge_bb will have already just a single successor. */ - -- /* When the loop has multiple exits then we can only version itself. -- This is denoted by loop_to_version == loop. In this case we can -- do the versioning by selecting the exit edge the vectorizer is -- currently using. */ -- edge exit_edge; -- if (loop_to_version == loop) -- exit_edge = LOOP_VINFO_IV_EXIT (loop_vinfo); -- else -- exit_edge = single_exit (loop_to_version); -- -- gcc_assert (exit_edge); -- merge_bb = exit_edge->dest; -+ merge_bb = single_exit (loop_to_version)->dest; - if (EDGE_COUNT (merge_bb->preds) >= 2) - { - gcc_assert (EDGE_COUNT (merge_bb->preds) >= 2); -- new_exit_bb = split_edge (exit_edge); -- new_exit_e = exit_edge; -+ new_exit_bb = split_edge (single_exit (loop_to_version)); -+ new_exit_e = single_exit (loop_to_version); - e = EDGE_SUCC (new_exit_bb, 0); - - for (gsi = gsi_start_phis (merge_bb); !gsi_end_p (gsi); -diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc -index 2bd96b56006a..5d5f57561741 100644 ---- a/gcc/tree-vect-loop.cc -+++ b/gcc/tree-vect-loop.cc -@@ -1040,7 +1040,6 @@ _loop_vec_info::_loop_vec_info (class loop *loop_in, vec_info_shared *shared) - partial_load_store_bias (0), - peeling_for_gaps (false), - peeling_for_niter (false), -- early_breaks (false), - no_data_dependencies (false), - has_mask_store (false), - scalar_loop_scaling (profile_probability::uninitialized ()), -@@ -1695,12 +1694,12 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo) - loop_vinfo->scalar_costs->finish_cost (nullptr); - } - -+ - /* Function vect_analyze_loop_form. - - Verify that certain CFG restrictions hold, including: - - the loop has a pre-header -- - the loop has a single entry -- - nested loops can have only a single exit. -+ - the loop has a single entry and exit - - the loop exit condition is simple enough - - the number of iterations can be analyzed, i.e, a countable loop. The - niter could be analyzed under some assumptions. */ -@@ -1722,17 +1721,6 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info) - "using as main loop exit: %d -> %d [AUX: %p]\n", - exit_e->src->index, exit_e->dest->index, exit_e->aux); - -- /* Check if we have any control flow that doesn't leave the loop. */ -- class loop *v_loop = loop->inner ? loop->inner : loop; -- basic_block *bbs= get_loop_body (v_loop); -- for (unsigned i = 0; i < v_loop->num_nodes; i++) -- if (EDGE_COUNT (bbs[i]->succs) != 1 -- && (EDGE_COUNT (bbs[i]->succs) != 2 -- || !loop_exits_from_bb_p (bbs[i]->loop_father, bbs[i]))) -- return opt_result::failure_at (vect_location, -- "not vectorized:" -- " unsupported control flow in loop.\n"); -- - /* Different restrictions apply when we are considering an inner-most loop, - vs. an outer (nested) loop. - (FORNOW. May want to relax some of these restrictions in the future). */ -@@ -1752,6 +1740,11 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info) - | - (exit-bb) */ - -+ if (loop->num_nodes != 2) -+ return opt_result::failure_at (vect_location, -+ "not vectorized:" -+ " control flow in loop.\n"); -+ - if (empty_block_p (loop->header)) - return opt_result::failure_at (vect_location, - "not vectorized: empty loop.\n"); -@@ -1783,6 +1776,11 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info) - "not vectorized:" - " multiple nested loops.\n"); - -+ if (loop->num_nodes != 5) -+ return opt_result::failure_at (vect_location, -+ "not vectorized:" -+ " control flow in loop.\n"); -+ - entryedge = loop_preheader_edge (innerloop); - if (entryedge->src != loop->header - || !single_exit (innerloop) -@@ -1819,6 +1817,9 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info) - info->inner_loop_cond = inner.conds[0]; - } - -+ if (!single_exit (loop)) -+ return opt_result::failure_at (vect_location, -+ "not vectorized: multiple exits.\n"); - if (EDGE_COUNT (loop->header->preds) != 2) - return opt_result::failure_at (vect_location, - "not vectorized:" -@@ -1834,14 +1835,10 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info) - "not vectorized: latch block not empty.\n"); - - /* Make sure the exit is not abnormal. */ -- auto_vec<edge> exits = get_loop_exit_edges (loop); -- for (edge e : exits) -- { -- if (e->flags & EDGE_ABNORMAL) -- return opt_result::failure_at (vect_location, -- "not vectorized:" -- " abnormal loop exit edge.\n"); -- } -+ if (exit_e->flags & EDGE_ABNORMAL) -+ return opt_result::failure_at (vect_location, -+ "not vectorized:" -+ " abnormal loop exit edge.\n"); - - info->conds - = vect_get_loop_niters (loop, exit_e, &info->assumptions, -@@ -1909,8 +1906,6 @@ vect_create_loop_vinfo (class loop *loop, vec_info_shared *shared, - { - stmt_vec_info loop_cond_info = loop_vinfo->lookup_stmt (cond); - STMT_VINFO_TYPE (loop_cond_info) = loop_exit_ctrl_vec_info_type; -- /* Mark the statement as a condition. */ -- STMT_VINFO_DEF_TYPE (loop_cond_info) = vect_condition_def; - } - - for (unsigned i = 1; i < info->conds.length (); i ++) -@@ -1919,10 +1914,6 @@ vect_create_loop_vinfo (class loop *loop, vec_info_shared *shared, - - LOOP_VINFO_IV_EXIT (loop_vinfo) = info->loop_exit; - -- /* Check to see if we're vectorizing multiple exits. */ -- LOOP_VINFO_EARLY_BREAKS (loop_vinfo) -- = !LOOP_VINFO_LOOP_CONDS (loop_vinfo).is_empty (); -- - if (info->inner_loop_cond) - { - stmt_vec_info inner_loop_cond_info -@@ -3176,8 +3167,7 @@ start_over: - - /* If an epilogue loop is required make sure we can create one. */ - if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) -- || LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo) -- || LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -+ || LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_NOTE, vect_location, "epilog loop required\n"); -@@ -3687,9 +3677,6 @@ vect_analyze_loop (class loop *loop, vec_info_shared *shared) - && loop->inner == NULL - && param_vect_epilogues_nomask - && LOOP_VINFO_PEELING_FOR_NITER (first_loop_vinfo) -- /* No code motion support for multiple epilogues so for now -- not supported when multiple exits. */ -- && !LOOP_VINFO_EARLY_BREAKS (first_loop_vinfo) - && !loop->simduid); - if (!vect_epilogues) - return first_loop_vinfo; -@@ -5870,34 +5857,6 @@ vect_create_partial_epilog (tree vec_def, tree vectype, code_helper code, - return new_temp; - } - --/* Retrieves the definining statement to be used for a reduction. -- For MAIN_EXIT_P we use the current VEC_STMTs and otherwise we look at -- the reduction definitions. */ -- --tree --vect_get_vect_def (stmt_vec_info reduc_info, slp_tree slp_node, -- slp_instance slp_node_instance, bool main_exit_p, unsigned i, -- vec <gimple *> &vec_stmts) --{ -- tree def; -- -- if (slp_node) -- { -- if (!main_exit_p) -- slp_node = slp_node_instance->reduc_phis; -- def = vect_get_slp_vect_def (slp_node, i); -- } -- else -- { -- if (!main_exit_p) -- reduc_info = STMT_VINFO_REDUC_DEF (vect_orig_stmt (reduc_info)); -- vec_stmts = STMT_VINFO_VEC_STMTS (reduc_info); -- def = gimple_get_lhs (vec_stmts[0]); -- } -- -- return def; --} -- - /* Function vect_create_epilog_for_reduction - - Create code at the loop-epilog to finalize the result of a reduction -@@ -5909,8 +5868,6 @@ vect_get_vect_def (stmt_vec_info reduc_info, slp_tree slp_node, - SLP_NODE_INSTANCE is the SLP node instance containing SLP_NODE - REDUC_INDEX says which rhs operand of the STMT_INFO is the reduction phi - (counting from 0) -- LOOP_EXIT is the edge to update in the merge block. In the case of a single -- exit this edge is always the main loop exit. - - This function: - 1. Completes the reduction def-use cycles. -@@ -5951,8 +5908,7 @@ static void - vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, - stmt_vec_info stmt_info, - slp_tree slp_node, -- slp_instance slp_node_instance, -- edge loop_exit) -+ slp_instance slp_node_instance) - { - stmt_vec_info reduc_info = info_for_reduction (loop_vinfo, stmt_info); - gcc_assert (reduc_info->is_reduc_info); -@@ -5961,7 +5917,6 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, - loop-closed PHI of the inner loop which we remember as - def for the reduction PHI generation. */ - bool double_reduc = false; -- bool main_exit_p = LOOP_VINFO_IV_EXIT (loop_vinfo) == loop_exit; - stmt_vec_info rdef_info = stmt_info; - if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_double_reduction_def) - { -@@ -6124,7 +6079,7 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, - /* Create an induction variable. */ - gimple_stmt_iterator incr_gsi; - bool insert_after; -- vect_iv_increment_position (loop_exit, &incr_gsi, &insert_after); -+ standard_iv_increment_position (loop, &incr_gsi, &insert_after); - create_iv (series_vect, PLUS_EXPR, vec_step, NULL_TREE, loop, &incr_gsi, - insert_after, &indx_before_incr, &indx_after_incr); - -@@ -6203,23 +6158,23 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, - Store them in NEW_PHIS. */ - if (double_reduc) - loop = outer_loop; -- /* We need to reduce values in all exits. */ -- exit_bb = loop_exit->dest; -+ exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; - exit_gsi = gsi_after_labels (exit_bb); - reduc_inputs.create (slp_node ? vec_num : ncopies); -- vec <gimple *> vec_stmts; - for (unsigned i = 0; i < vec_num; i++) - { - gimple_seq stmts = NULL; -- def = vect_get_vect_def (rdef_info, slp_node, slp_node_instance, -- main_exit_p, i, vec_stmts); -+ if (slp_node) -+ def = vect_get_slp_vect_def (slp_node, i); -+ else -+ def = gimple_get_lhs (STMT_VINFO_VEC_STMTS (rdef_info)[0]); - for (j = 0; j < ncopies; j++) - { - tree new_def = copy_ssa_name (def); - phi = create_phi_node (new_def, exit_bb); - if (j) -- def = gimple_get_lhs (vec_stmts[j]); -- SET_PHI_ARG_DEF (phi, loop_exit->dest_idx, def); -+ def = gimple_get_lhs (STMT_VINFO_VEC_STMTS (rdef_info)[j]); -+ SET_PHI_ARG_DEF (phi, LOOP_VINFO_IV_EXIT (loop_vinfo)->dest_idx, def); - new_def = gimple_convert (&stmts, vectype, new_def); - reduc_inputs.quick_push (new_def); - } -@@ -10569,146 +10524,6 @@ vectorizable_induction (loop_vec_info loop_vinfo, - return true; - } - --/* Function vectorizable_live_operation_1. -- -- helper function for vectorizable_live_operation. */ -- --tree --vectorizable_live_operation_1 (loop_vec_info loop_vinfo, -- stmt_vec_info stmt_info, basic_block exit_bb, -- tree vectype, int ncopies, slp_tree slp_node, -- tree bitsize, tree bitstart, tree vec_lhs, -- tree lhs_type, bool restart_loop, -- gimple_stmt_iterator *exit_gsi) --{ -- gcc_assert (single_pred_p (exit_bb) || LOOP_VINFO_EARLY_BREAKS (loop_vinfo)); -- -- tree vec_lhs_phi = copy_ssa_name (vec_lhs); -- gimple *phi = create_phi_node (vec_lhs_phi, exit_bb); -- for (unsigned i = 0; i < gimple_phi_num_args (phi); i++) -- SET_PHI_ARG_DEF (phi, i, vec_lhs); -- -- gimple_seq stmts = NULL; -- tree new_tree; -- if (LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo)) -- { -- /* Emit: -- -- SCALAR_RES = VEC_EXTRACT <VEC_LHS, LEN + BIAS - 1> -- -- where VEC_LHS is the vectorized live-out result and MASK is -- the loop mask for the final iteration. */ -- gcc_assert (ncopies == 1 && !slp_node); -- gimple_seq tem = NULL; -- gimple_stmt_iterator gsi = gsi_last (tem); -- tree len = vect_get_loop_len (loop_vinfo, &gsi, -- &LOOP_VINFO_LENS (loop_vinfo), -- 1, vectype, 0, 0); -- -- /* BIAS - 1. */ -- signed char biasval = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo); -- tree bias_minus_one -- = int_const_binop (MINUS_EXPR, -- build_int_cst (TREE_TYPE (len), biasval), -- build_one_cst (TREE_TYPE (len))); -- -- /* LAST_INDEX = LEN + (BIAS - 1). */ -- tree last_index = gimple_build (&stmts, PLUS_EXPR, TREE_TYPE (len), -- len, bias_minus_one); -- -- /* This needs to implement extraction of the first index, but not sure -- how the LEN stuff works. At the moment we shouldn't get here since -- there's no LEN support for early breaks. But guard this so there's -- no incorrect codegen. */ -- gcc_assert (!LOOP_VINFO_EARLY_BREAKS (loop_vinfo)); -- -- /* SCALAR_RES = VEC_EXTRACT <VEC_LHS, LEN + BIAS - 1>. */ -- tree scalar_res -- = gimple_build (&stmts, CFN_VEC_EXTRACT, TREE_TYPE (vectype), -- vec_lhs_phi, last_index); -- -- /* Convert the extracted vector element to the scalar type. */ -- new_tree = gimple_convert (&stmts, lhs_type, scalar_res); -- } -- else if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)) -- { -- /* Emit: -- -- SCALAR_RES = EXTRACT_LAST <VEC_LHS, MASK> -- -- where VEC_LHS is the vectorized live-out result and MASK is -- the loop mask for the final iteration. */ -- gcc_assert (!slp_node); -- tree scalar_type = TREE_TYPE (STMT_VINFO_VECTYPE (stmt_info)); -- gimple_seq tem = NULL; -- gimple_stmt_iterator gsi = gsi_last (tem); -- tree mask = vect_get_loop_mask (loop_vinfo, &gsi, -- &LOOP_VINFO_MASKS (loop_vinfo), -- 1, vectype, 0); -- tree scalar_res; -- -- /* For an inverted control flow with early breaks we want EXTRACT_FIRST -- instead of EXTRACT_LAST. Emulate by reversing the vector and mask. */ -- if (restart_loop && LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- { -- /* First create the permuted mask. */ -- tree perm_mask = perm_mask_for_reverse (TREE_TYPE (mask)); -- tree perm_dest = copy_ssa_name (mask); -- gimple *perm_stmt -- = gimple_build_assign (perm_dest, VEC_PERM_EXPR, mask, -- mask, perm_mask); -- vect_finish_stmt_generation (loop_vinfo, stmt_info, perm_stmt, -- &gsi); -- mask = perm_dest; -- -- /* Then permute the vector contents. */ -- tree perm_elem = perm_mask_for_reverse (vectype); -- perm_dest = copy_ssa_name (vec_lhs_phi); -- perm_stmt -- = gimple_build_assign (perm_dest, VEC_PERM_EXPR, vec_lhs_phi, -- vec_lhs_phi, perm_elem); -- vect_finish_stmt_generation (loop_vinfo, stmt_info, perm_stmt, -- &gsi); -- vec_lhs_phi = perm_dest; -- } -- -- gimple_seq_add_seq (&stmts, tem); -- -- scalar_res = gimple_build (&stmts, CFN_EXTRACT_LAST, scalar_type, -- mask, vec_lhs_phi); -- -- /* Convert the extracted vector element to the scalar type. */ -- new_tree = gimple_convert (&stmts, lhs_type, scalar_res); -- } -- else -- { -- tree bftype = TREE_TYPE (vectype); -- if (VECTOR_BOOLEAN_TYPE_P (vectype)) -- bftype = build_nonstandard_integer_type (tree_to_uhwi (bitsize), 1); -- new_tree = build3 (BIT_FIELD_REF, bftype, vec_lhs_phi, bitsize, bitstart); -- new_tree = force_gimple_operand (fold_convert (lhs_type, new_tree), -- &stmts, true, NULL_TREE); -- } -- -- *exit_gsi = gsi_after_labels (exit_bb); -- if (stmts) -- gsi_insert_seq_before (exit_gsi, stmts, GSI_SAME_STMT); -- -- return new_tree; --} -- --/* Find the edge that's the final one in the path from SRC to DEST and -- return it. This edge must exist in at most one forwarder edge between. */ -- --static edge --find_connected_edge (edge src, basic_block dest) --{ -- if (src->dest == dest) -- return src; -- -- return find_edge (src->dest, dest); --} -- - /* Function vectorizable_live_operation. - - STMT_INFO computes a value that is used outside the loop. Check if -@@ -10729,13 +10544,11 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype); - int ncopies; - gimple *use_stmt; -- use_operand_p use_p; - auto_vec<tree> vec_oprnds; - int vec_entry = 0; - poly_uint64 vec_index = 0; - -- gcc_assert (STMT_VINFO_LIVE_P (stmt_info) -- || LOOP_VINFO_EARLY_BREAKS (loop_vinfo)); -+ gcc_assert (STMT_VINFO_LIVE_P (stmt_info)); - - /* If a stmt of a reduction is live, vectorize it via - vect_create_epilog_for_reduction. vectorizable_reduction assessed -@@ -10760,25 +10573,8 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - if (STMT_VINFO_REDUC_TYPE (reduc_info) == FOLD_LEFT_REDUCTION - || STMT_VINFO_REDUC_TYPE (reduc_info) == EXTRACT_LAST_REDUCTION) - return true; -- - vect_create_epilog_for_reduction (loop_vinfo, stmt_info, slp_node, -- slp_node_instance, -- LOOP_VINFO_IV_EXIT (loop_vinfo)); -- -- /* If early break we only have to materialize the reduction on the merge -- block, but we have to find an alternate exit first. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- { -- for (auto exit : get_loop_exit_edges (LOOP_VINFO_LOOP (loop_vinfo))) -- if (exit != LOOP_VINFO_IV_EXIT (loop_vinfo)) -- { -- vect_create_epilog_for_reduction (loop_vinfo, stmt_info, -- slp_node, slp_node_instance, -- exit); -- break; -- } -- } -- -+ slp_node_instance); - return true; - } - -@@ -10889,8 +10685,8 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - bitsize = vector_element_bits_tree (vectype); - - /* Get the vectorized lhs of STMT and the lane to use (counted in bits). */ -- tree vec_lhs, vec_lhs0, bitstart; -- gimple *vec_stmt, *vec_stmt0; -+ tree vec_lhs, bitstart; -+ gimple *vec_stmt; - if (slp_node) - { - gcc_assert (!loop_vinfo -@@ -10901,10 +10697,6 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - vec_lhs = SLP_TREE_VEC_DEFS (slp_node)[vec_entry]; - vec_stmt = SSA_NAME_DEF_STMT (vec_lhs); - -- /* In case we need to early break vectorize also get the first stmt. */ -- vec_lhs0 = SLP_TREE_VEC_DEFS (slp_node)[0]; -- vec_stmt0 = SSA_NAME_DEF_STMT (vec_lhs0); -- - /* Get entry to use. */ - bitstart = bitsize_int (vec_index); - bitstart = int_const_binop (MULT_EXPR, bitsize, bitstart); -@@ -10915,10 +10707,6 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info).last (); - vec_lhs = gimple_get_lhs (vec_stmt); - -- /* In case we need to early break vectorize also get the first stmt. */ -- vec_stmt0 = STMT_VINFO_VEC_STMTS (stmt_info)[0]; -- vec_lhs0 = gimple_get_lhs (vec_stmt0); -- - /* Get the last lane in the vector. */ - bitstart = int_const_binop (MULT_EXPR, bitsize, bitsize_int (nunits - 1)); - } -@@ -10938,60 +10726,103 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, - lhs' = new_tree; */ - - class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); -- /* Check if we have a loop where the chosen exit is not the main exit, -- in these cases for an early break we restart the iteration the vector code -- did. For the live values we want the value at the start of the iteration -- rather than at the end. */ -- edge main_e = LOOP_VINFO_IV_EXIT (loop_vinfo); -- bool restart_loop = LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo); -- FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) -- if (!is_gimple_debug (use_stmt) -- && !flow_bb_inside_loop_p (loop, gimple_bb (use_stmt))) -- FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) -- { -- edge e = gimple_phi_arg_edge (as_a <gphi *> (use_stmt), -- phi_arg_index_from_use (use_p)); -- bool main_exit_edge = e == main_e -- || find_connected_edge (main_e, e->src); -- -- /* Early exits have an merge block, we want the merge block itself -- so use ->src. For main exit the merge block is the -- destination. */ -- basic_block dest = main_exit_edge ? main_e->dest : e->src; -- tree tmp_vec_lhs = vec_lhs; -- tree tmp_bitstart = bitstart; -- -- /* For early exit where the exit is not in the BB that leads -- to the latch then we're restarting the iteration in the -- scalar loop. So get the first live value. */ -- restart_loop = restart_loop || !main_exit_edge; -- if (restart_loop -- && STMT_VINFO_DEF_TYPE (stmt_info) == vect_induction_def) -- { -- tmp_vec_lhs = vec_lhs0; -- tmp_bitstart = build_zero_cst (TREE_TYPE (bitstart)); -- } -+ basic_block exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; -+ gcc_assert (single_pred_p (exit_bb)); - -- gimple_stmt_iterator exit_gsi; -- tree new_tree -- = vectorizable_live_operation_1 (loop_vinfo, stmt_info, -- dest, vectype, ncopies, -- slp_node, bitsize, -- tmp_bitstart, tmp_vec_lhs, -- lhs_type, restart_loop, -- &exit_gsi); -+ tree vec_lhs_phi = copy_ssa_name (vec_lhs); -+ gimple *phi = create_phi_node (vec_lhs_phi, exit_bb); -+ SET_PHI_ARG_DEF (phi, LOOP_VINFO_IV_EXIT (loop_vinfo)->dest_idx, vec_lhs); - -- if (gimple_phi_num_args (use_stmt) == 1) -- { -- auto gsi = gsi_for_stmt (use_stmt); -- remove_phi_node (&gsi, false); -- tree lhs_phi = gimple_phi_result (use_stmt); -- gimple *copy = gimple_build_assign (lhs_phi, new_tree); -- gsi_insert_before (&exit_gsi, copy, GSI_SAME_STMT); -- } -- else -- SET_PHI_ARG_DEF (use_stmt, e->dest_idx, new_tree); -- } -+ gimple_seq stmts = NULL; -+ tree new_tree; -+ if (LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo)) -+ { -+ /* Emit: -+ -+ SCALAR_RES = VEC_EXTRACT <VEC_LHS, LEN + BIAS - 1> -+ -+ where VEC_LHS is the vectorized live-out result and MASK is -+ the loop mask for the final iteration. */ -+ gcc_assert (ncopies == 1 && !slp_node); -+ gimple_seq tem = NULL; -+ gimple_stmt_iterator gsi = gsi_last (tem); -+ tree len -+ = vect_get_loop_len (loop_vinfo, &gsi, -+ &LOOP_VINFO_LENS (loop_vinfo), -+ 1, vectype, 0, 0); -+ -+ /* BIAS - 1. */ -+ signed char biasval = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo); -+ tree bias_minus_one -+ = int_const_binop (MINUS_EXPR, -+ build_int_cst (TREE_TYPE (len), biasval), -+ build_one_cst (TREE_TYPE (len))); -+ -+ /* LAST_INDEX = LEN + (BIAS - 1). */ -+ tree last_index = gimple_build (&stmts, PLUS_EXPR, TREE_TYPE (len), -+ len, bias_minus_one); -+ -+ /* SCALAR_RES = VEC_EXTRACT <VEC_LHS, LEN + BIAS - 1>. */ -+ tree scalar_res -+ = gimple_build (&stmts, CFN_VEC_EXTRACT, TREE_TYPE (vectype), -+ vec_lhs_phi, last_index); -+ -+ /* Convert the extracted vector element to the scalar type. */ -+ new_tree = gimple_convert (&stmts, lhs_type, scalar_res); -+ } -+ else if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)) -+ { -+ /* Emit: -+ -+ SCALAR_RES = EXTRACT_LAST <VEC_LHS, MASK> -+ -+ where VEC_LHS is the vectorized live-out result and MASK is -+ the loop mask for the final iteration. */ -+ gcc_assert (ncopies == 1 && !slp_node); -+ tree scalar_type = TREE_TYPE (STMT_VINFO_VECTYPE (stmt_info)); -+ gimple_seq tem = NULL; -+ gimple_stmt_iterator gsi = gsi_last (tem); -+ tree mask = vect_get_loop_mask (loop_vinfo, &gsi, -+ &LOOP_VINFO_MASKS (loop_vinfo), -+ 1, vectype, 0); -+ gimple_seq_add_seq (&stmts, tem); -+ tree scalar_res = gimple_build (&stmts, CFN_EXTRACT_LAST, scalar_type, -+ mask, vec_lhs_phi); -+ -+ /* Convert the extracted vector element to the scalar type. */ -+ new_tree = gimple_convert (&stmts, lhs_type, scalar_res); -+ } -+ else -+ { -+ tree bftype = TREE_TYPE (vectype); -+ if (VECTOR_BOOLEAN_TYPE_P (vectype)) -+ bftype = build_nonstandard_integer_type (tree_to_uhwi (bitsize), 1); -+ new_tree = build3 (BIT_FIELD_REF, bftype, -+ vec_lhs_phi, bitsize, bitstart); -+ new_tree = force_gimple_operand (fold_convert (lhs_type, new_tree), -+ &stmts, true, NULL_TREE); -+ } -+ -+ gimple_stmt_iterator exit_gsi = gsi_after_labels (exit_bb); -+ if (stmts) -+ gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT); -+ -+ /* Remove existing phis that copy from lhs and create copies -+ from new_tree. */ -+ gimple_stmt_iterator gsi; -+ for (gsi = gsi_start_phis (exit_bb); !gsi_end_p (gsi);) -+ { -+ gimple *phi = gsi_stmt (gsi); -+ if ((gimple_phi_arg_def (phi, 0) == lhs)) -+ { -+ remove_phi_node (&gsi, false); -+ tree lhs_phi = gimple_phi_result (phi); -+ gimple *copy = gimple_build_assign (lhs_phi, new_tree); -+ gsi_insert_before (&exit_gsi, copy, GSI_SAME_STMT); -+ } -+ else -+ gsi_next (&gsi); -+ } - - /* There a no further out-of-loop uses of lhs by LC-SSA construction. */ - FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) -@@ -11770,56 +11601,6 @@ update_epilogue_loop_vinfo (class loop *epilogue, tree advance) - epilogue_vinfo->shared->save_datarefs (); - } - --/* When vectorizing early break statements instructions that happen before -- the early break in the current BB need to be moved to after the early -- break. This function deals with that and assumes that any validity -- checks has already been performed. -- -- While moving the instructions if it encounters a VUSE or VDEF it then -- corrects the VUSES as it moves the statements along. GDEST is the location -- in which to insert the new statements. */ -- --static void --move_early_exit_stmts (loop_vec_info loop_vinfo) --{ -- DUMP_VECT_SCOPE ("move_early_exit_stmts"); -- -- if (LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo).is_empty ()) -- return; -- -- /* Move all stmts that need moving. */ -- basic_block dest_bb = LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo); -- gimple_stmt_iterator dest_gsi = gsi_start_bb (dest_bb); -- -- for (gimple *stmt : LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo)) -- { -- /* Check to see if statement is still required for vect or has been -- elided. */ -- auto stmt_info = loop_vinfo->lookup_stmt (stmt); -- if (!stmt_info) -- continue; -- -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, "moving stmt %G", stmt); -- -- gimple_stmt_iterator stmt_gsi = gsi_for_stmt (stmt); -- gsi_move_before (&stmt_gsi, &dest_gsi); -- gsi_prev (&dest_gsi); -- } -- -- /* Update all the stmts with their new reaching VUSES. */ -- tree vuse -- = gimple_vuse (LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo).last ()); -- for (auto p : LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo)) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "updating vuse to %T for load %G", vuse, p); -- gimple_set_vuse (p, vuse); -- update_stmt (p); -- } --} -- - /* Function vect_transform_loop. - - The analysis phase has determined that the loop is vectorizable. -@@ -11867,7 +11648,7 @@ vect_transform_loop (loop_vec_info loop_vinfo, gimple *loop_vectorized_call) - /* Make sure there exists a single-predecessor exit bb. Do this before - versioning. */ - edge e = LOOP_VINFO_IV_EXIT (loop_vinfo); -- if (! single_pred_p (e->dest) && !LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -+ if (! single_pred_p (e->dest)) - { - split_loop_exit_edge (e, true); - if (dump_enabled_p ()) -@@ -11961,11 +11742,6 @@ vect_transform_loop (loop_vec_info loop_vinfo, gimple *loop_vectorized_call) - /* This will deal with any possible peeling. */ - vect_prepare_for_masked_peels (loop_vinfo); - -- /* Handle any code motion that we need to for early-break vectorization after -- we've done peeling but just before we start vectorizing. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- move_early_exit_stmts (loop_vinfo); -- - /* Schedule the SLP instances first, then handle loop vectorization - below. */ - if (!loop_vinfo->slp_instances.is_empty ()) -diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc -index f1a95ef34b93..b0ceb1007bd4 100644 ---- a/gcc/tree-vect-patterns.cc -+++ b/gcc/tree-vect-patterns.cc -@@ -132,7 +132,6 @@ vect_init_pattern_stmt (vec_info *vinfo, gimple *pattern_stmt, - if (!STMT_VINFO_VECTYPE (pattern_stmt_info)) - { - gcc_assert (!vectype -- || is_a <gcond *> (pattern_stmt) - || (VECTOR_BOOLEAN_TYPE_P (vectype) - == vect_use_mask_type_p (orig_stmt_info))); - STMT_VINFO_VECTYPE (pattern_stmt_info) = vectype; -@@ -2787,30 +2786,15 @@ vect_recog_bitfield_ref_pattern (vec_info *vinfo, stmt_vec_info stmt_info, - - if (!lhs) - { -- if (!vectype) -- return NULL; -- - append_pattern_def_seq (vinfo, stmt_info, pattern_stmt, vectype); -- vectype = truth_type_for (vectype); -- -- /* FIXME: This part extracts the boolean value out of the bitfield in the -- same way as vect_recog_gcond_pattern does. However because -- patterns cannot match the same root twice, when we handle and -- lower the bitfield in the gcond, vect_recog_gcond_pattern can't -- apply anymore. We should really fix it so that we don't need to -- duplicate transformations like these. */ -- tree new_lhs = vect_recog_temp_ssa_var (boolean_type_node, NULL); - gcond *cond_stmt = dyn_cast <gcond *> (stmt_info->stmt); - tree cond_cst = gimple_cond_rhs (cond_stmt); -- gimple *new_stmt -- = gimple_build_assign (new_lhs, gimple_cond_code (cond_stmt), -- gimple_get_lhs (pattern_stmt), -- fold_convert (container_type, cond_cst)); -- append_pattern_def_seq (vinfo, stmt_info, new_stmt, vectype, container_type); - pattern_stmt -- = gimple_build_cond (NE_EXPR, new_lhs, -- build_zero_cst (TREE_TYPE (new_lhs)), -- NULL_TREE, NULL_TREE); -+ = gimple_build_cond (gimple_cond_code (cond_stmt), -+ gimple_get_lhs (pattern_stmt), -+ fold_convert (ret_type, cond_cst), -+ gimple_cond_true_label (cond_stmt), -+ gimple_cond_false_label (cond_stmt)); - } - - *type_out = STMT_VINFO_VECTYPE (stmt_info); -@@ -5569,78 +5553,6 @@ integer_type_for_mask (tree var, vec_info *vinfo) - return build_nonstandard_integer_type (def_stmt_info->mask_precision, 1); - } - --/* Function vect_recog_gcond_pattern -- -- Try to find pattern like following: -- -- if (a op b) -- -- where operator 'op' is not != and convert it to an adjusted boolean pattern -- -- mask = a op b -- if (mask != 0) -- -- and set the mask type on MASK. -- -- Input: -- -- * STMT_VINFO: The stmt at the end from which the pattern -- search begins, i.e. cast of a bool to -- an integer type. -- -- Output: -- -- * TYPE_OUT: The type of the output of this pattern. -- -- * Return value: A new stmt that will be used to replace the pattern. */ -- --static gimple * --vect_recog_gcond_pattern (vec_info *vinfo, -- stmt_vec_info stmt_vinfo, tree *type_out) --{ -- /* Currently we only support this for loop vectorization and when multiple -- exits. */ -- loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); -- if (!loop_vinfo || !LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) -- return NULL; -- -- gimple *last_stmt = STMT_VINFO_STMT (stmt_vinfo); -- gcond* cond = NULL; -- if (!(cond = dyn_cast <gcond *> (last_stmt))) -- return NULL; -- -- auto lhs = gimple_cond_lhs (cond); -- auto rhs = gimple_cond_rhs (cond); -- auto code = gimple_cond_code (cond); -- -- tree scalar_type = TREE_TYPE (lhs); -- if (VECTOR_TYPE_P (scalar_type)) -- return NULL; -- -- if (code == NE_EXPR -- && zerop (rhs) -- && VECT_SCALAR_BOOLEAN_TYPE_P (scalar_type)) -- return NULL; -- -- tree vecitype = get_vectype_for_scalar_type (vinfo, scalar_type); -- if (vecitype == NULL_TREE) -- return NULL; -- -- tree vectype = truth_type_for (vecitype); -- -- tree new_lhs = vect_recog_temp_ssa_var (boolean_type_node, NULL); -- gimple *new_stmt = gimple_build_assign (new_lhs, code, lhs, rhs); -- append_pattern_def_seq (vinfo, stmt_vinfo, new_stmt, vectype, scalar_type); -- -- gimple *pattern_stmt -- = gimple_build_cond (NE_EXPR, new_lhs, -- build_int_cst (TREE_TYPE (new_lhs), 0), -- NULL_TREE, NULL_TREE); -- *type_out = vectype; -- vect_pattern_detected ("vect_recog_gcond_pattern", last_stmt); -- return pattern_stmt; --} -- - /* Function vect_recog_bool_pattern - - Try to find pattern like following: -@@ -6679,26 +6591,15 @@ static bool - possible_vector_mask_operation_p (stmt_vec_info stmt_info) - { - tree lhs = gimple_get_lhs (stmt_info->stmt); -- tree_code code = ERROR_MARK; -- gassign *assign = NULL; -- gcond *cond = NULL; -- -- if ((assign = dyn_cast <gassign *> (stmt_info->stmt))) -- code = gimple_assign_rhs_code (assign); -- else if ((cond = dyn_cast <gcond *> (stmt_info->stmt))) -- { -- lhs = gimple_cond_lhs (cond); -- code = gimple_cond_code (cond); -- } -- - if (!lhs - || TREE_CODE (lhs) != SSA_NAME - || !VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (lhs))) - return false; - -- if (code != ERROR_MARK) -+ if (gassign *assign = dyn_cast <gassign *> (stmt_info->stmt)) - { -- switch (code) -+ tree_code rhs_code = gimple_assign_rhs_code (assign); -+ switch (rhs_code) - { - CASE_CONVERT: - case SSA_NAME: -@@ -6709,7 +6610,7 @@ possible_vector_mask_operation_p (stmt_vec_info stmt_info) - return true; - - default: -- return TREE_CODE_CLASS (code) == tcc_comparison; -+ return TREE_CODE_CLASS (rhs_code) == tcc_comparison; - } - } - else if (is_a <gphi *> (stmt_info->stmt)) -@@ -6756,35 +6657,12 @@ vect_determine_mask_precision (vec_info *vinfo, stmt_vec_info stmt_info) - The number of operations are equal, but M16 would have given - a shorter dependency chain and allowed more ILP. */ - unsigned int precision = ~0U; -- gimple *stmt = STMT_VINFO_STMT (stmt_info); -- -- /* If the statement compares two values that shouldn't use vector masks, -- try comparing the values as normal scalars instead. */ -- tree_code code = ERROR_MARK; -- tree op0_type; -- unsigned int nops = -1; -- unsigned int ops_start = 0; -- -- if (gassign *assign = dyn_cast <gassign *> (stmt)) -- { -- code = gimple_assign_rhs_code (assign); -- op0_type = TREE_TYPE (gimple_assign_rhs1 (assign)); -- nops = gimple_num_ops (assign); -- ops_start = 1; -- } -- else if (gcond *cond = dyn_cast <gcond *> (stmt)) -+ if (gassign *assign = dyn_cast <gassign *> (stmt_info->stmt)) - { -- code = gimple_cond_code (cond); -- op0_type = TREE_TYPE (gimple_cond_lhs (cond)); -- nops = 2; -- ops_start = 0; -- } -- -- if (code != ERROR_MARK) -- { -- for (unsigned int i = ops_start; i < nops; ++i) -+ unsigned int nops = gimple_num_ops (assign); -+ for (unsigned int i = 1; i < nops; ++i) - { -- tree rhs = gimple_op (stmt, i); -+ tree rhs = gimple_op (assign, i); - if (!VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (rhs))) - continue; - -@@ -6801,15 +6679,19 @@ vect_determine_mask_precision (vec_info *vinfo, stmt_vec_info stmt_info) - } - } - -+ /* If the statement compares two values that shouldn't use vector masks, -+ try comparing the values as normal scalars instead. */ -+ tree_code rhs_code = gimple_assign_rhs_code (assign); - if (precision == ~0U -- && TREE_CODE_CLASS (code) == tcc_comparison) -+ && TREE_CODE_CLASS (rhs_code) == tcc_comparison) - { -+ tree rhs1_type = TREE_TYPE (gimple_assign_rhs1 (assign)); - scalar_mode mode; - tree vectype, mask_type; -- if (is_a <scalar_mode> (TYPE_MODE (op0_type), &mode) -- && (vectype = get_vectype_for_scalar_type (vinfo, op0_type)) -- && (mask_type = get_mask_type_for_scalar_type (vinfo, op0_type)) -- && expand_vec_cmp_expr_p (vectype, mask_type, code)) -+ if (is_a <scalar_mode> (TYPE_MODE (rhs1_type), &mode) -+ && (vectype = get_vectype_for_scalar_type (vinfo, rhs1_type)) -+ && (mask_type = get_mask_type_for_scalar_type (vinfo, rhs1_type)) -+ && expand_vec_cmp_expr_p (vectype, mask_type, rhs_code)) - precision = GET_MODE_BITSIZE (mode); - } - } -@@ -6988,7 +6870,6 @@ static vect_recog_func vect_vect_recog_func_ptrs[] = { - { vect_recog_divmod_pattern, "divmod" }, - { vect_recog_mult_pattern, "mult" }, - { vect_recog_mixed_size_cond_pattern, "mixed_size_cond" }, -- { vect_recog_gcond_pattern, "gcond" }, - { vect_recog_bool_pattern, "bool" }, - /* This must come before mask conversion, and includes the parts - of mask conversion that are needed for gather and scatter -@@ -7076,10 +6957,6 @@ vect_mark_pattern_stmts (vec_info *vinfo, - vect_set_pattern_stmt (vinfo, - pattern_stmt, orig_stmt_info, pattern_vectype); - -- /* For any conditionals mark them as vect_condition_def. */ -- if (is_a <gcond *> (pattern_stmt)) -- STMT_VINFO_DEF_TYPE (STMT_VINFO_RELATED_STMT (orig_stmt_info)) = vect_condition_def; -- - /* Transfer reduction path info to the pattern. */ - if (STMT_VINFO_REDUC_IDX (orig_stmt_info_saved) != -1) - { -diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc -index bdbf08c9d298..267bb444c284 100644 ---- a/gcc/tree-vect-stmts.cc -+++ b/gcc/tree-vect-stmts.cc -@@ -342,7 +342,6 @@ is_simple_and_all_uses_invariant (stmt_vec_info stmt_info, - - it has uses outside the loop. - - it has vdefs (it alters memory). - - control stmts in the loop (except for the exit condition). -- - it is an induction and we have multiple exits. - - CHECKME: what other side effects would the vectorizer allow? */ - -@@ -360,10 +359,8 @@ vect_stmt_relevant_p (stmt_vec_info stmt_info, loop_vec_info loop_vinfo, - *live_p = false; - - /* cond stmt other than loop exit cond. */ -- gimple *stmt = STMT_VINFO_STMT (stmt_info); -- if (is_ctrl_stmt (stmt) -- && LOOP_VINFO_LOOP_IV_COND (loop_vinfo) != stmt -- && (!loop->inner || gimple_bb (stmt)->loop_father == loop)) -+ if (is_ctrl_stmt (stmt_info->stmt) -+ && STMT_VINFO_TYPE (stmt_info) != loop_exit_ctrl_vec_info_type) - *relevant = vect_used_in_scope; - - /* changing memory. */ -@@ -395,25 +392,13 @@ vect_stmt_relevant_p (stmt_vec_info stmt_info, loop_vec_info loop_vinfo, - /* We expect all such uses to be in the loop exit phis - (because of loop closed form) */ - gcc_assert (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI); -+ gcc_assert (bb == single_exit (loop)->dest); - - *live_p = true; - } - } - } - -- /* Check if it's an induction and multiple exits. In this case there will be -- a usage later on after peeling which is needed for the alternate exit. */ -- if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo) -- && STMT_VINFO_DEF_TYPE (stmt_info) == vect_induction_def) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, -- "vec_stmt_relevant_p: induction forced for " -- "early break.\n"); -- *live_p = true; -- -- } -- - if (*live_p && *relevant == vect_unused_in_scope - && !is_simple_and_all_uses_invariant (stmt_info, loop_vinfo)) - { -@@ -808,20 +793,6 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo, bool *fatal) - return res; - } - } -- } -- else if (gcond *cond = dyn_cast <gcond *> (stmt_vinfo->stmt)) -- { -- tree_code rhs_code = gimple_cond_code (cond); -- gcc_assert (TREE_CODE_CLASS (rhs_code) == tcc_comparison); -- opt_result res -- = process_use (stmt_vinfo, gimple_cond_lhs (cond), -- loop_vinfo, relevant, &worklist, false); -- if (!res) -- return res; -- res = process_use (stmt_vinfo, gimple_cond_rhs (cond), -- loop_vinfo, relevant, &worklist, false); -- if (!res) -- return res; - } - else if (gcall *call = dyn_cast <gcall *> (stmt_vinfo->stmt)) - { -@@ -835,8 +806,6 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo, bool *fatal) - return res; - } - } -- else -- gcc_unreachable (); - } - else - FOR_EACH_PHI_OR_STMT_USE (use_p, stmt_vinfo->stmt, iter, SSA_OP_USE) -@@ -1805,7 +1774,7 @@ compare_step_with_zero (vec_info *vinfo, stmt_vec_info stmt_info) - /* If the target supports a permute mask that reverses the elements in - a vector of type VECTYPE, return that mask, otherwise return null. */ - --tree -+static tree - perm_mask_for_reverse (tree vectype) - { - poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype); -@@ -12573,7 +12542,7 @@ vectorizable_comparison_1 (vec_info *vinfo, tree vectype, - vec<tree> vec_oprnds0 = vNULL; - vec<tree> vec_oprnds1 = vNULL; - tree mask_type; -- tree mask = NULL_TREE; -+ tree mask; - - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) - return false; -@@ -12713,9 +12682,8 @@ vectorizable_comparison_1 (vec_info *vinfo, tree vectype, - /* Transform. */ - - /* Handle def. */ -- lhs = gimple_get_lhs (STMT_VINFO_STMT (stmt_info)); -- if (lhs) -- mask = vect_create_destination_var (lhs, mask_type); -+ lhs = gimple_assign_lhs (STMT_VINFO_STMT (stmt_info)); -+ mask = vect_create_destination_var (lhs, mask_type); - - vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies, - rhs1, vectype, &vec_oprnds0, -@@ -12729,10 +12697,7 @@ vectorizable_comparison_1 (vec_info *vinfo, tree vectype, - gimple *new_stmt; - vec_rhs2 = vec_oprnds1[i]; - -- if (lhs) -- new_temp = make_ssa_name (mask); -- else -- new_temp = make_temp_ssa_name (mask_type, NULL, "cmp"); -+ new_temp = make_ssa_name (mask); - if (bitop1 == NOP_EXPR) - { - new_stmt = gimple_build_assign (new_temp, code, -@@ -12811,213 +12776,6 @@ vectorizable_comparison (vec_info *vinfo, - return true; - } - --/* Check to see if the current early break given in STMT_INFO is valid for -- vectorization. */ -- --static bool --vectorizable_early_exit (vec_info *vinfo, stmt_vec_info stmt_info, -- gimple_stmt_iterator *gsi, gimple **vec_stmt, -- slp_tree slp_node, stmt_vector_for_cost *cost_vec) --{ -- loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); -- if (!loop_vinfo -- || !is_a <gcond *> (STMT_VINFO_STMT (stmt_info))) -- return false; -- -- if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_condition_def) -- return false; -- -- if (!STMT_VINFO_RELEVANT_P (stmt_info)) -- return false; -- -- DUMP_VECT_SCOPE ("vectorizable_early_exit"); -- -- auto code = gimple_cond_code (STMT_VINFO_STMT (stmt_info)); -- -- tree vectype = NULL_TREE; -- slp_tree slp_op0; -- tree op0; -- enum vect_def_type dt0; -- if (!vect_is_simple_use (vinfo, stmt_info, slp_node, 0, &op0, &slp_op0, &dt0, -- &vectype)) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "use not simple.\n"); -- return false; -- } -- -- if (!vectype) -- return false; -- -- machine_mode mode = TYPE_MODE (vectype); -- int ncopies; -- -- if (slp_node) -- ncopies = 1; -- else -- ncopies = vect_get_num_copies (loop_vinfo, vectype); -- -- vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo); -- bool masked_loop_p = LOOP_VINFO_FULLY_MASKED_P (loop_vinfo); -- -- /* Now build the new conditional. Pattern gimple_conds get dropped during -- codegen so we must replace the original insn. */ -- gimple *orig_stmt = STMT_VINFO_STMT (vect_orig_stmt (stmt_info)); -- gcond *cond_stmt = as_a <gcond *>(orig_stmt); -- /* When vectorizing we assume that if the branch edge is taken that we're -- exiting the loop. This is not however always the case as the compiler will -- rewrite conditions to always be a comparison against 0. To do this it -- sometimes flips the edges. This is fine for scalar, but for vector we -- then have to flip the test, as we're still assuming that if you take the -- branch edge that we found the exit condition. */ -- auto new_code = NE_EXPR; -- auto reduc_optab = ior_optab; -- auto reduc_op = BIT_IOR_EXPR; -- tree cst = build_zero_cst (vectype); -- if (flow_bb_inside_loop_p (LOOP_VINFO_LOOP (loop_vinfo), -- BRANCH_EDGE (gimple_bb (cond_stmt))->dest)) -- { -- new_code = EQ_EXPR; -- reduc_optab = and_optab; -- reduc_op = BIT_AND_EXPR; -- cst = build_minus_one_cst (vectype); -- } -- -- /* Analyze only. */ -- if (!vec_stmt) -- { -- if (direct_optab_handler (cbranch_optab, mode) == CODE_FOR_nothing) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "can't vectorize early exit because the " -- "target doesn't support flag setting vector " -- "comparisons.\n"); -- return false; -- } -- -- if (ncopies > 1 -- && direct_optab_handler (reduc_optab, mode) == CODE_FOR_nothing) -- { -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -- "can't vectorize early exit because the " -- "target does not support boolean vector %s " -- "for type %T.\n", -- reduc_optab == ior_optab ? "OR" : "AND", -- vectype); -- return false; -- } -- -- if (!vectorizable_comparison_1 (vinfo, vectype, stmt_info, code, gsi, -- vec_stmt, slp_node, cost_vec)) -- return false; -- -- if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)) -- { -- if (direct_internal_fn_supported_p (IFN_VCOND_MASK_LEN, vectype, -- OPTIMIZE_FOR_SPEED)) -- return false; -- else -- vect_record_loop_mask (loop_vinfo, masks, ncopies, vectype, NULL); -- } -- -- -- return true; -- } -- -- /* Tranform. */ -- -- tree new_temp = NULL_TREE; -- gimple *new_stmt = NULL; -- -- if (dump_enabled_p ()) -- dump_printf_loc (MSG_NOTE, vect_location, "transform early-exit.\n"); -- -- if (!vectorizable_comparison_1 (vinfo, vectype, stmt_info, code, gsi, -- vec_stmt, slp_node, cost_vec)) -- gcc_unreachable (); -- -- gimple *stmt = STMT_VINFO_STMT (stmt_info); -- basic_block cond_bb = gimple_bb (stmt); -- gimple_stmt_iterator cond_gsi = gsi_last_bb (cond_bb); -- -- auto_vec<tree> stmts; -- -- if (slp_node) -- stmts.safe_splice (SLP_TREE_VEC_DEFS (slp_node)); -- else -- { -- auto vec_stmts = STMT_VINFO_VEC_STMTS (stmt_info); -- stmts.reserve_exact (vec_stmts.length ()); -- for (auto stmt : vec_stmts) -- stmts.quick_push (gimple_assign_lhs (stmt)); -- } -- -- /* Determine if we need to reduce the final value. */ -- if (stmts.length () > 1) -- { -- /* We build the reductions in a way to maintain as much parallelism as -- possible. */ -- auto_vec<tree> workset (stmts.length ()); -- -- /* Mask the statements as we queue them up. Normally we loop over -- vec_num, but since we inspect the exact results of vectorization -- we don't need to and instead can just use the stmts themselves. */ -- if (masked_loop_p) -- for (unsigned i = 0; i < stmts.length (); i++) -- { -- tree stmt_mask -- = vect_get_loop_mask (loop_vinfo, gsi, masks, ncopies, vectype, -- i); -- stmt_mask -- = prepare_vec_mask (loop_vinfo, TREE_TYPE (stmt_mask), stmt_mask, -- stmts[i], &cond_gsi); -- workset.quick_push (stmt_mask); -- } -- else -- workset.splice (stmts); -- -- while (workset.length () > 1) -- { -- new_temp = make_temp_ssa_name (vectype, NULL, "vexit_reduc"); -- tree arg0 = workset.pop (); -- tree arg1 = workset.pop (); -- new_stmt = gimple_build_assign (new_temp, reduc_op, arg0, arg1); -- vect_finish_stmt_generation (loop_vinfo, stmt_info, new_stmt, -- &cond_gsi); -- workset.quick_insert (0, new_temp); -- } -- } -- else -- { -- new_temp = stmts[0]; -- if (masked_loop_p) -- { -- tree mask -- = vect_get_loop_mask (loop_vinfo, gsi, masks, ncopies, vectype, 0); -- new_temp = prepare_vec_mask (loop_vinfo, TREE_TYPE (mask), mask, -- new_temp, &cond_gsi); -- } -- } -- -- gcc_assert (new_temp); -- -- gimple_cond_set_condition (cond_stmt, new_code, new_temp, cst); -- update_stmt (orig_stmt); -- -- if (slp_node) -- SLP_TREE_VEC_DEFS (slp_node).truncate (0); -- else -- STMT_VINFO_VEC_STMTS (stmt_info).truncate (0); -- -- if (!slp_node) -- *vec_stmt = orig_stmt; -- -- return true; --} -- - /* If SLP_NODE is nonnull, return true if vectorizable_live_operation - can handle all live statements in the node. Otherwise return true - if STMT_INFO is not live or if vectorizable_live_operation can handle it. -@@ -13029,27 +12787,20 @@ can_vectorize_live_stmts (vec_info *vinfo, stmt_vec_info stmt_info, - bool vec_stmt_p, - stmt_vector_for_cost *cost_vec) - { -- loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); - if (slp_node) - { - stmt_vec_info slp_stmt_info; - unsigned int i; - FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (slp_node), i, slp_stmt_info) - { -- if ((STMT_VINFO_LIVE_P (slp_stmt_info) -- || (loop_vinfo -- && LOOP_VINFO_EARLY_BREAKS (loop_vinfo) -- && STMT_VINFO_DEF_TYPE (slp_stmt_info) -- == vect_induction_def)) -+ if (STMT_VINFO_LIVE_P (slp_stmt_info) - && !vectorizable_live_operation (vinfo, slp_stmt_info, slp_node, - slp_node_instance, i, - vec_stmt_p, cost_vec)) - return false; - } - } -- else if ((STMT_VINFO_LIVE_P (stmt_info) -- || (LOOP_VINFO_EARLY_BREAKS (loop_vinfo) -- && STMT_VINFO_DEF_TYPE (stmt_info) == vect_induction_def)) -+ else if (STMT_VINFO_LIVE_P (stmt_info) - && !vectorizable_live_operation (vinfo, stmt_info, - slp_node, slp_node_instance, -1, - vec_stmt_p, cost_vec)) -@@ -13165,12 +12916,11 @@ vect_analyze_stmt (vec_info *vinfo, - node_instance, cost_vec); - if (!res) - return res; -- } -+ } - - switch (STMT_VINFO_DEF_TYPE (stmt_info)) - { - case vect_internal_def: -- case vect_condition_def: - break; - - case vect_reduction_def: -@@ -13203,7 +12953,6 @@ vect_analyze_stmt (vec_info *vinfo, - { - gcall *call = dyn_cast <gcall *> (stmt_info->stmt); - gcc_assert (STMT_VINFO_VECTYPE (stmt_info) -- || gimple_code (stmt_info->stmt) == GIMPLE_COND - || (call && gimple_call_lhs (call) == NULL_TREE)); - *need_to_vectorize = true; - } -@@ -13246,9 +12995,7 @@ vect_analyze_stmt (vec_info *vinfo, - || vectorizable_lc_phi (as_a <loop_vec_info> (vinfo), - stmt_info, NULL, node) - || vectorizable_recurr (as_a <loop_vec_info> (vinfo), -- stmt_info, NULL, node, cost_vec) -- || vectorizable_early_exit (vinfo, stmt_info, NULL, NULL, node, -- cost_vec)); -+ stmt_info, NULL, node, cost_vec)); - else - { - if (bb_vinfo) -@@ -13271,10 +13018,7 @@ vect_analyze_stmt (vec_info *vinfo, - NULL, NULL, node, cost_vec) - || vectorizable_comparison (vinfo, stmt_info, NULL, NULL, node, - cost_vec) -- || vectorizable_phi (vinfo, stmt_info, NULL, node, cost_vec) -- || vectorizable_early_exit (vinfo, stmt_info, NULL, NULL, node, -- cost_vec)); -- -+ || vectorizable_phi (vinfo, stmt_info, NULL, node, cost_vec)); - } - - if (node) -@@ -13433,12 +13177,6 @@ vect_transform_stmt (vec_info *vinfo, - gcc_assert (done); - break; - -- case loop_exit_ctrl_vec_info_type: -- done = vectorizable_early_exit (vinfo, stmt_info, gsi, &vec_stmt, -- slp_node, NULL); -- gcc_assert (done); -- break; -- - default: - if (!STMT_VINFO_LIVE_P (stmt_info)) - { -@@ -13859,9 +13597,6 @@ vect_is_simple_use (tree operand, vec_info *vinfo, enum vect_def_type *dt, - case vect_first_order_recurrence: - dump_printf (MSG_NOTE, "first order recurrence\n"); - break; -- case vect_condition_def: -- dump_printf (MSG_NOTE, "control flow\n"); -- break; - case vect_unknown_def_type: - dump_printf (MSG_NOTE, "unknown\n"); - break; -@@ -13978,8 +13713,6 @@ vect_is_simple_use (vec_info *vinfo, stmt_vec_info stmt, slp_tree slp_node, - else - *op = gimple_op (ass, operand + 1); - } -- else if (gcond *cond = dyn_cast <gcond *> (stmt->stmt)) -- *op = gimple_op (cond, operand); - else if (gcall *call = dyn_cast <gcall *> (stmt->stmt)) - *op = gimple_call_arg (call, operand); - else -@@ -14590,8 +14323,6 @@ vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info, - *nunits_vectype_out = NULL_TREE; - - if (gimple_get_lhs (stmt) == NULL_TREE -- /* Allow vector conditionals through here. */ -- && !is_a <gcond *> (stmt) - /* MASK_STORE has no lhs, but is ok. */ - && !gimple_call_internal_p (stmt, IFN_MASK_STORE)) - { -@@ -14608,7 +14339,7 @@ vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info, - } - - return opt_result::failure_at (stmt, -- "not vectorized: irregular stmt: %G", stmt); -+ "not vectorized: irregular stmt.%G", stmt); - } - - tree vectype; -@@ -14633,14 +14364,6 @@ vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info, - } - else - { -- /* If we got here with a gcond it means that the target had no available vector -- mode for the scalar type. We can't vectorize so abort. */ -- if (is_a <gcond *> (stmt)) -- return opt_result::failure_at (stmt, -- "not vectorized:" -- " unsupported data-type for gcond %T\n", -- scalar_type); -- - if (data_reference *dr = STMT_VINFO_DATA_REF (stmt_info)) - scalar_type = TREE_TYPE (DR_REF (dr)); - else if (gimple_call_internal_p (stmt, IFN_MASK_STORE)) -diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc -index 9001b738bf31..8e34549b1775 100644 ---- a/gcc/tree-vectorizer.cc -+++ b/gcc/tree-vectorizer.cc -@@ -1381,9 +1381,7 @@ pass_vectorize::execute (function *fun) - predicates that need to be shared for optimal predicate usage. - However reassoc will re-order them and prevent CSE from working - as it should. CSE only the loop body, not the entry. */ -- auto_vec<edge> exits = get_loop_exit_edges (loop); -- for (edge exit : exits) -- bitmap_set_bit (exit_bbs, exit->dest->index); -+ bitmap_set_bit (exit_bbs, single_exit (loop)->dest->index); - - edge entry = EDGE_PRED (loop_preheader_edge (loop)->src, 0); - do_rpo_vn (fun, entry, exit_bbs); -diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h -index db44d730b702..62c9818ee0dd 100644 ---- a/gcc/tree-vectorizer.h -+++ b/gcc/tree-vectorizer.h -@@ -66,7 +66,6 @@ enum vect_def_type { - vect_double_reduction_def, - vect_nested_cycle, - vect_first_order_recurrence, -- vect_condition_def, - vect_unknown_def_type - }; - -@@ -889,10 +888,6 @@ public: - we need to peel off iterations at the end to form an epilogue loop. */ - bool peeling_for_niter; - -- /* When the loop has early breaks that we can vectorize we need to peel -- the loop for the break finding loop. */ -- bool early_breaks; -- - /* List of loop additional IV conditionals found in the loop. */ - auto_vec<gcond *> conds; - -@@ -947,20 +942,6 @@ public: - /* The controlling loop IV for the scalar loop being vectorized. This IV - controls the natural exits of the loop. */ - edge scalar_loop_iv_exit; -- -- /* Used to store the list of stores needing to be moved if doing early -- break vectorization as they would violate the scalar loop semantics if -- vectorized in their current location. These are stored in order that they -- need to be moved. */ -- auto_vec<gimple *> early_break_stores; -- -- /* The final basic block where to move statements to. In the case of -- multiple exits this could be pretty far away. */ -- basic_block early_break_dest_bb; -- -- /* Statements whose VUSES need updating if early break vectorization is to -- happen. */ -- auto_vec<gimple*> early_break_vuses; - } *loop_vec_info; - - /* Access Functions. */ -@@ -1015,12 +996,6 @@ public: - #define LOOP_VINFO_REDUCTION_CHAINS(L) (L)->reduction_chains - #define LOOP_VINFO_PEELING_FOR_GAPS(L) (L)->peeling_for_gaps - #define LOOP_VINFO_PEELING_FOR_NITER(L) (L)->peeling_for_niter --#define LOOP_VINFO_EARLY_BREAKS(L) (L)->early_breaks --#define LOOP_VINFO_EARLY_BRK_STORES(L) (L)->early_break_stores --#define LOOP_VINFO_EARLY_BREAKS_VECT_PEELED(L) \ -- (single_pred ((L)->loop->latch) != (L)->vec_loop_iv_exit->src) --#define LOOP_VINFO_EARLY_BRK_DEST_BB(L) (L)->early_break_dest_bb --#define LOOP_VINFO_EARLY_BRK_VUSES(L) (L)->early_break_vuses - #define LOOP_VINFO_LOOP_CONDS(L) (L)->conds - #define LOOP_VINFO_LOOP_IV_COND(L) (L)->loop_iv_cond - #define LOOP_VINFO_NO_DATA_DEPENDENCIES(L) (L)->no_data_dependencies -@@ -1823,7 +1798,7 @@ is_loop_header_bb_p (basic_block bb) - { - if (bb == (bb->loop_father)->header) - return true; -- -+ gcc_checking_assert (EDGE_COUNT (bb->preds) == 1); - return false; - } - -@@ -2214,8 +2189,7 @@ extern bool slpeel_can_duplicate_loop_p (const class loop *, const_edge, - const_edge); - class loop *slpeel_tree_duplicate_loop_to_edge_cfg (class loop *, edge, - class loop *, edge, -- edge, edge *, bool = true, -- vec<basic_block> * = NULL); -+ edge, edge *, bool = true); - class loop *vect_loop_versioning (loop_vec_info, gimple *); - extern class loop *vect_do_peeling (loop_vec_info, tree, tree, - tree *, tree *, tree *, int, bool, bool, -@@ -2226,7 +2200,6 @@ extern dump_user_location_t find_loop_location (class loop *); - extern bool vect_can_advance_ivs_p (loop_vec_info); - extern void vect_update_inits_of_drs (loop_vec_info, tree, tree_code); - extern edge vec_init_loop_exit_info (class loop *); --extern void vect_iv_increment_position (edge, gimple_stmt_iterator *, bool *); - - /* In tree-vect-stmts.cc. */ - extern tree get_related_vectype_for_scalar_type (machine_mode, tree, -@@ -2248,7 +2221,6 @@ extern bool vect_is_simple_use (vec_info *, stmt_vec_info, slp_tree, - enum vect_def_type *, - tree *, stmt_vec_info * = NULL); - extern bool vect_maybe_update_slp_op_vectype (slp_tree, tree); --extern tree perm_mask_for_reverse (tree); - extern bool supportable_widening_operation (vec_info*, code_helper, - stmt_vec_info, tree, tree, - code_helper*, code_helper*, -@@ -2326,9 +2298,6 @@ extern opt_result vect_get_vector_types_for_stmt (vec_info *, - tree *, unsigned int = 0); - extern opt_tree vect_get_mask_type_for_stmt (stmt_vec_info, unsigned int = 0); - --/* In tree-if-conv.cc. */ --extern bool ref_within_array_bound (gimple *, tree); -- - /* In tree-vect-data-refs.cc. */ - extern bool vect_can_force_dr_alignment_p (const_tree, poly_uint64); - extern enum dr_alignment_support vect_supportable_dr_alignment --- -2.43.0 - diff --git a/14.0.0/gentoo/81_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch b/14.0.0/gentoo/81_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch deleted file mode 100644 index 42c1f15..0000000 --- a/14.0.0/gentoo/81_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 596b268da13ffc54200075212eadba01ac73a847 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:15 +0000 -Subject: [PATCH 7/8] Revert "middle-end: prevent LIM from hoising vector - compares from gconds if target does not support it." - -This reverts commit f1dcc0fe371e3cb10d2cbe3f6c88db6f72edddda. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/tree-ssa-loop-im.cc | 13 ------------- - 1 file changed, 13 deletions(-) - -diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc -index f3fda2bd7ce1..dd2aacaeee43 100644 ---- a/gcc/tree-ssa-loop-im.cc -+++ b/gcc/tree-ssa-loop-im.cc -@@ -48,8 +48,6 @@ along with GCC; see the file COPYING3. If not see - #include "tree-dfa.h" - #include "tree-ssa.h" - #include "dbgcnt.h" --#include "insn-codes.h" --#include "optabs-tree.h" - - /* TODO: Support for predicated code motion. I.e. - -@@ -854,17 +852,6 @@ determine_max_movement (gimple *stmt, bool must_preserve_exec) - if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL)) - return false; - -- /* Check if one of the depedent statement is a vector compare whether -- the target supports it, otherwise it's invalid to hoist it out of -- the gcond it belonged to. */ -- if (VECTOR_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond)))) -- { -- tree type = TREE_TYPE (gimple_cond_lhs (cond)); -- auto code = gimple_cond_code (cond); -- if (!target_supports_op_p (type, code, optab_vector)) -- return false; -- } -- - /* Fold in dependencies and cost of the condition. */ - FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE) - { --- -2.43.0 - diff --git a/14.0.0/gentoo/82_all_testsuite_Add_more_pragma_novector_to_new_tests.patch b/14.0.0/gentoo/82_all_testsuite_Add_more_pragma_novector_to_new_tests.patch deleted file mode 100644 index 0586a1c..0000000 --- a/14.0.0/gentoo/82_all_testsuite_Add_more_pragma_novector_to_new_tests.patch +++ /dev/null @@ -1,457 +0,0 @@ -From f4636b37ea9c34b2f3fc7efa04fd34fa4b8b2542 Mon Sep 17 00:00:00 2001 -From: Sam James <sam@gentoo.org> -Date: Mon, 25 Dec 2023 16:57:15 +0000 -Subject: [PATCH 8/8] Revert "testsuite: Add more pragma novector to new tests" - -This reverts commit 0994ddd86f9c3d829b06009d9e706ff72b07001a. - -Bug: https://gcc.gnu.org/PR113135 -Bug: https://gcc.gnu.org/PR113136 -Bug: https://gcc.gnu.org/PR113137 -Signed-off-by: Sam James <sam@gentoo.org> ---- - gcc/testsuite/gcc.dg/vect/no-scevccp-slp-30.c | 2 +- - gcc/testsuite/gcc.dg/vect/no-scevccp-slp-31.c | 1 - - gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c | 4 ++-- - gcc/testsuite/gcc.target/aarch64/vect-xorsign_exec.c | 2 -- - gcc/testsuite/gcc.target/i386/avx512er-vrcp28ps-3.c | 1 - - gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-3.c | 1 - - gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-5.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c | 1 - - gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c | 5 ----- - gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c | 5 ----- - gcc/testsuite/gcc.target/i386/vect-pack-trunc-1.c | 1 - - gcc/testsuite/gcc.target/i386/vect-pack-trunc-2.c | 1 - - gcc/testsuite/gcc.target/i386/vect-perm-even-1.c | 1 - - gcc/testsuite/gcc.target/i386/vect-unpack-1.c | 1 - - 27 files changed, 3 insertions(+), 37 deletions(-) - -diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-30.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-30.c -index 534bee4a1669..00d0eca56eec 100644 ---- a/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-30.c -+++ b/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-30.c -@@ -24,9 +24,9 @@ main1 () - } - - /* check results: */ -+#pragma GCC novector - for (j = 0; j < N; j++) - { --#pragma GCC novector - for (i = 0; i < N; i++) - { - if (out[i*4] != 8 -diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-31.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-31.c -index 22817a57ef81..48b6a9b0681c 100644 ---- a/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-31.c -+++ b/gcc/testsuite/gcc.dg/vect/no-scevccp-slp-31.c -@@ -27,7 +27,6 @@ main1 () - #pragma GCC novector - for (i = 0; i < N; i++) - { --#pragma GCC novector - for (j = 0; j < N; j++) - { - if (a[i][j] != 8) -diff --git a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c -index 0861d488e134..a0e53d5fef91 100644 ---- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c -+++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c -@@ -83,9 +83,9 @@ int main1 () - } - - /* check results: */ -+#pragma GCC novector - for (i = 0; i < N; i++) - { --#pragma GCC novector - for (j = 0; j < N; j++) - { - if (tmp1[2].e.n[1][i][j] != 8) -@@ -103,9 +103,9 @@ int main1 () - } - - /* check results: */ -+#pragma GCC novector - for (i = 0; i < N - NINTS; i++) - { --#pragma GCC novector - for (j = 0; j < N - NINTS; j++) - { - if (tmp2[2].e.n[1][i][j] != 8) -diff --git a/gcc/testsuite/gcc.target/aarch64/vect-xorsign_exec.c b/gcc/testsuite/gcc.target/aarch64/vect-xorsign_exec.c -index 84f33d3f6cce..cfa221158312 100644 ---- a/gcc/testsuite/gcc.target/aarch64/vect-xorsign_exec.c -+++ b/gcc/testsuite/gcc.target/aarch64/vect-xorsign_exec.c -@@ -33,7 +33,6 @@ main (void) - r[i] = a[i] * __builtin_copysignf (1.0f, b[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < N; i++) - if (r[i] != a[i] * __builtin_copysignf (1.0f, b[i])) - abort (); -@@ -42,7 +41,6 @@ main (void) - rd[i] = ad[i] * __builtin_copysign (1.0d, bd[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < N; i++) - if (rd[i] != ad[i] * __builtin_copysign (1.0d, bd[i])) - abort (); -diff --git a/gcc/testsuite/gcc.target/i386/avx512er-vrcp28ps-3.c b/gcc/testsuite/gcc.target/i386/avx512er-vrcp28ps-3.c -index 1e68926a3180..c0b1f7b31027 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512er-vrcp28ps-3.c -+++ b/gcc/testsuite/gcc.target/i386/avx512er-vrcp28ps-3.c -@@ -41,7 +41,6 @@ avx512er_test (void) - compute_rcp_ref (a, b, ref); - compute_rcp_exp (a, b, exp); - --#pragma GCC novector - for (int i = 0; i < MAX; i++) - { - float rel_err = (ref[i] - exp[i]) / ref[i]; -diff --git a/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-3.c b/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-3.c -index b922fa285b5f..a8ab49ed6c38 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-3.c -+++ b/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-3.c -@@ -38,7 +38,6 @@ avx512er_test (void) - compute_rsqrt_ref (in, ref); - compute_rsqrt_exp (in, exp); - --#pragma GCC novector - for (int i = 0; i < MAX; i++) - { - float rel_err = (ref[i] - exp[i]) / ref[i]; -diff --git a/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-5.c b/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-5.c -index 3c0066f7ea44..9a8a88ae2b57 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-5.c -+++ b/gcc/testsuite/gcc.target/i386/avx512er-vrsqrt28ps-5.c -@@ -38,7 +38,6 @@ avx512er_test (void) - compute_sqrt_ref (in, ref); - compute_sqrt_exp (in, exp); - --#pragma GCC novector - for (int i = 0; i < MAX; i++) - { - float rel_err = (ref[i] - exp[i]) / ref[i]; -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c -index 291907c8f9d0..ab058334a8c9 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c -@@ -47,7 +47,6 @@ avx512f_test (void) - r[i] = (int) ceil (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) ceil (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c -index c372631a211f..3ab64559cd28 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = ceil (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != ceil (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c -index be19e753026e..27a4bb95342c 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) ceilf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) ceilf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c -index ad1e8e12d5c7..54222da76f42 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = ceilf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != ceilf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c -index 1c8a107d15ae..9eff15f5006c 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c -@@ -47,7 +47,6 @@ avx512f_test (void) - r[i] = (int) floor (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) floor (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c -index b8bcb79a7a53..be9709951f7a 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = floor (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != floor (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c -index 4ae6e36acef5..7a84fcbc7314 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) floorf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) floorf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c -index 7c43f414763c..fcc0b275860f 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = floorf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != floorf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c -index b7e6759cb8e8..d22385c95e52 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) rint (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) rint (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c -index e36c9a5d4f9f..6a627ab4ac82 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) rintf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) rintf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c -index 0a6f9b2d235a..4c83e7b05126 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) round (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) round (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c -index d40f7d9f7bdd..1341a5bbe537 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = (int) roundf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != (int) roundf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c -index 3802078d2cda..b8b5d0730a8c 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = trunc (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != trunc (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c b/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c -index d9b6a4d0fdd2..7dfd575f019c 100644 ---- a/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c -+++ b/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c -@@ -45,7 +45,6 @@ avx512f_test (void) - r[i] = truncf (a[i]); - - /* check results: */ --#pragma GCC novector - for (i = 0; i < NUM; i++) - if (r[i] != truncf (a[i])) - abort(); -diff --git a/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c b/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c -index cec959f3e078..4aa536ba86c9 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c -+++ b/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c -@@ -40,7 +40,6 @@ int main() - b[i] = i; - } - foo1 (); --#pragma GCC novector - for (int i = 2; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -51,7 +50,6 @@ int main() - b[i] = i; - } - foo2 (); --#pragma GCC novector - for (int i = 2; i < 507; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -62,7 +60,6 @@ int main() - b[i] = i; - } - foo3 (); --#pragma GCC novector - for (int i = 2; i < 506; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -73,7 +70,6 @@ int main() - b[i] = i; - } - foo4 (); --#pragma GCC novector - for (int i = 2; i < 505; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -84,7 +80,6 @@ int main() - b[i] = i; - } - foo5 (505); --#pragma GCC novector - for (int i = 2; i < 506; ++i) - if (a[i] != 2*i) - __builtin_abort (); -diff --git a/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c b/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c -index 0317c77a3890..834bf0f770d6 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c -+++ b/gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c -@@ -40,7 +40,6 @@ int main() - b[i] = i; - } - foo1 (); --#pragma GCC novector - for (int i = 2; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -51,7 +50,6 @@ int main() - b[i] = i; - } - foo2 (); --#pragma GCC novector - for (int i = 3; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -62,7 +60,6 @@ int main() - b[i] = i; - } - foo3 (); --#pragma GCC novector - for (int i = 4; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -73,7 +70,6 @@ int main() - b[i] = i; - } - foo4 (); --#pragma GCC novector - for (int i = 5; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -@@ -84,7 +80,6 @@ int main() - b[i] = i; - } - foo5 (3); --#pragma GCC novector - for (int i = 3; i < 508; ++i) - if (a[i] != 2*i) - __builtin_abort (); -diff --git a/gcc/testsuite/gcc.target/i386/vect-pack-trunc-1.c b/gcc/testsuite/gcc.target/i386/vect-pack-trunc-1.c -index 915b604ebff9..1b468e47754c 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-pack-trunc-1.c -+++ b/gcc/testsuite/gcc.target/i386/vect-pack-trunc-1.c -@@ -21,7 +21,6 @@ avx512bw_test () - unsigned short i; - foo (N); - --#pragma GCC novector - for (i = 0; i < N; i++) - if ( (unsigned char)i != yy [i] ) - abort (); -diff --git a/gcc/testsuite/gcc.target/i386/vect-pack-trunc-2.c b/gcc/testsuite/gcc.target/i386/vect-pack-trunc-2.c -index c42f317ddf4f..3503deaa9d9b 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-pack-trunc-2.c -+++ b/gcc/testsuite/gcc.target/i386/vect-pack-trunc-2.c -@@ -20,7 +20,6 @@ avx512bw_test () - { - unsigned int i; - foo (N); --#pragma GCC novector - for (i = 0; i < N; i++) - if ( (unsigned short)i != yy [i] ) - abort (); -diff --git a/gcc/testsuite/gcc.target/i386/vect-perm-even-1.c b/gcc/testsuite/gcc.target/i386/vect-perm-even-1.c -index bed8621e5d49..3de4dfabeea0 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-perm-even-1.c -+++ b/gcc/testsuite/gcc.target/i386/vect-perm-even-1.c -@@ -26,7 +26,6 @@ avx512bw_test () - - foo (N); - --#pragma GCC novector - for (i = 0; i < N; i++) - if ( (unsigned char)(2*i+1) != yy [i] ) - abort (); -diff --git a/gcc/testsuite/gcc.target/i386/vect-unpack-1.c b/gcc/testsuite/gcc.target/i386/vect-unpack-1.c -index fd85650bf8c6..84521e313e52 100644 ---- a/gcc/testsuite/gcc.target/i386/vect-unpack-1.c -+++ b/gcc/testsuite/gcc.target/i386/vect-unpack-1.c -@@ -20,7 +20,6 @@ avx512bw_test () - { - unsigned char i; - foo (N); --#pragma GCC novector - for (i = 0; i < N; i++) - if ( (unsigned int)i != yy [i] ) - abort (); --- -2.43.0 - diff --git a/14.0.0/gentoo/README.history b/14.0.0/gentoo/README.history index 24aaad3..8e1b87e 100644 --- a/14.0.0/gentoo/README.history +++ b/14.0.0/gentoo/README.history @@ -1,3 +1,14 @@ +?? ?? ??? ???? + + - 75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch + - 76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch + - 77_all_Revert_arm_Add_Advanced_SIMD_cbranch_implementation.patch + - 78_all_Revert_testsuite_add_tests_for_early_break_vectorization.patch + - 79_all_Revert_AArch64_add_implementation_for_vector_cbranch.patch + - 80_all_Revert_middle-end_support_vectorization_of_loops_with_mult.patch + - 81_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch + - 82_all_testsuite_Add_more_pragma_novector_to_new_tests.patch + 15 8 Jan 2024 U 75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch |