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

Segher Boessenkool <segher at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|marxin at gcc dot gnu.org          |segher at gcc dot 
gnu.org

--- Comment #29 from Segher Boessenkool <segher at gcc dot gnu.org> ---
I found the problem.

We have

===
/* Implement TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS.  */
void
rs6000_disqualify_components (sbitmap components, edge e,
                              sbitmap edge_components, bool /*is_prologue*/)
{
  /* Our LR pro/epilogue code moves LR via R0, so R0 had better not be
     live where we want to place that code.  */
  if (bitmap_bit_p (edge_components, 0)
      && bitmap_bit_p (DF_LIVE_IN (e->dest), 0))
    {
      if (dump_file)
        fprintf (dump_file, "Disqualifying LR because GPR0 is live "
                 "on entry to bb %d\n", e->dest->index);
      bitmap_clear_bit (components, 0);
    }
}
===

But looks at LIVE_IN for the epilogue as well, which is wrong (should be
LIVE_OUT then, epilogue is placed at the end of the BB).

Reply via email to