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
This commit is contained in:
Segher Boessenkool 2016-10-13 20:25:15 +02:00 committed by Segher Boessenkool
parent c3e8838989
commit 7dca85bf15
2 changed files with 19 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2016-10-13 Segher Boessenkool <segher@kernel.crashing.org>
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 <polacek@redhat.com>
* Makefile.in (insn-attrtab.o-warn, insn-dfatab.o-warn,

View File

@ -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));