https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106663
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2022-08-17 Assignee|unassigned at gcc dot gnu.org |aldyh at gcc dot gnu.org Status|UNCONFIRMED |NEW --- Comment #2 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- (In reply to Richard Biener from comment #1) > Created attachment 53468 [details] > patch restoring backward threader functionality > > The attached restores functionality in the backwards threader but as said it > gives up in find_taken_edge_goto doing > > m_solver->range_of_expr (r, dest, m_last_stmt); > tree addr; > if (!r.singleton_p (&addr) > || (TREE_CODE (addr) != ADDR_EXPR > && TREE_CODE (TREE_OPERAND (addr, 0)) != LABEL_DECL)) > return NULL; > > since the range we get is non-null, not &label In my prange branch I have the following for a prange: + void set_pt (tree base); + void set_pt (tree base, const wide_int &offset); + bool get_pt (tree &base, wide_int &offset) const; Your snippet above could be: m_solver->range_of_expr (r, dest, m_last_stmt); tree addr; wide_int offset; if (is_a <prange> (r)) && as_a <prange> (r).get_pt (addr, offset) && offset == 0 && TREE_CODE (addr) != ADDR_EXPR && TREE_CODE (TREE_OPERAND (addr, 0)) != LABEL_DECL))) ... Or some such... it was working last time I poked at it last year ;-). Anyways, confirmed. I'll take it.