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.

Reply via email to