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