From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18103 invoked by alias); 19 Aug 2019 15:19:08 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 18088 invoked by uid 89); 19 Aug 2019 15:19:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-8.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.110.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 19 Aug 2019 15:19:05 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BB1EE344 for ; Mon, 19 Aug 2019 08:19:03 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.99.62]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 475253F718 for ; Mon, 19 Aug 2019 08:19:03 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [08/13] Use function_arg_info for TARGET_CALLEE_COPIES References: Date: Mon, 19 Aug 2019 15:23:00 -0000 In-Reply-To: (Richard Sandiford's message of "Mon, 19 Aug 2019 16:11:12 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2019-08/txt/msg01311.txt.bz2 Use function_arg_info for TARGET_CALLEE_COPIES. The hook is passed the unpromoted type mode instead of the promoted mode. The aarch64 definition is redundant, but worth keeping for emphasis. 2019-08-19 Richard Sandiford gcc/ * target.def (callee_copies): Take a function_arg_info instead of a mode, type and named flag. * doc/tm.texi: Regenerate. * targhooks.h (hook_callee_copies_named): Take a function_arg_info instead of a mode, type and named flag. (hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false): Delete. (hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true): Likewise. (hook_bool_CUMULATIVE_ARGS_arg_info_true): New function. * targhooks.c (hook_callee_copies_named): Take a function_arg_info instead of a mode, type and named flag. (hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false): Delete. (hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true): Likewise. (hook_bool_CUMULATIVE_ARGS_arg_info_true): New function. * calls.h (reference_callee_copied): Take a function_arg_info instead of a mode, type and named flag. * calls.c (reference_callee_copied): Likewise. (initialize_argument_information): Update call accordingly. (emit_library_call_value_1): Likewise. * function.c (gimplify_parameters): Likewise. * config/aarch64/aarch64.c (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_false instead of hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false. * config/c6x/c6x.c (c6x_callee_copies): Delete. (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_true instead. * config/epiphany/epiphany.c (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_true instead of hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true. * config/mips/mips.c (mips_callee_copies): Take a function_arg_info instead of a mode, type and named flag. * config/mmix/mmix.c (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_true instead of hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true. * config/mn10300/mn10300.c (TARGET_CALLEE_COPIES): Likewise. * config/msp430/msp430.c (msp430_callee_copies): Delete. (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_true instead. * config/pa/pa.c (pa_callee_copies): Take a function_arg_info instead of a mode, type and named flag. * config/sh/sh.c (sh_callee_copies): Likewise. * config/v850/v850.c (TARGET_CALLEE_COPIES): Define to hook_bool_CUMULATIVE_ARGS_arg_info_true instead of hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true. Index: gcc/target.def =================================================================== --- gcc/target.def 2019-08-19 15:58:50.345918999 +0100 +++ gcc/target.def 2019-08-19 15:58:58.017863486 +0100 @@ -4653,8 +4653,8 @@ not be generated.\n\ \n\ The default version of this hook always returns false.", bool, - (cumulative_args_t cum, machine_mode mode, const_tree type, bool named), - hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false) + (cumulative_args_t cum, const function_arg_info &arg), + hook_bool_CUMULATIVE_ARGS_arg_info_false) /* Return zero for arguments passed entirely on the stack or entirely in registers. If passed in both, return the number of bytes passed Index: gcc/doc/tm.texi =================================================================== --- gcc/doc/tm.texi 2019-08-19 15:58:50.341919030 +0100 +++ gcc/doc/tm.texi 2019-08-19 15:58:58.013863514 +0100 @@ -4080,7 +4080,7 @@ The pointer is passed in whatever way is to that type. @end deftypefn -@deftypefn {Target Hook} bool TARGET_CALLEE_COPIES (cumulative_args_t @var{cum}, machine_mode @var{mode}, const_tree @var{type}, bool @var{named}) +@deftypefn {Target Hook} bool TARGET_CALLEE_COPIES (cumulative_args_t @var{cum}, const function_arg_info @var{&arg}) The function argument described by the parameters to this hook is known to be passed by reference. The hook should return true if the function argument should be copied by the callee instead of copied Index: gcc/targhooks.h =================================================================== --- gcc/targhooks.h 2019-08-19 15:58:50.345918999 +0100 +++ gcc/targhooks.h 2019-08-19 15:58:58.017863486 +0100 @@ -67,7 +67,7 @@ extern tree default_cxx_get_cookie_size extern bool hook_pass_by_reference_must_pass_in_stack (cumulative_args_t, const function_arg_info &); extern bool hook_callee_copies_named - (cumulative_args_t ca, machine_mode, const_tree, bool); + (cumulative_args_t ca, const function_arg_info &); extern void default_print_operand (FILE *, rtx, int); extern void default_print_operand_address (FILE *, machine_mode, rtx); @@ -135,12 +135,10 @@ extern void default_goacc_reduction (gca extern bool hook_bool_CUMULATIVE_ARGS_false (cumulative_args_t); extern bool hook_bool_CUMULATIVE_ARGS_true (cumulative_args_t); -extern bool hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false - (cumulative_args_t, machine_mode, const_tree, bool); -extern bool hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true - (cumulative_args_t, machine_mode, const_tree, bool); extern bool hook_bool_CUMULATIVE_ARGS_arg_info_false (cumulative_args_t, const function_arg_info &); +extern bool hook_bool_CUMULATIVE_ARGS_arg_info_true + (cumulative_args_t, const function_arg_info &); extern int hook_int_CUMULATIVE_ARGS_arg_info_0 (cumulative_args_t, const function_arg_info &); extern void hook_void_CUMULATIVE_ARGS_tree Index: gcc/targhooks.c =================================================================== --- gcc/targhooks.c 2019-08-19 15:58:50.345918999 +0100 +++ gcc/targhooks.c 2019-08-19 15:58:58.017863486 +0100 @@ -330,11 +330,9 @@ hook_pass_by_reference_must_pass_in_stac version of the hook is true for all named arguments. */ bool -hook_callee_copies_named (cumulative_args_t ca ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, bool named) +hook_callee_copies_named (cumulative_args_t, const function_arg_info &arg) { - return named; + return arg.named; } /* Emit to STREAM the assembler syntax for insn operand X. */ @@ -746,30 +744,19 @@ default_builtin_reciprocal (tree) } bool -hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false ( - cumulative_args_t ca ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) +hook_bool_CUMULATIVE_ARGS_arg_info_false (cumulative_args_t, + const function_arg_info &) { return false; } bool -hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true ( - cumulative_args_t ca ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) +hook_bool_CUMULATIVE_ARGS_arg_info_true (cumulative_args_t, + const function_arg_info &) { return true; } -bool -hook_bool_CUMULATIVE_ARGS_arg_info_false (cumulative_args_t, - const function_arg_info &) -{ - return false; -} - int hook_int_CUMULATIVE_ARGS_arg_info_0 (cumulative_args_t, const function_arg_info &) Index: gcc/calls.h =================================================================== --- gcc/calls.h 2019-08-19 15:58:42.381976625 +0100 +++ gcc/calls.h 2019-08-19 15:58:57.997863631 +0100 @@ -118,8 +118,8 @@ extern void fixup_tail_calls (void); extern bool pass_by_reference (CUMULATIVE_ARGS *, function_arg_info); extern bool pass_va_arg_by_reference (tree); -extern bool reference_callee_copied (CUMULATIVE_ARGS *, machine_mode, - tree, bool); +extern bool reference_callee_copied (CUMULATIVE_ARGS *, + const function_arg_info &); extern void maybe_warn_alloc_args_overflow (tree, tree, tree[2], int[2]); extern tree get_attr_nonstring_decl (tree, tree * = NULL); extern void maybe_warn_nonstring_arg (tree, tree); Index: gcc/calls.c =================================================================== --- gcc/calls.c 2019-08-19 15:58:50.301919320 +0100 +++ gcc/calls.c 2019-08-19 15:58:57.993863659 +0100 @@ -935,17 +935,15 @@ pass_va_arg_by_reference (tree type) return pass_by_reference (NULL, function_arg_info (type, /*named=*/false)); } -/* Return true if TYPE, which is passed by reference, should be callee +/* Return true if ARG, which is passed by reference, should be callee copied instead of caller copied. */ bool -reference_callee_copied (CUMULATIVE_ARGS *ca, machine_mode mode, - tree type, bool named_arg) +reference_callee_copied (CUMULATIVE_ARGS *ca, const function_arg_info &arg) { - if (type && TREE_ADDRESSABLE (type)) + if (arg.type && TREE_ADDRESSABLE (arg.type)) return false; - return targetm.calls.callee_copies (pack_cumulative_args (ca), mode, type, - named_arg); + return targetm.calls.callee_copies (pack_cumulative_args (ca), arg); } @@ -2002,9 +2000,7 @@ initialize_argument_information (int num bool callee_copies; tree base = NULL_TREE; - callee_copies - = reference_callee_copied (args_so_far_pnt, TYPE_MODE (type), - type, argpos < n_named_args); + callee_copies = reference_callee_copied (args_so_far_pnt, orig_arg); /* If we're compiling a thunk, pass through invisible references instead of making a copy. */ @@ -4911,8 +4907,7 @@ emit_library_call_value_1 (int retval, r if (pass_by_reference (&args_so_far_v, orig_arg)) { rtx slot; - int must_copy - = !reference_callee_copied (&args_so_far_v, mode, NULL_TREE, 1); + int must_copy = !reference_callee_copied (&args_so_far_v, orig_arg); /* If this was a CONST function, it is now PURE since it now reads memory. */ Index: gcc/function.c =================================================================== --- gcc/function.c 2019-08-19 15:58:50.345918999 +0100 +++ gcc/function.c 2019-08-19 15:58:58.013863514 +0100 @@ -3866,8 +3866,8 @@ gimplify_parameters (gimple_seq *cleanup if (data.passed_pointer) { tree type = TREE_TYPE (data.passed_type); - if (reference_callee_copied (&all.args_so_far_v, TYPE_MODE (type), - type, data.named_arg)) + function_arg_info orig_arg (type, data.named_arg); + if (reference_callee_copied (&all.args_so_far_v, orig_arg)) { tree local, t; Index: gcc/config/aarch64/aarch64.c =================================================================== --- gcc/config/aarch64/aarch64.c 2019-08-19 15:58:50.305919288 +0100 +++ gcc/config/aarch64/aarch64.c 2019-08-19 15:58:58.001863604 +0100 @@ -20323,7 +20323,7 @@ #define TARGET_ASM_TRAMPOLINE_TEMPLATE a #define TARGET_BUILD_BUILTIN_VA_LIST aarch64_build_builtin_va_list #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_false #undef TARGET_CAN_ELIMINATE #define TARGET_CAN_ELIMINATE aarch64_can_eliminate Index: gcc/config/c6x/c6x.c =================================================================== --- gcc/config/c6x/c6x.c 2019-08-19 15:58:50.317919202 +0100 +++ gcc/config/c6x/c6x.c 2019-08-19 15:58:58.001863604 +0100 @@ -635,7 +635,7 @@ c6x_function_value_regno_p (const unsign } /* Types larger than 64 bit, and variable sized types, are passed by - reference. The callee must copy them; see c6x_callee_copies. */ + reference. The callee must copy them; see TARGET_CALLEE_COPIES. */ static bool c6x_pass_by_reference (cumulative_args_t, const function_arg_info &arg) @@ -669,17 +669,6 @@ c6x_return_in_msb (const_tree valtype) return TARGET_BIG_ENDIAN && AGGREGATE_TYPE_P (valtype) && size == 3; } -/* Implement TARGET_CALLEE_COPIES. */ - -static bool -c6x_callee_copies (cumulative_args_t cum_v ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, - bool named ATTRIBUTE_UNUSED) -{ - return true; -} - /* Return the type to use as __builtin_va_list. */ static tree c6x_build_builtin_va_list (void) @@ -6726,7 +6715,7 @@ #define TARGET_RETURN_IN_MSB c6x_return_ #undef TARGET_PASS_BY_REFERENCE #define TARGET_PASS_BY_REFERENCE c6x_pass_by_reference #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES c6x_callee_copies +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #undef TARGET_STRUCT_VALUE_RTX #define TARGET_STRUCT_VALUE_RTX c6x_struct_value_rtx #undef TARGET_FUNCTION_OK_FOR_SIBCALL Index: gcc/config/epiphany/epiphany.c =================================================================== --- gcc/config/epiphany/epiphany.c 2019-08-19 15:58:50.321919175 +0100 +++ gcc/config/epiphany/epiphany.c 2019-08-19 15:58:58.001863604 +0100 @@ -90,7 +90,7 @@ #define TARGET_PROMOTE_PROTOTYPES hook_b #define TARGET_RETURN_IN_MEMORY epiphany_return_in_memory #define TARGET_PASS_BY_REFERENCE epiphany_pass_by_reference -#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #define TARGET_FUNCTION_VALUE epiphany_function_value #define TARGET_LIBCALL_VALUE epiphany_libcall_value #define TARGET_FUNCTION_VALUE_REGNO_P epiphany_function_value_regno_p Index: gcc/config/mips/mips.c =================================================================== --- gcc/config/mips/mips.c 2019-08-19 15:58:50.333919085 +0100 +++ gcc/config/mips/mips.c 2019-08-19 15:58:58.005863572 +0100 @@ -6259,11 +6259,9 @@ mips_pass_by_reference (cumulative_args_ /* Implement TARGET_CALLEE_COPIES. */ static bool -mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, bool named) +mips_callee_copies (cumulative_args_t, const function_arg_info &arg) { - return mips_abi == ABI_EABI && named; + return mips_abi == ABI_EABI && arg.named; } /* See whether VALTYPE is a record whose fields should be returned in Index: gcc/config/mmix/mmix.c =================================================================== --- gcc/config/mmix/mmix.c 2019-08-19 15:58:50.333919085 +0100 +++ gcc/config/mmix/mmix.c 2019-08-19 15:58:58.005863572 +0100 @@ -263,7 +263,7 @@ #define TARGET_SETUP_INCOMING_VARARGS mm #undef TARGET_PASS_BY_REFERENCE #define TARGET_PASS_BY_REFERENCE mmix_pass_by_reference #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #undef TARGET_PREFERRED_RELOAD_CLASS #define TARGET_PREFERRED_RELOAD_CLASS mmix_preferred_reload_class Index: gcc/config/mn10300/mn10300.c =================================================================== --- gcc/config/mn10300/mn10300.c 2019-08-19 15:58:50.333919085 +0100 +++ gcc/config/mn10300/mn10300.c 2019-08-19 15:58:58.009863545 +0100 @@ -3354,7 +3354,7 @@ #define TARGET_RETURN_IN_MEMORY mn10300_ #undef TARGET_PASS_BY_REFERENCE #define TARGET_PASS_BY_REFERENCE mn10300_pass_by_reference #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #undef TARGET_ARG_PARTIAL_BYTES #define TARGET_ARG_PARTIAL_BYTES mn10300_arg_partial_bytes #undef TARGET_FUNCTION_ARG Index: gcc/config/msp430/msp430.c =================================================================== --- gcc/config/msp430/msp430.c 2019-08-19 15:58:50.333919085 +0100 +++ gcc/config/msp430/msp430.c 2019-08-19 15:58:58.009863545 +0100 @@ -750,16 +750,7 @@ msp430_pass_by_reference (cumulative_arg } #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES msp430_callee_copies - -static bool -msp430_callee_copies (cumulative_args_t cap ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, - bool named ATTRIBUTE_UNUSED) -{ - return true; -} +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #undef TARGET_FUNCTION_ARG_ADVANCE #define TARGET_FUNCTION_ARG_ADVANCE msp430_function_arg_advance Index: gcc/config/pa/pa.c =================================================================== --- gcc/config/pa/pa.c 2019-08-19 15:58:50.337919057 +0100 +++ gcc/config/pa/pa.c 2019-08-19 15:58:58.009863545 +0100 @@ -197,8 +197,7 @@ static bool pa_cannot_force_const_mem (m static bool pa_legitimate_constant_p (machine_mode, rtx); static unsigned int pa_section_type_flags (tree, const char *, int); static bool pa_legitimate_address_p (machine_mode, rtx, bool); -static bool pa_callee_copies (cumulative_args_t, machine_mode, - const_tree, bool); +static bool pa_callee_copies (cumulative_args_t, const function_arg_info &); static unsigned int pa_hard_regno_nregs (unsigned int, machine_mode); static bool pa_hard_regno_mode_ok (unsigned int, machine_mode); static bool pa_modes_tieable_p (machine_mode, machine_mode); @@ -10764,10 +10763,7 @@ pa_maybe_emit_compare_and_swap_exchange_ in the 64-bit HP runtime. */ static bool -pa_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type ATTRIBUTE_UNUSED, - bool named ATTRIBUTE_UNUSED) +pa_callee_copies (cumulative_args_t, const function_arg_info &) { return !TARGET_CALLER_COPIES; } Index: gcc/config/sh/sh.c =================================================================== --- gcc/config/sh/sh.c 2019-08-19 15:58:50.337919057 +0100 +++ gcc/config/sh/sh.c 2019-08-19 15:58:58.013863514 +0100 @@ -296,8 +296,7 @@ static machine_mode sh_promote_function_ int for_return); static bool sh_pass_by_reference (cumulative_args_t, const function_arg_info &); -static bool sh_callee_copies (cumulative_args_t, machine_mode, - const_tree, bool); +static bool sh_callee_copies (cumulative_args_t, const function_arg_info &); static int sh_arg_partial_bytes (cumulative_args_t, const function_arg_info &); static void sh_function_arg_advance (cumulative_args_t, const function_arg_info &); @@ -7915,14 +7914,15 @@ sh_pass_by_reference (cumulative_args_t } static bool -sh_callee_copies (cumulative_args_t cum, machine_mode mode, - const_tree type, bool named ATTRIBUTE_UNUSED) +sh_callee_copies (cumulative_args_t cum, const function_arg_info &arg) { /* ??? How can it possibly be correct to return true only on the caller side of the equation? Is there someplace else in the sh backend that's magically producing the copies? */ return (get_cumulative_args (cum)->outgoing - && ((mode == BLKmode ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) + && ((arg.mode == BLKmode + ? TYPE_ALIGN (arg.type) + : GET_MODE_ALIGNMENT (arg.mode)) % SH_MIN_ALIGN_FOR_CALLEE_COPY == 0)); } Index: gcc/config/v850/v850.c =================================================================== --- gcc/config/v850/v850.c 2019-08-19 15:58:50.341919030 +0100 +++ gcc/config/v850/v850.c 2019-08-19 15:58:58.013863514 +0100 @@ -3263,7 +3263,7 @@ #define TARGET_RETURN_IN_MEMORY v850_ret #define TARGET_PASS_BY_REFERENCE v850_pass_by_reference #undef TARGET_CALLEE_COPIES -#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true +#define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true #undef TARGET_ARG_PARTIAL_BYTES #define TARGET_ARG_PARTIAL_BYTES v850_arg_partial_bytes