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).