https://gcc.gnu.org/g:0ceeb9926d69dbb382622a8eae9eef7ed8ac3e97

commit r15-3191-g0ceeb9926d69dbb382622a8eae9eef7ed8ac3e97
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Aug 26 10:01:44 2024 +0200

    tree-optimization/116460 - improve forwprop compile-time
    
    The following improves forwprop block reachability which I noticed
    when debugging PR116460 and what is also noted in the comment.  It
    avoids processing blocks in natural loops determined unreachable,
    thereby making the issue in PR116460 latent.
    
            PR tree-optimization/116460
            * tree-ssa-forwprop.cc (pass_forwprop::execute): Do not
            process blocks in unreachable natural loops.

Diff:
---
 gcc/tree-ssa-forwprop.cc | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index e7342b4dc092..2964420ad1a1 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -3498,6 +3498,8 @@ pass_forwprop::execute (function *fun)
 
   cfg_changed = false;
 
+  calculate_dominance_info (CDI_DOMINATORS);
+
   /* Combine stmts with the stmts defining their operands.  Do that
      in an order that guarantees visiting SSA defs before SSA uses.  */
   lattice.create (num_ssa_names);
@@ -3537,12 +3539,11 @@ pass_forwprop::execute (function *fun)
       FOR_EACH_EDGE (e, ei, bb->preds)
        {
          if ((e->flags & EDGE_EXECUTABLE)
-             /* With dominators we could improve backedge handling
-                when e->src is dominated by bb.  But for irreducible
-                regions we have to take all backedges conservatively.
-                We can handle single-block cycles as we know the
-                dominator relationship here.  */
-             || bb_to_rpo[e->src->index] > i)
+             /* We can handle backedges in natural loops correctly but
+                for irreducible regions we have to take all backedges
+                conservatively when we did not visit the source yet.  */
+             || (bb_to_rpo[e->src->index] > i
+                 && !dominated_by_p (CDI_DOMINATORS, e->src, e->dest)))
            {
              any = true;
              break;

Reply via email to