commit:     faf70fa7400084d0a8b91624c901f670d3682b16
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sun Dec 21 08:30:53 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Dec 21 08:30:53 2025 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=faf70fa7

16.0.0: drop upstream patch

Signed-off-by: Sam James <sam <AT> gentoo.org>

 16.0.0/gentoo/88_all_PR123089.patch | 648 ------------------------------------
 16.0.0/gentoo/README.history        |   1 -
 2 files changed, 649 deletions(-)

diff --git a/16.0.0/gentoo/88_all_PR123089.patch 
b/16.0.0/gentoo/88_all_PR123089.patch
deleted file mode 100644
index 7e55ad1..0000000
--- a/16.0.0/gentoo/88_all_PR123089.patch
+++ /dev/null
@@ -1,648 +0,0 @@
-From 4d8a8d4e44c55f16818f0b44c1372f28dbb8a46c Mon Sep 17 00:00:00 2001
-Message-ID: 
<4d8a8d4e44c55f16818f0b44c1372f28dbb8a46c.1766185423.git....@gentoo.org>
-From: Tamar Christina <[email protected]>
-Date: Fri, 19 Dec 2025 16:15:47 +0000
-Subject: [PATCH] use wider precision type for generating early break scalar IV
- [PR123089]
-
-In the PR we see that the new scalar IV tricks other passes to think there's an
-overflow to the use of a signed counter:
-
-The loop is known to iterate 8191 times and we have a VF of 8 and it starts
-at 2.
-
-The codegen out of the vectorizer is the same as before, except we now have a
-scalar variable counting the scalar iteration count vs a vector one.
-
-i.e. we have
-
-_45 = _39 + 8;
-
-vs
-
-_46 = _45 + { 16, 16, 16, 16, ... }
-
-we pick a lower VF now since costing allows it to but that's not important.
-
-When we get to cunroll since the value is now scalar, it sees that 8 * 8191
-would overflow a signed short and so it changes the loop bounds to the largest
-possible signed value and then uses this to elide the ivtmp_50 < 8191 as always
-true and so you get an infinite loop:
-
-Analyzing # of iterations of loop 1
-  exit condition [1, + , 1](no_overflow) < 8191
-  bounds on difference of bases: 8190 ... 8190
-  result:
-    # of iterations 8190, bounded by 8190
-Statement (exit)if (ivtmp_50 < 8191)
- is executed at most 8190 (bounded by 8190) + 1 times in loop 1.
-Induction variable (signed short) 8 + 8 * iteration does not wrap in statement
-_45 = _39 + 8;
- in loop 1.
-Statement _45 = _39 + 8;
- is executed at most 4094 (bounded by 4094) + 1 times in loop 1.
-
-The signed type was originally chosen because of the negative offset we use 
when
-adjusting for peeling for alignments with masks.  However this then introduces
-issues as we see here with signed overflow.  This patch instead determines the
-smallest possible unsigned type for use by the scalar IV where the overflow
-won't happen when we include the extra bit for the sign. i.e. if the scalar IV
-is an unsigned 8 bit value we pick a signed 16-bit type.  But if a signed 8-bit
-value we pick a unsigned 8 bit type.
-
-We use the initial niters value to determine the smallest size possible, to
-prevent certain cases like when the IV in code is a 64-bit to need a TImode
-counter.  I also only require the additional bit when I know we'll be 
generating
-the SMAX.  I've now moved this to vectorizable_early_exit such that if we do
-end up needing something like TImode that we don't vectorize if the target
-doesn't support it.
-
-I've also added some testcases for masking around the boundary values.  I've
-only added them for char to reduce the runtime of the tests.
-
-Bootstrapped Regtested on aarch64-none-linux-gnu,
-arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
--m32, -m64 and no issues.
-
-Any final comments? otherwise will push tomorrow.
-
-Thanks,
-Tamar
-
-gcc/ChangeLog:
-
-       PR tree-optimization/123089
-       * tree-vect-loop.cc (vect_update_ivs_after_vectorizer_for_early_breaks):
-       Add conversion if required, Note that if we did truncate the original
-       scalar loop had an overflow here anyway.
-       (vect_get_max_nscalars_per_iter): Expose.
-       * tree-vect-stmts.cc (vect_compute_type_for_early_break_scalar_iv): New.
-       (vectorizable_early_exit): Find smallest type where we won't have UB in
-       the signed IV and store it.
-       * tree-vectorizer.h (LOOP_VINFO_EARLY_BRK_IV_TYPE): New.
-       (class _loop_vec_info): Add early_break_iv_type.
-       (vect_min_prec_for_max_niters): New.
-       * tree-vect-loop-manip.cc (vect_do_peeling): Use it.
-
-gcc/testsuite/ChangeLog:
-
-PR tree-optimization/123089
-       * gcc.dg/vect/vect-early-break_141-pr123089.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_14.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_14_run.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_15.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_15_run.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_16.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_16_run.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_17.c: New test.
-       * gcc.target/aarch64/sve/peel_ind_17_run.c: New test.
----
- .../vect/vect-early-break_141-pr123089.c      | 40 ++++++++++++
- .../gcc.target/aarch64/sve/peel_ind_14.c      | 24 +++++++
- .../gcc.target/aarch64/sve/peel_ind_14_run.c  | 42 ++++++++++++
- .../gcc.target/aarch64/sve/peel_ind_15.c      | 24 +++++++
- .../gcc.target/aarch64/sve/peel_ind_15_run.c  | 42 ++++++++++++
- .../gcc.target/aarch64/sve/peel_ind_16.c      | 24 +++++++
- .../gcc.target/aarch64/sve/peel_ind_16_run.c  | 41 ++++++++++++
- .../gcc.target/aarch64/sve/peel_ind_17.c      | 24 +++++++
- .../gcc.target/aarch64/sve/peel_ind_17_run.c  | 41 ++++++++++++
- gcc/tree-vect-loop-manip.cc                   |  6 +-
- gcc/tree-vect-loop.cc                         | 15 +++--
- gcc/tree-vect-stmts.cc                        | 64 +++++++++++++++++++
- gcc/tree-vectorizer.h                         |  7 +-
- 13 files changed, 384 insertions(+), 10 deletions(-)
- create mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_141-pr123089.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14_run.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15_run.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16_run.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17_run.c
-
-diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_141-pr123089.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_141-pr123089.c
-new file mode 100644
-index 000000000000..431edbfbde67
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_141-pr123089.c
-@@ -0,0 +1,40 @@
-+/* { dg-add-options vect_early_break } */
-+/* { dg-require-effective-target vect_early_break_hw } */
-+/* { dg-require-effective-target vect_int } */
-+/* { dg-require-effective-target avx2_runtime { target { i?86-*-* x86_64-*-* 
} } } */
-+
-+/* { dg-additional-options "-O3 -fno-strict-aliasing -march=znver3" { target 
{ i?86-*-* x86_64-*-* } } } */
-+/* { dg-final { scan-tree-dump "loop vectorized" "vect" { target { i?86-*-* 
x86_64-*-* } } } } */
-+
-+#include "tree-vect.h"
-+
-+struct
-+{
-+  int d;
-+  short e;
-+} i;
-+
-+int b;
-+int *h = &b;
-+
-+int
-+main ()
-+{
-+  check_vect ();
-+
-+  short f = 1;
-+  short *g = &i.e;
-+
-+a:
-+  if (*g = 0 & ++f, *h)
-+    ;
-+  else
-+    {
-+      int c = 0;
-+      if (f)
-+        goto a;
-+      h = &c;
-+    }
-+
-+  return 0;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14.c
-new file mode 100644
-index 000000000000..b2f4650bb2ca
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14.c
-@@ -0,0 +1,24 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do compile } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only 
-fdump-tree-vect-details" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+/* { dg-final { scan-tree-dump "loop vectorized" "vect" } } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14_run.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14_run.c
-new file mode 100644
-index 000000000000..fab939bb25e4
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_14_run.c
-@@ -0,0 +1,42 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do run { target aarch64_sve_hw } } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-+int main ()
-+{
-+   int max = 255 - START;
-+   int x[255 - START];
-+#pragma GCC unroll 0
-+   for (int i = 0; i < max; i++)
-+     x[i] = 1;
-+
-+   x[200] = 0;
-+   int res = foo (max, x);
-+   if (res != 200)
-+     __builtin_abort ();
-+
-+   if (x[START] != 2)
-+     __builtin_abort ();
-+
-+   if (x[0] != 1)
-+     __builtin_abort ();
-+   return 0;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15.c
-new file mode 100644
-index 000000000000..b2f4650bb2ca
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15.c
-@@ -0,0 +1,24 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do compile } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only 
-fdump-tree-vect-details" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+/* { dg-final { scan-tree-dump "loop vectorized" "vect" } } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15_run.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15_run.c
-new file mode 100644
-index 000000000000..13763f5ebfbe
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_15_run.c
-@@ -0,0 +1,42 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do run { target aarch64_sve_hw } } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-+int main ()
-+{
-+   int max = 255 - START;
-+   int x[255 - START];
-+#pragma GCC unroll 0
-+   for (int i = 0; i < max; i++)
-+     x[i] = 1;
-+
-+   x[33] = 0;
-+   int res = foo (max, x);
-+   if (res != 33)
-+     __builtin_abort ();
-+
-+   if (x[START] != 2)
-+     __builtin_abort ();
-+
-+   if (x[0] != 1)
-+     __builtin_abort ();
-+   return 0;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16.c
-new file mode 100644
-index 000000000000..b2f4650bb2ca
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16.c
-@@ -0,0 +1,24 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do compile } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only 
-fdump-tree-vect-details" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+/* { dg-final { scan-tree-dump "loop vectorized" "vect" } } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16_run.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16_run.c
-new file mode 100644
-index 000000000000..120f737d2312
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_16_run.c
-@@ -0,0 +1,41 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do run { target aarch64_sve_hw } } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (unsigned char n, int *x)
-+{
-+  unsigned char i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < n; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-+int main ()
-+{
-+   int max = 255 - START;
-+   int x[255 - START];
-+#pragma GCC unroll 0
-+   for (int i = 0; i < max; i++)
-+     x[i] = 1;
-+
-+   int res = foo (max, x);
-+   if (res != max)
-+     __builtin_abort ();
-+
-+   if (x[START] != 2)
-+     __builtin_abort ();
-+
-+   if (x[0] != 1)
-+     __builtin_abort ();
-+   return 0;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17.c
-new file mode 100644
-index 000000000000..5395a759c612
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17.c
-@@ -0,0 +1,24 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do compile } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only  
-fdump-tree-vect-details" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+/* { dg-final { scan-tree-dump "loop vectorized" "vect" } } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (int *x)
-+{
-+  unsigned long i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < 253; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17_run.c 
b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17_run.c
-new file mode 100644
-index 000000000000..73163507f66b
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_17_run.c
-@@ -0,0 +1,41 @@
-+/* Fix for PR123089 alignment peeling with vectors and VLS and overflows.  */
-+/* { dg-do run { target aarch64_sve_hw } } */
-+/* { dg-options "-Ofast --param aarch64-autovec-preference=sve-only" } */
-+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw 
} } */
-+/* { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve128_hw 
} } */
-+
-+#define START 2
-+
-+int __attribute__((noipa))
-+foo (int *x)
-+{
-+  unsigned int i = 0;
-+#pragma GCC unroll 0
-+  for (i = START; i < 253; ++i)
-+    {
-+      if (x[i] == 0)
-+        return i;
-+      x[i] += 1;
-+    }
-+  return i;
-+}
-+
-+int main ()
-+{
-+   int x[255 - START];
-+#pragma GCC unroll 0
-+   for (int i = 0; i < 253; i++)
-+     x[i] = 1;
-+
-+   x[200] = 0;
-+   int res = foo (x);
-+   if (res != 200)
-+     __builtin_abort ();
-+
-+   if (x[START] != 2)
-+     __builtin_abort ();
-+
-+   if (x[0] != 1)
-+     __builtin_abort ();
-+   return 0;
-+}
-diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
-index 624d289156c2..8b4542365281 100644
---- a/gcc/tree-vect-loop-manip.cc
-+++ b/gcc/tree-vect-loop-manip.cc
-@@ -3738,10 +3738,8 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, 
tree nitersm1,
-       tree vector_iters_vf = niters_vector_mult_vf;
-       if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo))
-       {
--        tree vector_iters_vf_type = uncounted_p ? sizetype
--                                                : TREE_TYPE (vector_iters_vf);
--        tree scal_iv_ty = signed_type_for (vector_iters_vf_type);
--        tree tmp_niters_vf = make_ssa_name (scal_iv_ty);
-+        tree tmp_niters_vf
-+          = make_ssa_name (LOOP_VINFO_EARLY_BRK_IV_TYPE (loop_vinfo));
- 
-         if (!(LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo)
-               && get_loop_exit_edges (loop).length () == 1))
-diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
-index b15589a711b1..0c275a9edeb4 100644
---- a/gcc/tree-vect-loop.cc
-+++ b/gcc/tree-vect-loop.cc
-@@ -928,7 +928,7 @@ vect_get_max_nscalars_per_iter (loop_vec_info loop_vinfo)
-    as an unsigned integer, where MAX_NITERS is the maximum number of
-    loop header iterations for the original scalar form of LOOP_VINFO.  */
- 
--static unsigned
-+unsigned
- vect_min_prec_for_max_niters (loop_vec_info loop_vinfo, unsigned int factor)
- {
-   class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
-@@ -11055,10 +11055,15 @@ vect_update_ivs_after_vectorizer_for_early_breaks 
(loop_vec_info loop_vinfo)
-      final IV.  */
-   if (niters_skip)
-     {
--      induc_def = gimple_build (&iv_stmts, MAX_EXPR, TREE_TYPE (induc_def),
--                              induc_def,
--                              build_zero_cst (TREE_TYPE (induc_def)));
--      auto stmt = gimple_build_assign (phi_var, induc_def);
-+      tree induc_type = TREE_TYPE (induc_def);
-+      tree s_induc_type = signed_type_for (induc_type);
-+      induc_def = gimple_build (&iv_stmts, MAX_EXPR, s_induc_type,
-+                              gimple_convert (&iv_stmts, s_induc_type,
-+                                              induc_def),
-+                              build_zero_cst (s_induc_type));
-+      auto stmt = gimple_build_assign (phi_var,
-+                                     gimple_convert (&iv_stmts, induc_type,
-+                                                     induc_def));
-       gimple_seq_add_stmt_without_update (&iv_stmts, stmt);
-       basic_block exit_bb = NULL;
-       /* Identify the early exit merge block.  I wish we had stored this.  */
-diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
-index d5a50a39409b..a2f345c97d1c 100644
---- a/gcc/tree-vect-stmts.cc
-+++ b/gcc/tree-vect-stmts.cc
-@@ -12784,6 +12784,67 @@ supports_vector_compare_and_branch (loop_vec_info 
loop_vinfo, machine_mode mode)
-   return direct_optab_handler (cbranch_optab, mode) != CODE_FOR_nothing;
- }
- 
-+/* Determine the type to use for early break vectorization's scalar IV.  If
-+   no type is possible return false.  */
-+
-+static bool
-+vect_compute_type_for_early_break_scalar_iv (loop_vec_info loop_vinfo)
-+{
-+  /* Check if we have a usable scalar IV type for vectorization.  */
-+  tree iters_vf_type = sizetype;
-+  if (!LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo))
-+    {
-+      /* Find the type with the minimum precision we can use
-+       for the scalar IV.  */
-+      tree cand_type = TREE_TYPE (LOOP_VINFO_NITERS (loop_vinfo));
-+
-+      /* Work out how many bits we need to represent the limit.  */
-+      unsigned int min_ni_width
-+      = vect_min_prec_for_max_niters (loop_vinfo, 1);
-+
-+      /* Check if we're using PFA, if so we need a signed IV and an
-+       extra bit for the sign.  */
-+      if (TYPE_UNSIGNED (cand_type)
-+        && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
-+        && LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo))
-+      min_ni_width += 1;
-+
-+      if (TYPE_PRECISION (cand_type) >= min_ni_width)
-+      iters_vf_type = unsigned_type_for (cand_type);
-+      else
-+      {
-+        opt_scalar_int_mode cmp_mode_iter;
-+        tree iv_type = NULL_TREE;
-+        FOR_EACH_MODE_IN_CLASS (cmp_mode_iter, MODE_INT)
-+          {
-+            auto cmp_mode = cmp_mode_iter.require ();
-+            unsigned int cmp_bits = GET_MODE_BITSIZE (cmp_mode);
-+            if (cmp_bits >= min_ni_width
-+                && targetm.scalar_mode_supported_p (cmp_mode))
-+              {
-+                iv_type = build_nonstandard_integer_type (cmp_bits, true);
-+                if (iv_type)
-+                  break;
-+              }
-+          }
-+
-+        if (!iv_type)
-+          {
-+            if (dump_enabled_p ())
-+              dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-+                     "can't vectorize early exit because the "
-+                     "target doesn't support a scalar type wide "
-+                     "wide enough to hold niters.\n");
-+            return false;
-+          }
-+        iters_vf_type = iv_type;
-+      }
-+    }
-+
-+  LOOP_VINFO_EARLY_BRK_IV_TYPE (loop_vinfo) = iters_vf_type;
-+  return true;
-+}
-+
- /* Check to see if the current early break given in STMT_INFO is valid for
-    vectorization.  */
- 
-@@ -12897,6 +12958,9 @@ vectorizable_early_exit (loop_vec_info loop_vinfo, 
stmt_vec_info stmt_info,
-           vect_record_loop_mask (loop_vinfo, masks, vec_num, vectype, NULL);
-       }
- 
-+      if (!vect_compute_type_for_early_break_scalar_iv (loop_vinfo))
-+      return false;
-+
-       return true;
-     }
- 
-diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
-index 8f7483297ea8..840af10a7a23 100644
---- a/gcc/tree-vectorizer.h
-+++ b/gcc/tree-vectorizer.h
-@@ -1249,6 +1249,10 @@ public:
-      inside the relavent exit blocks in order to adjust for early break.  */
-   tree early_break_niters_var;
- 
-+  /* The type of the variable to be used to create the scalar IV for early 
break
-+     loops.  */
-+  tree early_break_iv_type;
-+
-   /* Record statements that are needed to be live for early break 
vectorization
-      but may not have an LC PHI node materialized yet in the exits.  */
-   auto_vec<stmt_vec_info> early_break_live_ivs;
-@@ -1320,6 +1324,7 @@ public:
- #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_EARLY_BRK_NITERS_VAR(L) (L)->early_break_niters_var
-+#define LOOP_VINFO_EARLY_BRK_IV_TYPE(L)    (L)->early_break_iv_type
- #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
-@@ -2676,7 +2681,7 @@ extern tree vect_gen_loop_len_mask (loop_vec_info, 
gimple_stmt_iterator *,
- extern gimple_seq vect_gen_len (tree, tree, tree, tree);
- extern vect_reduc_info info_for_reduction (loop_vec_info, slp_tree);
- extern bool reduction_fn_for_scalar_code (code_helper, internal_fn *);
--
-+extern unsigned vect_min_prec_for_max_niters (loop_vec_info, unsigned int);
- /* Drive for loop transformation stage.  */
- extern class loop *vect_transform_loop (loop_vec_info, gimple *);
- struct vect_loop_form_info
-
-base-commit: 68501f9d89e56d53d69d899cebb45b81ea5687ac
--- 
-2.52.0
-

diff --git a/16.0.0/gentoo/README.history b/16.0.0/gentoo/README.history
index 82f7362..5744533 100644
--- a/16.0.0/gentoo/README.history
+++ b/16.0.0/gentoo/README.history
@@ -2,7 +2,6 @@
 
        - 86_all_PR122456-pgo-workaround.patch
        + 86_all_PR122794-libtool.patch
-       + 88_all_PR123089.patch
 
 27     14 December 2025
 

Reply via email to