aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2023-12-25 17:03:15 +0000
committerSam James <sam@gentoo.org>2023-12-25 17:04:29 +0000
commitbcae6fba2b7ef6d741db7da389e6cfccd3acaf53 (patch)
tree3227415613b51e3c775b7350b39db491ecddf4c7
parent14.0.0: cut 11 patchset (diff)
downloadgcc-patches-bcae6fba2b7ef6d741db7da389e6cfccd3acaf53.tar.gz
gcc-patches-bcae6fba2b7ef6d741db7da389e6cfccd3acaf53.tar.bz2
gcc-patches-bcae6fba2b7ef6d741db7da389e6cfccd3acaf53.zip
14.0.0: cut patchset 12 with early abort vectorization reverts
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>
-rw-r--r--14.0.0/gentoo/75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch32
-rw-r--r--14.0.0/gentoo/76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch75
-rw-r--r--14.0.0/gentoo/77_all_Revert-testsuite-Add-tests-for-early-break-vectoriza.patch4955
-rw-r--r--14.0.0/gentoo/78_all_Revert-AArch64-Add-implementation-for-vector-cbranch.patch320
-rw-r--r--14.0.0/gentoo/79_all_Revert-middle-end-Support-vectorization-of-loops-wit.patch2426
-rw-r--r--14.0.0/gentoo/80_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch50
-rw-r--r--14.0.0/gentoo/81_all_Revert-testsuite-Add-more-pragma-novector-to-new-tes.patch457
-rw-r--r--14.0.0/gentoo/README.history10
8 files changed, 8325 insertions, 0 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
new file mode 100644
index 0000000..b113f1e
--- /dev/null
+++ b/14.0.0/gentoo/75_all_Revert-middle-end-explicitly-initialize-vec_stmts-PR.patch
@@ -0,0 +1,32 @@
+From a648fe2c0121414ac82926e9f8a70b33e347b930 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/7] 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 f51ae3e719e7..88261a3a4f57 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
new file mode 100644
index 0000000..1e4b825
--- /dev/null
+++ b/14.0.0/gentoo/76_all_Revert-testsuite-un-xfail-TSVC-loops-that-check-for-.patch
@@ -0,0 +1,75 @@
+From 846bfbdd30d437e40e10ce8bcd896f263436dfc1 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/7] 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-testsuite-Add-tests-for-early-break-vectoriza.patch b/14.0.0/gentoo/77_all_Revert-testsuite-Add-tests-for-early-break-vectoriza.patch
new file mode 100644
index 0000000..f4e6b84
--- /dev/null
+++ b/14.0.0/gentoo/77_all_Revert-testsuite-Add-tests-for-early-break-vectoriza.patch
@@ -0,0 +1,4955 @@
+From 3283ec82265c4bd51a2d113ebe44310169614650 Mon Sep 17 00:00:00 2001
+From: Sam James <sam@gentoo.org>
+Date: Mon, 25 Dec 2023 16:57:13 +0000
+Subject: [PATCH 3/7] 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 bd62b21f3b72..4be67daedb20 100644
+--- a/gcc/doc/sourcebuild.texi
++++ b/gcc/doc/sourcebuild.texi
+@@ -1636,14 +1636,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}.
+
+@@ -3213,11 +3205,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 05fc417877bc..7f13ff0ca565 100644
+--- a/gcc/testsuite/lib/target-supports.exp
++++ b/gcc/testsuite/lib/target-supports.exp
+@@ -4050,44 +4050,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/78_all_Revert-AArch64-Add-implementation-for-vector-cbranch.patch b/14.0.0/gentoo/78_all_Revert-AArch64-Add-implementation-for-vector-cbranch.patch
new file mode 100644
index 0000000..42a06f1
--- /dev/null
+++ b/14.0.0/gentoo/78_all_Revert-AArch64-Add-implementation-for-vector-cbranch.patch
@@ -0,0 +1,320 @@
+From d85db7a7354005e99a143453e103f784614cef0e 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/7] 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 f88b5bde254e..7c5fd4238357 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/79_all_Revert-middle-end-Support-vectorization-of-loops-wit.patch b/14.0.0/gentoo/79_all_Revert-middle-end-Support-vectorization-of-loops-wit.patch
new file mode 100644
index 0000000..549472b
--- /dev/null
+++ b/14.0.0/gentoo/79_all_Revert-middle-end-Support-vectorization-of-loops-wit.patch
@@ -0,0 +1,2426 @@
+From 3385d9b56e25b75a2e0fe3286b329b82b703362d Mon Sep 17 00:00:00 2001
+From: Sam James <sam@gentoo.org>
+Date: Mon, 25 Dec 2023 16:57:14 +0000
+Subject: [PATCH 5/7] 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 9638d3cc869a..e169413bb44c 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 3d9673fb0b58..d5c9c4a11c2e 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 295e1c916874..bcd90a331f5a 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 88261a3a4f57..7a3db5f098ba 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 2053673debe9..696b70b76a82 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 1333d8934783..e9ff728dfd40 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 8b495fc7ca13..d97e2b54c25a 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 785fc99ca27a..1810833a324a 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/80_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch b/14.0.0/gentoo/80_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch
new file mode 100644
index 0000000..2473ce4
--- /dev/null
+++ b/14.0.0/gentoo/80_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch
@@ -0,0 +1,50 @@
+From eccc75285320e5c4a4c21ec48ac2ab8bf8ca3580 Mon Sep 17 00:00:00 2001
+From: Sam James <sam@gentoo.org>
+Date: Mon, 25 Dec 2023 16:57:15 +0000
+Subject: [PATCH 6/7] 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 2ebf6d6548c4..396963b6754c 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/81_all_Revert-testsuite-Add-more-pragma-novector-to-new-tes.patch b/14.0.0/gentoo/81_all_Revert-testsuite-Add-more-pragma-novector-to-new-tes.patch
new file mode 100644
index 0000000..88e414e
--- /dev/null
+++ b/14.0.0/gentoo/81_all_Revert-testsuite-Add-more-pragma-novector-to-new-tes.patch
@@ -0,0 +1,457 @@
+From aa2a8d5c6f86e0b61e92b1ca02859cd480647f72 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/7] 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 802a99a..ad540db 100644
--- a/14.0.0/gentoo/README.history
+++ b/14.0.0/gentoo/README.history
@@ -1,3 +1,13 @@
+12 25 Dec 2023
+
+ + 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-testsuite-Add-tests-for-early-break-vectoriza.patch
+ + 78_all_Revert-AArch64-Add-implementation-for-vector-cbranch.patch
+ + 79_all_Revert-middle-end-Support-vectorization-of-loops-wit.patch
+ + 80_all_Revert-middle-end-prevent-LIM-from-hoising-vector-co.patch
+ + 81_all_Revert-testsuite-Add-more-pragma-novector-to-new-tes.patch
+
11 17 Dec 2023
- 76_all_PR112869_cxx.patch