> 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
> 
> 

Reply via email to