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

--- Comment #21 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Andrew, any progress on bisecting the bootstrap failure?

In any case, looking at the patch:
+  if (call_save_p && latest_call_insn != NULL)
+    /* PR116028: If original_regno is a pseudo that has been assigned a
+       call-save hard register, then emit the spill insn before the call
+       insn 'latest_call_insn' instead of adjacent to 'insn'. If 'insn'
+       and 'latest_call_insn' belong to the same EBB but to two separate
+       BBs, and if 'insn' is present in the entry BB, then generating the
+       spill insn in the entry BB can prevent shrink wrap from happening.
+       This is because the spill insn references the stack pointer and
+       hence the prolog gets generated in the entry BB itself. It is
+       also more efficient to generate the spill before
+       'latest_call_insn' as the spill now occurs only in the path
+       containing the call.  */
+    lra_process_new_insns (PREV_INSN (latest_call_insn), NULL, save,
+                          "Add save<-reg");
+  else
+    lra_process_new_insns (insn, before_p ? save : NULL,
+                          before_p ? NULL : save,
+                          call_save_p
+                          ?  "Add save<-reg" : "Add split<-reg");
Why
    lra_process_new_insns (PREV_INSN (latest_call_insn), NULL, save, "Add
save<-reg");
as opposed to
    lra_process_new_insns (latest_call_insn, save, NULL, "Add save<-reg");
?
Also, should that be done regardless of the before_p flag or should it take
that into account?
Is before latest_call_insn always the right/best spot to insert the saving?
I mean can't it in certain cases need to be inserted before some earlier call,
not the latest one?

Reply via email to