> Am 22.01.2026 um 18:02 schrieb Victor Do Nascimento
> <[email protected]>:
>
> New in this version:
>
> Rather than treating `scev_not_known' as an unexpected value in
> `expr_invariant_in_loop_p' and have the function crash, handle the
> value gracefully by adding check for
> `!automatically_generated_chrec_p (expr)'.
>
> Regtested on AArch64 and x86_64, no regressions found.
>
> ---------
>
> Given the inability of `expr_invariant_in_loop_p (loop, expr)' to
> handle the `scev_not_known' node as the expression, an unknown loop
> bound in the inner loop in a nested set of loops led to
> `vect_analyze_loop_form' to erroneously consider the outer loop as
> suitable for vectorization. This introduces the necessary unknown
> loop iteration count check to ensure correct handling of counted loops
> with an embedded uncounted loop.
>
> gcc/ChangeLog:
>
> PR tree-optimization/123657
> * tree-vect-loop.cc (vect_analyze_loop_form): Add
> chrec_dont_know check.
> * tree-ssa-loop-ivopts.cc (expr_invariant_in_loop_p):
> likewise.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/vect/vect-uncounted-run_4.c (main): New.
> ---
> .../gcc.dg/vect/vect-uncounted-run_4.c | 17 +++++++++++++++++
> gcc/tree-ssa-loop-ivopts.cc | 3 ++-
> gcc/tree-vect-loop.cc | 3 ++-
> 3 files changed, 21 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
>
> diff --git a/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
> b/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
> new file mode 100644
> index 00000000000..f731daf42d9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
> @@ -0,0 +1,17 @@
> +/* Ensure we don't vectorize outer loops when the inner loop is uncounted.
> */
> +/* { dg-add-options vect_early_break } */
> +/* { dg-require-effective-target vect_early_break_hw } */
> +/* { dg-require-effective-target vect_int } */
> +/* { dg-additional-options "-O3" } */
> +
> +int a;
> +int main() {
> + for (int b = 0; b < 21; b++) {
> + int c = b;
> + while (c)
> + a = c >>= 1;
> + }
> + if (a != 0) __builtin_abort();
> +}
> +
> +/* { dg-final { scan-tree-dump "missed: not vectorized: inner-loop count
> not invariant." "vect" } } */
> diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> index 6ecf5bef7b4..bff4077b1a2 100644
> --- a/gcc/tree-ssa-loop-ivopts.cc
> +++ b/gcc/tree-ssa-loop-ivopts.cc
> @@ -1825,7 +1825,8 @@ expr_invariant_in_loop_p (class loop *loop, tree expr)
>
> gcc_assert (loop_depth (loop) > 0);
>
> - if (is_gimple_min_invariant (expr))
> + if (is_gimple_min_invariant (expr)
> + && !automatically_generated_chrec_p (expr))
Huh, they are invariant?! The hunk below fixes the issue, no? Let’s drop this
one for now. Ok with that change.
Richard
> return true;
>
> if (TREE_CODE (expr) == SSA_NAME)
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 03339641750..9d6963a26fe 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -1555,7 +1555,8 @@ vect_analyze_loop_form (class loop *loop, gimple
> *loop_vectorized_call,
> return opt_result::failure_at (vect_location,
> "not vectorized: Bad inner loop.\n");
>
> - if (!expr_invariant_in_loop_p (loop, inner.number_of_iterations))
> + if (inner.number_of_iterations == chrec_dont_know
> + || !expr_invariant_in_loop_p (loop, inner.number_of_iterations))
> return opt_result::failure_at (vect_location,
> "not vectorized: inner-loop count not"
> " invariant.\n");
> --
> 2.43.0
>
>