[RS6000] PR88311, mlongcall indirections are optimised away
authorAlan Modra <amodra@gmail.com>
Fri, 14 Dec 2018 09:03:50 +0000 (19:33 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Fri, 14 Dec 2018 09:03:50 +0000 (19:33 +1030)
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.

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

From-SVN: r267123

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 6222a3f74ef554ebff5f5a66a8a236344be0863e..aa260995e8ddc9f6cbd45d19859cf751b4b98a04 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-14  Alan Modra  <amodra@gmail.com>
+
+       PR rtl-optimization/88311
+       * config/rs6000/rs6000.c (rs6000_call_sysv): Do not mask cookie.
+       (rs6000_sibcall_sysv): Likewise.
+
 2018-12-14  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR rtl-optimization/88001
index 88f4f620ae46b5e616cc587b911463e79b945979..c4682fce6cd704cb78c863613b4b3d15b7a224d3 100644 (file)
@@ -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));