]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/116460 - improve forwprop compile-time
authorRichard Biener <rguenther@suse.de>
Mon, 26 Aug 2024 08:01:44 +0000 (10:01 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 26 Aug 2024 12:42:16 +0000 (14:42 +0200)
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.

gcc/tree-ssa-forwprop.cc

index e7342b4dc092d43612d3a74f01fa108ea5e15a9d..2964420ad1a12072bbf2ebc5d9524014197bc2ee 100644 (file)
@@ -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;