diff mbox series

[2/2] tree-optimization/116460 - improve forwprop compile-time

Message ID 20240826124234.BD2EC385EC32@sourceware.org
State New
Headers show
Series [1/2] Delay edge removal in forwprop | expand

Commit Message

Richard Biener Aug. 26, 2024, 12:41 p.m. UTC
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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	PR tree-optimization/116460
	* tree-ssa-forwprop.cc (pass_forwprop::execute): Do not
	process blocks in unreachable natural loops.
---
 gcc/tree-ssa-forwprop.cc | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index e7342b4dc09..2964420ad1a 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;