On Wed, Apr 30, 2025 at 1:29 PM Richard Biener <[email protected]> wrote
>
> The following allows the entry and exit block of a jump thread path
> to be equal, which can easily happen when there isn't a forwarder
> on the interesting edge for an FSM thread conditional.  We just
> don't want to enlarge the path from such a block.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, tested the
> gcc.dg/tree-ssa/ssa-dom-thread-7.c adjustment on aarch64-linux with
> a cross, pushed to trunk.

Reverted (on trunk sofar) again, it isn't correct.

> Richard.
>
>         PR tree-optimization/120003
>         * tree-ssa-threadbackward.cc (back_threader::find_paths_to_names):
>         Allow block re-use but do not enlarge the path beyond such a
>         re-use.
>
>         * gcc.dg/tree-ssa/ssa-thread-23.c: New testcase.
>         * gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust.
> ---
>  .../gcc.dg/tree-ssa/ssa-dom-thread-7.c        |  4 ++--
>  gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-23.c | 19 +++++++++++++++++++
>  gcc/tree-ssa-threadbackward.cc                |  8 +++-----
>  3 files changed, 24 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-23.c
>
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
> index d84aceebc5d..8be9878e0cf 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
> @@ -11,8 +11,8 @@
>     to change decisions in switch expansion which in turn can expose new
>     jump threading opportunities.  Skip the later tests on aarch64.  */
>  /* { dg-final { scan-tree-dump-not "Jumps threaded"  "dom3" { target { ! 
> aarch64*-*-* } } } } */
> -/* { dg-final { scan-tree-dump "Jumps threaded: 9"  "thread2" { target { ! 
> aarch64*-*-* } } } } */
> -/* { dg-final { scan-tree-dump "Jumps threaded: 17"  "thread2" { target { 
> aarch64*-*-* } } } } */
> +/* { dg-final { scan-tree-dump "Jumps threaded: 10"  "thread2" { target { ! 
> aarch64*-*-* } } } } */
> +/* { dg-final { scan-tree-dump "Jumps threaded: 14"  "thread2" { target { 
> aarch64*-*-* } } } } */
>
>  enum STATE {
>    S0=0,
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-23.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-23.c
> new file mode 100644
> index 00000000000..930360a33b5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-23.c
> @@ -0,0 +1,19 @@
> +/* PR120003 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-cddce3-details" } */
> +
> +extern _Bool g(int);
> +
> +_Bool f()
> +{
> +  _Bool retval = 0;
> +  for(int i=0; i<1000000; ++i)
> +    retval = retval || g(i);
> +  return retval;
> +}
> +
> +/* Jump threading after loop optimization should get the counting loop
> +   separated from the loop until retval is true and CD-DCE elide it.
> +   It's difficult to check for the fact that a true retval terminates
> +   the loop so check CD-DCE eliminates one loop instead.  */
> +/* { dg-final { scan-tree-dump "fix_loop_structure: removing loop" "cddce3" 
> } } */
> diff --git a/gcc/tree-ssa-threadbackward.cc b/gcc/tree-ssa-threadbackward.cc
> index 23bfc14c8f0..ce765cb5ded 100644
> --- a/gcc/tree-ssa-threadbackward.cc
> +++ b/gcc/tree-ssa-threadbackward.cc
> @@ -349,9 +349,6 @@ back_threader::find_paths_to_names (basic_block bb, 
> bitmap interesting,
>                                     unsigned overall_paths,
>                                     back_threader_profitability &profit)
>  {
> -  if (m_visited_bbs.add (bb))
> -    return;
> -
>    m_path.safe_push (bb);
>
>    // Try to resolve the path without looking back.  Avoid resolving paths
> @@ -377,7 +374,8 @@ back_threader::find_paths_to_names (basic_block bb, 
> bitmap interesting,
>    // Continue looking for ways to extend the path but limit the
>    // search space along a branch
>    else if ((overall_paths = overall_paths * EDGE_COUNT (bb->preds))
> -          <= (unsigned)param_max_jump_thread_paths)
> +          <= (unsigned)param_max_jump_thread_paths
> +          && !m_visited_bbs.add (bb))
>      {
>        // For further greedy searching we want to remove interesting
>        // names defined in BB but add ones on the PHI edges for the
> @@ -489,6 +487,7 @@ back_threader::find_paths_to_names (basic_block bb, 
> bitmap interesting,
>          backtracking we have to restore it.  */
>        for (int j : new_imports)
>         bitmap_clear_bit (m_imports, j);
> +      m_visited_bbs.remove (bb);
>      }
>    else if (dump_file && (dump_flags & TDF_DETAILS))
>      fprintf (dump_file, "  FAIL: Search space limit %d reached.\n",
> @@ -496,7 +495,6 @@ back_threader::find_paths_to_names (basic_block bb, 
> bitmap interesting,
>
>    // Reset things to their original state.
>    m_path.pop ();
> -  m_visited_bbs.remove (bb);
>  }
>
>  // Search backwards from BB looking for paths where the final
> --
> 2.43.0

Reply via email to