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 --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; -- 2.43.0