On Wed, Dec 17, 2025 at 5:10 AM Andrew Pinski
<[email protected]> wrote:
>
> After r16-6104-gb5c64db0a49d46, we try to duplicate bb's
> that contain loop exit that have "never exit" but we check
> against the propability of the exit to very_unlikely. If we
> have PGO, then a loop exit might be very unlikely to be taken
> if we interate the loop more than 2000 times.
> The problem is the check for very_unlikely is just wrong. It should
> just be never. So let's remove that.
>
> Also adds a testcase for __builtin_abort instead of __builtin_unreachable
> since there are slightly different pathes to get the probilities.
>
> Bootstrapped and tested on x86_64-linux-gnu.
>
> gcc/ChangeLog:
>

PR tree-optimization/122734

missing here.

Otherwise OK.

Thanks,
Richard.

>         * tree-ssa-loop-ch.cc (should_duplicate_loop_header_p): Remove
>         check on very_unlikely probability.
>
> gcc/testsuite/ChangeLog:
>
>         PR tree-optimization/122734
>         * gcc.dg/tree-ssa/copy-headers-13.c: New test.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  .../gcc.dg/tree-ssa/copy-headers-13.c         | 25 +++++++++++++++++++
>  gcc/tree-ssa-loop-ch.cc                       |  8 +-----
>  2 files changed, 26 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/copy-headers-13.c
>
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/copy-headers-13.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/copy-headers-13.c
> new file mode 100644
> index 00000000000..cc1b76cccee
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/copy-headers-13.c
> @@ -0,0 +1,25 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -fdump-tree-ch-details -fdump-tree-ldist-details" } */
> +
> +/* PR tree-optimization/122734 */
> +/* We want to duplicate the block after the one containing the condition 
> going to abort as
> +   it is unlikely.
> +/* So in the end ldist can generate a memset. */
> +
> +static inline int size(int *a)
> +{
> +  int t = *a;
> +  if (t < 0)  __builtin_abort();
> +  return t;
> +}
> +
> +void f(int *l, short *d)
> +{
> +  for(int i = 0; i < size(l); i++)
> +    d[i] = 0;
> +}
> +
> +/* { dg-final { scan-tree-dump-times "Duplicating bb . is a win" 1 "ch2" } } 
> */
> +/* { dg-final { scan-tree-dump-times "Will duplicate bb" 2 "ch2" } } */
> +/* { dg-final { scan-tree-dump "is now do-while loop" "ch2" } } */
> +/* { dg-final { scan-tree-dump "generated memset zero" "ldist" } } */
> diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
> index feecf91cf70..e6e2b330b45 100644
> --- a/gcc/tree-ssa-loop-ch.cc
> +++ b/gcc/tree-ssa-loop-ch.cc
> @@ -474,13 +474,7 @@ should_duplicate_loop_header_p (basic_block header, 
> class loop *loop,
>        bool hasone = false;
>        FOR_EACH_EDGE (e, ei, header->succs)
>         if (loop_exit_edge_p (loop, e)
> -           && (probably_never_executed_edge_p (cfun, e)
> -               /* We want to rule out paths to noreturns but not
> -                  low probabilities resulting from adjustments
> -                  or combining.
> -                  FIXME: once we have better quality tracking,
> -                  make this more robust.  */
> -               || e->probability <= profile_probability::very_unlikely ()))
> +           && probably_never_executed_edge_p (cfun, e))
>           {
>             hasone = true;
>             if (dump_file && (dump_flags & TDF_DETAILS))
> --
> 2.43.0
>

Reply via email to