Re: [12/13] Make calls.c use function_arg_info internally

2019-08-19 Thread Jeff Law
On 8/19/19 9:23 AM, Richard Sandiford wrote:
> This patch makes the two main calls.c argument-processing
> routines track the state of the argument in a function_arg_info
> instead of using separate mode variables.
> 
> 
> 2019-08-19  Richard Sandiford  
> 
> gcc/
>   * calls.c (emit_library_call_value_1): Merge arg and orig_arg
>   into a single function_arg_info, updating its fields when we
>   apply pass-by-reference and promotion semantics.  Use the
>   function_arg_info to track the mode rather than keeping it in
>   a separate local variable.
>   (initialize_argument_information): Likewise.  Base the final
>   arg_to_skip on this new function_arg_info rather than creating
>   a new one from scratch.
> 
OK
jeff


[12/13] Make calls.c use function_arg_info internally

2019-08-19 Thread Richard Sandiford
This patch makes the two main calls.c argument-processing
routines track the state of the argument in a function_arg_info
instead of using separate mode variables.


2019-08-19  Richard Sandiford  

gcc/
* calls.c (emit_library_call_value_1): Merge arg and orig_arg
into a single function_arg_info, updating its fields when we
apply pass-by-reference and promotion semantics.  Use the
function_arg_info to track the mode rather than keeping it in
a separate local variable.
(initialize_argument_information): Likewise.  Base the final
arg_to_skip on this new function_arg_info rather than creating
a new one from scratch.

Index: gcc/calls.c
===
--- gcc/calls.c 2019-08-19 15:59:09.801778220 +0100
+++ gcc/calls.c 2019-08-19 15:59:18.145717843 +0100
@@ -1982,7 +1982,6 @@ initialize_argument_information (int num
 {
   tree type = TREE_TYPE (args[i].tree_value);
   int unsignedp;
-  machine_mode mode;
 
   /* Replace erroneous argument with constant zero.  */
   if (type == error_mark_node || !COMPLETE_TYPE_P (type))
@@ -2010,13 +2009,13 @@ initialize_argument_information (int num
 with those made by function.c.  */
 
   /* See if this argument should be passed by invisible reference.  */
-  function_arg_info orig_arg (type, argpos < n_named_args);
-  if (pass_by_reference (args_so_far_pnt, orig_arg))
+  function_arg_info arg (type, argpos < n_named_args);
+  if (pass_by_reference (args_so_far_pnt, arg))
{
  bool callee_copies;
  tree base = NULL_TREE;
 
- callee_copies = reference_callee_copied (args_so_far_pnt, orig_arg);
+ callee_copies = reference_callee_copied (args_so_far_pnt, arg);
 
  /* If we're compiling a thunk, pass through invisible references
 instead of making a copy.  */
@@ -2129,15 +2128,16 @@ initialize_argument_information (int num
}
 
   unsignedp = TYPE_UNSIGNED (type);
-  mode = promote_function_mode (type, TYPE_MODE (type), &unsignedp,
-   fndecl ? TREE_TYPE (fndecl) : fntype, 0);
+  arg.type = type;
+  arg.mode
+   = promote_function_mode (type, TYPE_MODE (type), &unsignedp,
+fndecl ? TREE_TYPE (fndecl) : fntype, 0);
 
   args[i].unsignedp = unsignedp;
-  args[i].mode = mode;
+  args[i].mode = arg.mode;
 
   targetm.calls.warn_parameter_passing_abi (args_so_far, type);
 
-  function_arg_info arg (type, mode, argpos < n_named_args);
   args[i].reg = targetm.calls.function_arg (args_so_far, arg);
 
   if (args[i].reg && CONST_INT_P (args[i].reg))
@@ -2177,7 +2177,7 @@ initialize_argument_information (int num
   if (args[i].reg == 0 || args[i].partial != 0
   || reg_parm_stack_space > 0
   || args[i].pass_on_stack)
-   locate_and_pad_parm (mode, type,
+   locate_and_pad_parm (arg.mode, type,
 #ifdef STACK_PARMS_IN_REG_PARM_AREA
 1,
 #else
@@ -2191,7 +2191,7 @@ initialize_argument_information (int num
/* The argument is passed entirely in registers.  See at which
   end it should be padded.  */
args[i].locate.where_pad =
- BLOCK_REG_PADDING (mode, type,
+ BLOCK_REG_PADDING (arg.mode, type,
 int_size_in_bytes (type) <= UNITS_PER_WORD);
 #endif
 
@@ -2208,9 +2208,8 @@ initialize_argument_information (int num
 promoted_mode used for function_arg above.  However, the
 corresponding handling of incoming arguments in function.c
 does pass the promoted mode.  */
-  function_arg_info arg_to_skip (type, TYPE_MODE (type),
-argpos < n_named_args);
-  targetm.calls.function_arg_advance (args_so_far, arg_to_skip);
+  arg.mode = TYPE_MODE (type);
+  targetm.calls.function_arg_advance (args_so_far, arg);
 
   /* Store argument values for functions decorated with attribute
 alloc_size.  */
@@ -4906,24 +4905,25 @@ emit_library_call_value_1 (int retval, r
   for (unsigned int i = 0; count < nargs; i++, count++)
 {
   rtx val = args[i].first;
-  machine_mode mode = args[i].second;
+  function_arg_info arg (args[i].second, /*named=*/true);
   int unsigned_p = 0;
 
   /* We cannot convert the arg value to the mode the library wants here;
 must do it earlier where we know the signedness of the arg.  */
-  gcc_assert (mode != BLKmode
- && (GET_MODE (val) == mode || GET_MODE (val) == VOIDmode));
+  gcc_assert (arg.mode != BLKmode
+ && (GET_MODE (val) == arg.mode
+ || GET_MODE (val) == VOIDmode));
 
   /* Make sure it is a reasonable operand for a move or push insn.  */
   if (!REG_P (val) && !MEM_P (val)
- && !(CONSTANT_P (val) && targetm.legitima