On Thu, Jul 30, 2015 at 03:30:12PM -0500, Lynn A. Boger wrote: > PR66870 > * gcc/config/rs6000/rs6000.c: Add check for no_split_stack > function attribute along with flag_split_stack check to > determine when to generate split stack prologue for > ppc64 and ppc64le.
Looks good to me, except that the changelog entry should mention the modified functions, for example: PR target/66870 * gcc/config/rs6000/rs6000.c (rs6000_emit_prologue): Check for no_split_stack function attribute along with flag_split_stack. (rs6000_expand_split_stack_prologue): Likewise. Also, formatting rules for gcc say to not split a line after an operator. > + int using_split_stack = flag_split_stack && > + (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl)) > + == NULL); The "&&" belongs on the next line, with parentheses added so that emacs and indent will line up the continuation nicely. int using_split_stack = (flag_split_stack && (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl)) == NULL)); David, the following is another piece of the PR66870 fixes. This stops shrink-wrap from moving insns around in the first few blocks of a function, in a way that is incorrect given that r12 is live. Bootstrapped and regression tested powerpc64le-linux (and powerpc64-linux by Lynn). PR target/66870 * config/rs6000/rs6000.c (machine_function): Add split_stack_argp_used. (rs6000_emit_prologue): Set it. (rs6000_set_up_by_prologue): Specify r12 when split_stack_argp_used. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 5d9ff88..dc2e20c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -166,6 +166,7 @@ typedef struct GTY(()) machine_function rtx sdmode_stack_slot; /* Alternative internal arg pointer for -fsplit-stack. */ rtx split_stack_arg_pointer; + bool split_stack_argp_used; /* Flag if r2 setup is needed with ELFv2 ABI. */ bool r2_setup_needed; } machine_function; @@ -24458,6 +24459,7 @@ rs6000_emit_prologue (void) __morestack was called, it left the arg pointer to the old stack in r29. Otherwise, the arg pointer is the top of the current frame. */ + cfun->machine->split_stack_argp_used = true; if (sp_adjust) { rtx r12 = gen_rtx_REG (Pmode, 12); @@ -33711,6 +33713,8 @@ rs6000_set_up_by_prologue (struct hard_reg_set_container *set) && TARGET_MINIMAL_TOC && get_pool_size () != 0) add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM); + if (cfun->machine->split_stack_argp_used) + add_to_hard_reg_set (&set->set, Pmode, 12); } -- Alan Modra Australia Development Lab, IBM