On Fri, Aug 12, 2022 at 12:59 PM Richard Biener <rguent...@suse.de> wrote: > > With the last re-org I failed to make sure to not add SSA names > nor supported by ranger into m_imports which then triggers an > ICE in range_on_path_entry because range_of_expr returns false. I've > noticed that range_on_path_entry does mightly complicated things > that don't make sense to me and the commentary might just be > out of date. For the sake of it I replaced it with range_on_entry > and statistics show we thread _more_ jumps with that, so better > not do magic there.
Hang on, hang on. range_on_path_entry was written that way for a reason. Andrew and I had numerous discussions about this. For that matter, my first implementation did exactly what you're proposing, but he had reservations about using range_on_entry, which IIRC he thought should be removed from the (public) API because it had a tendency to blow up lookups. Let's wait for Andrew to chime in on this. If indeed the commentary is out of date, I would much rather use range_on_entry like you propose, but he and I have fought many times about this... over various versions of the path solver :). For now I would return VARYING in range_on_path_entry if range_of_expr returns false. We shouldn't be ICEing when we can gracefully handle things. This gcc_unreachable was there to catch implementation issues during development. I would keep your gimple_range_ssa_p check regardless. No sense doing extra work if we're absolutely sure we won't handle it. Aldy > > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. > > Will push if that succeeds. > > PR tree-optimization/106593 > * tree-ssa-threadbackward.cc (back_threader::find_paths): > If the imports from the conditional do not satisfy > gimple_range_ssa_p don't try to thread anything. > * gimple-range-path.cc (range_on_path_entry): Just > call range_on_entry. > --- > gcc/gimple-range-path.cc | 33 +-------------------------------- > gcc/tree-ssa-threadbackward.cc | 6 +++++- > 2 files changed, 6 insertions(+), 33 deletions(-) > > diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc > index b6148eb5bd7..a7d277c31b8 100644 > --- a/gcc/gimple-range-path.cc > +++ b/gcc/gimple-range-path.cc > @@ -153,38 +153,7 @@ path_range_query::range_on_path_entry (vrange &r, tree > name) > { > gcc_checking_assert (defined_outside_path (name)); > basic_block entry = entry_bb (); > - > - // Prefer to use range_of_expr if we have a statement to look at, > - // since it has better caching than range_on_edge. > - gimple *last = last_stmt (entry); > - if (last) > - { > - if (m_ranger->range_of_expr (r, name, last)) > - return; > - gcc_unreachable (); > - } I > - > - // If we have no statement, look at all the incoming ranges to the > - // block. This can happen when we're querying a block with only an > - // outgoing edge (no statement but the fall through edge), but for > - // which we can determine a range on entry to the block. > - Value_Range tmp (TREE_TYPE (name)); > - bool changed = false; > - r.set_undefined (); > - for (unsigned i = 0; i < EDGE_COUNT (entry->preds); ++i) > - { > - edge e = EDGE_PRED (entry, i); > - if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) > - && m_ranger->range_on_edge (tmp, e, name)) > - { > - r.union_ (tmp); > - changed = true; > - } > - } > - > - // Make sure we don't return UNDEFINED by mistake. > - if (!changed) > - r.set_varying (TREE_TYPE (name)); > + m_ranger->range_on_entry (r, entry, name); > } > > // Return the range of NAME at the end of the path being analyzed. > diff --git a/gcc/tree-ssa-threadbackward.cc b/gcc/tree-ssa-threadbackward.cc > index 0a992213dad..669098e4ec3 100644 > --- a/gcc/tree-ssa-threadbackward.cc > +++ b/gcc/tree-ssa-threadbackward.cc > @@ -525,7 +525,11 @@ back_threader::find_paths (basic_block bb, tree name) > bitmap_clear (m_imports); > ssa_op_iter iter; > FOR_EACH_SSA_TREE_OPERAND (name, stmt, iter, SSA_OP_USE) > - bitmap_set_bit (m_imports, SSA_NAME_VERSION (name)); > + { > + if (!gimple_range_ssa_p (name)) > + return; > + bitmap_set_bit (m_imports, SSA_NAME_VERSION (name)); > + } > > // Interesting is the set of imports we still not have see > // the definition of. So while imports only grow, the > -- > 2.35.3 >