https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84272

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Thomas Preud'homme from comment #7)
> Hi Jakub,
> 
> First of all, thanks for beating me to it. Wanted to look at it but am
> fighting strong headache since Wednesday.
> 
> Regarding the second patch, I believe it is the right approach but found
> another bug in the surrounding lines which I think should be fixed in the
> same patch:
> 
>           /* Absence of children might indicate an alternate root of a
> *chain*.
>              It's ok to skip it here as the chain will be renamed when
>              processing the canonical root for that chain.  */
>           if (node->get_children ()->empty ())
>             continue;
> 
> Comment 1: I advocate removing this block altogether.

Agreed.  After all, what that skips over is:
          for (child_iter = node->get_children ()->begin ();
               child_iter != node->get_children ()->end (); child_iter++)
            to_process.safe_push (*child_iter);
          if (free)
            {
              if (node->root_p ())
                delete static_cast<fma_root_node *> (node);
              else
                delete node;
            }
where the for loop will do nothing if node->get_children ()->empty () and the
freeing, which needs to be done too.

> Comment 2: Explain why deferred freeing is necessary on top of the line
> adding the node to to_free.
> 
> Something along the lines of:
> 
> /*  Defer freeing so that the process_node callback can access the parent
> and children of the node being processed.  */

Ok.

Reply via email to