diff mbox series

[RS6000] PR88311, mlongcall indirections are optimised away

Message ID 20181214062537.GJ28455@bubble.grove.modra.org
State New
Headers show
Series [RS6000] PR88311, mlongcall indirections are optimised away | expand

Commit Message

Alan Modra Dec. 14, 2018, 6:25 a.m. UTC
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.

Bootstrapped and regression tested powerpc64le-linux (with
HAVE_AS_PLTSEQ) and powerpc64-linux biarch (without HAVE_AS_PLTSEQ).
OK?

	PR rtl-optimization/88311
	* config/rs6000/rs6000.c (rs6000_call_sysv): Do not mask cookie.
	(rs6000_sibcall_sysv): Likewise.

Comments

Segher Boessenkool Dec. 14, 2018, 7:31 a.m. UTC | #1
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 mbox series

Patch

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