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.
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 (); - } - - // 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