Message ID | 20181214062537.GJ28455@bubble.grove.modra.org |
---|---|
State | New |
Headers | show |
Series | [RS6000] PR88311, mlongcall indirections are optimised away | expand |
On Fri, Dec 14, 2018 at 04:55:37PM +1030, Alan Modra wrote: > Masking CALL_LONG from the cookie was done in order to simplify and > correct length attribute calculations for indirect calls at one point > in my call series tidy when the indirect patterns used alternatives > "0,n" on the cookie operand. (Leaving the CALL_LONG in place > calculated the wrong length for long calls without fp args.) > > This is no longer necessary now that the indirect sysv call patterns > explicitly test for the fp arg bits in their length attribute > expressions. And without the CALL_LONG to disable insns like > call_value_local_svsv, combine merrily replaces the indirect long call > sequence with a direct call. As it should. This patch reinstates > the CALL_LONG bit. Thanks! Okay for trunk. Segher > PR rtl-optimization/88311 > * config/rs6000/rs6000.c (rs6000_call_sysv): Do not mask cookie. > (rs6000_sibcall_sysv): Likewise.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 88f4f620ae4..c4682fce6cd 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -37978,8 +37978,7 @@ rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie) if (value != NULL_RTX) call[0] = gen_rtx_SET (value, call[0]); - unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS; - call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask)); + call[1] = gen_rtx_USE (VOIDmode, cookie); call[2] = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, LR_REGNO)); insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call)); @@ -38043,8 +38042,7 @@ rs6000_sibcall_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie) if (value != NULL_RTX) call[0] = gen_rtx_SET (value, call[0]); - unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS; - call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask)); + call[1] = gen_rtx_USE (VOIDmode, cookie); call[2] = simple_return_rtx; insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call));