From 7dca85bf15de2cdb18cc1c3f1706c603fb91f8fb Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Thu, 13 Oct 2016 20:25:15 +0200 Subject: [PATCH] Create the *logue in the same order as before (PR77962) PR77962 shows Go failing on 32-bit x86. This happens because the i386 port requires the split stack prologue to be created before the normal prologue, and my previous patch changed it to be the other way around. This patch changes it back. Things will be exactly as before for targets that do not do shrink-wrapping for separate components. For targets that *do* support it, all three prologue/epilogue creation functions will now be called twice for functions that have anything wrapped separately (instead of just the prologue created twice). PR bootstrap/77962 * function.c (thread_prologue_and_epilogue_insns): Call all make_*logue_seq in the same order as traditional. Call them all a second time if shrink_wrapped-separate. From-SVN: r241135 --- gcc/ChangeLog | 7 +++++++ gcc/function.c | 18 ++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c5386951a5..73e988ab9da 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-10-13 Segher Boessenkool + + PR bootstrap/77962 + * function.c (thread_prologue_and_epilogue_insns): Call all + make_*logue_seq in the same order as traditional. Call them + all a second time if shrink_wrapped_separate. + 2016-10-13 Marek Polacek * Makefile.in (insn-attrtab.o-warn, insn-dfatab.o-warn, diff --git a/gcc/function.c b/gcc/function.c index c71ddcc3ab8..ea40ad1be89 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -5923,7 +5923,9 @@ thread_prologue_and_epilogue_insns (void) edge entry_edge = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)); edge orig_entry_edge = entry_edge; + rtx_insn *split_prologue_seq = make_split_prologue_seq (); rtx_insn *prologue_seq = make_prologue_seq (); + rtx_insn *epilogue_seq = make_epilogue_seq (); /* Try to perform a kind of shrink-wrapping, making sure the prologue/epilogue is emitted only around those parts of the @@ -5935,13 +5937,17 @@ thread_prologue_and_epilogue_insns (void) try_shrink_wrapping_separate (entry_edge->dest); /* If that did anything for any component we now need the generate the - "main" prologue again. If that does not work for some target then - that target should not enable separate shrink-wrapping. */ + "main" prologue again. Because some targets require some of these + to be called in a specific order (i386 requires the split prologue + to be first, for example), we create all three sequences again here. + If this does not work for some target, that target should not enable + separate shrink-wrapping. */ if (crtl->shrink_wrapped_separate) - prologue_seq = make_prologue_seq (); - - rtx_insn *split_prologue_seq = make_split_prologue_seq (); - rtx_insn *epilogue_seq = make_epilogue_seq (); + { + split_prologue_seq = make_split_prologue_seq (); + prologue_seq = make_prologue_seq (); + epilogue_seq = make_epilogue_seq (); + } rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)); -- 2.30.2