From patchwork Thu Aug 16 14:40:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 178009 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 3E4142C0096 for ; Fri, 17 Aug 2012 00:40:30 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1345732831; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:In-Reply-To:References:Date: Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List: Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:Sender:Delivered-To; bh=ysjR4cLG2rudSDmZh5OzkcqljqQ=; b=w0rE6wCvh/PtHXMKG4shADEpxC4k0h6SuCjIEIPuTTrpy4f0UPXui1lT0JIwNd Z2gauMvfcb8UkdLJqD38B2VWpM2iGc5/wUnqH/eHOdQH5xRQQFnww0UtRnneDwkB jI0/Wj0DbODtOQ9Iqczudd6fVWdon9SnhTPpgX4HeEFu4= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:MIME-Version:Received:Received:In-Reply-To:References:Date:Message-ID:Subject:From:To:Cc:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=aO6bzGi2d/w2kc2omKxnf5xd1WbjUMc6frZuKnot4lc8asKXIYN67OmUIBXEQ0 hNzFm6VnNrK8t/icCeFO4OlQD949aj9IC7IULnRopcTHSadR7D3J/7S0MoGm539Q U6CkwrFElhTgswlDrO6UZbi3KaPeHhyVwM6yV90ZzZHII=; Received: (qmail 15652 invoked by alias); 16 Aug 2012 14:40:24 -0000 Received: (qmail 15400 invoked by uid 22791); 16 Aug 2012 14:40:21 -0000 X-SWARE-Spam-Status: No, hits=-5.0 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-vc0-f175.google.com (HELO mail-vc0-f175.google.com) (209.85.220.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 16 Aug 2012 14:40:06 +0000 Received: by vcbfy27 with SMTP id fy27so2583160vcb.20 for ; Thu, 16 Aug 2012 07:40:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.52.38.65 with SMTP id e1mr508680vdk.110.1345128005216; Thu, 16 Aug 2012 07:40:05 -0700 (PDT) Received: by 10.58.234.39 with HTTP; Thu, 16 Aug 2012 07:40:05 -0700 (PDT) In-Reply-To: References: <20120815235059.GA12536@intel.com> Date: Thu, 16 Aug 2012 07:40:05 -0700 Message-ID: Subject: Re: PATCH: Replace target MEMBER_TYPE_FORCES_BLK macro with a target hook From: "H.J. Lu" To: Richard Guenther Cc: gcc-patches@gcc.gnu.org X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Thu, Aug 16, 2012 at 3:09 AM, Richard Guenther wrote: > On Thu, Aug 16, 2012 at 1:50 AM, H.J. Lu wrote: >> Hi, >> >> This patch replaces MEMBER_TYPE_FORCES_BLK with a target hook. I >> also pass the type to the target hook in addition to field, which will >> be used by i386 backend for >> >> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20020 >> >> This patch doesn't change code generation. Tested on Linux/x86-64. I >> also tested cross compilers to ia64-hpux, powerpc-linux and xtensa-linux >> up to cc1. OK to install? > > Isn't the type just always DECL_FIELD_CONTEXT (field)? > > Btw, with C++ you no longer need ATTRIBUTE_UNUSED, just give the > parameter no name. > You are right. Now I don't need to replace MEMBER_TYPE_FORCES_BLK with a target hook for PR 20020. Since I already made the change, here is the updated patch. OK to install? If we don't want to convert MEMBER_TYPE_FORCES_BLK, I can submit a patch to use MEMBER_TYPE_FORCES_BLK in i386 backend. Thanks. diff --git a/gcc/config/ia64/hpux.h b/gcc/config/ia64/hpux.h index ad106b4..d9ae109 100644 --- a/gcc/config/ia64/hpux.h +++ b/gcc/config/ia64/hpux.h @@ -115,9 +115,6 @@ do { \ #define TARGET_DEFAULT \ (MASK_DWARF2_ASM | MASK_BIG_ENDIAN | MASK_ILP32) -/* ??? Might not be needed anymore. */ -#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) ((MODE) == TFmode) - /* ASM_OUTPUT_EXTERNAL_LIBCALL defaults to just a globalize_label call, but that doesn't put out the @function type information which causes shared library problems. */ diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index c7fb559..f2f02c8 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -319,6 +319,7 @@ static const char *ia64_invalid_binary_op (int, const_tree, const_tree); static enum machine_mode ia64_c_mode_for_suffix (char); static void ia64_trampoline_init (rtx, tree, rtx); static void ia64_override_options_after_change (void); +static bool ia64_member_type_forces_blk (const_tree, enum machine_mode); static tree ia64_builtin_decl (unsigned, bool); @@ -570,6 +571,9 @@ static const struct attribute_spec ia64_attribute_table[] = #undef TARGET_GET_RAW_ARG_MODE #define TARGET_GET_RAW_ARG_MODE ia64_get_reg_raw_mode +#undef TARGET_MEMBER_TYPE_FORCES_BLK +#define TARGET_MEMBER_TYPE_FORCES_BLK ia64_member_type_forces_blk + #undef TARGET_GIMPLIFY_VA_ARG_EXPR #define TARGET_GIMPLIFY_VA_ARG_EXPR ia64_gimplify_va_arg @@ -11153,6 +11157,15 @@ ia64_get_reg_raw_mode (int regno) return default_get_reg_raw_mode(regno); } +/* Implement TARGET_MEMBER_TYPE_FORCES_BLK. ??? Might not be needed + anymore. */ + +bool +ia64_member_type_forces_blk (const_tree, enum machine_mode mode) +{ + return TARGET_HPUX && mode == TFmode; +} + /* Always default to .text section until HP-UX linker is fixed. */ ATTRIBUTE_UNUSED static section * diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 34948fb..57c4823 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1302,6 +1302,9 @@ static const struct attribute_spec rs6000_attribute_table[] = #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra +#undef TARGET_MEMBER_TYPE_FORCES_BLK +#define TARGET_MEMBER_TYPE_FORCES_BLK rs6000_member_type_forces_blk + /* On rs6000, function arguments are promoted, as are function return values. */ #undef TARGET_PROMOTE_FUNCTION_MODE @@ -7287,6 +7290,26 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode) emit_set: emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1])); } + +/* Return true if a structure, union or array containing FIELD should be + accessed using `BLKMODE'. + + For the SPE, simd types are V2SI, and gcc can be tempted to put the + entire thing in a DI and use subregs to access the internals. + store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the + back-end. Because a single GPR can hold a V2SI, but not a DI, the + best thing to do is set structs to BLKmode and avoid Severe Tire + Damage. + + On e500 v2, DF and DI modes suffer from the same anomaly. DF can + fit into 1, whereas DI still needs two. */ + +static bool +rs6000_member_type_forces_blk (const_tree field, enum machine_mode mode) +{ + return ((TARGET_SPE && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE) + || (TARGET_E500_DOUBLE && mode == DFmode)); +} /* Nonzero if we can use a floating-point register to pass this arg. */ #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \ diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index ec62fc6..ab26f7f 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -701,22 +701,6 @@ extern unsigned rs6000_pointer_size; /* Every structure's size must be a multiple of this. */ #define STRUCTURE_SIZE_BOUNDARY 8 -/* Return 1 if a structure or array containing FIELD should be - accessed using `BLKMODE'. - - For the SPE, simd types are V2SI, and gcc can be tempted to put the - entire thing in a DI and use subregs to access the internals. - store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the - back-end. Because a single GPR can hold a V2SI, but not a DI, the - best thing to do is set structs to BLKmode and avoid Severe Tire - Damage. - - On e500 v2, DF and DI modes suffer from the same anomaly. DF can - fit into 1, whereas DI still needs two. */ -#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \ - ((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \ - || (TARGET_E500_DOUBLE && (MODE) == DFmode)) - /* A bit-field declared as `int' forces `int' alignment for the struct. */ #define PCC_BITFIELD_TYPE_MATTERS 1 diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index fa38008..6fbb3f6 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -175,6 +175,9 @@ static reg_class_t xtensa_secondary_reload (bool, rtx, reg_class_t, static bool constantpool_address_p (const_rtx addr); static bool xtensa_legitimate_constant_p (enum machine_mode, rtx); +static bool xtensa_member_type_forces_blk (const_tree, + enum machine_mode mode); + static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] = REG_ALLOC_ORDER; @@ -210,6 +213,9 @@ static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] = #undef TARGET_ADDRESS_COST #define TARGET_ADDRESS_COST hook_int_rtx_bool_0 +#undef TARGET_MEMBER_TYPE_FORCES_BLK +#define TARGET_MEMBER_TYPE_FORCES_BLK xtensa_member_type_forces_blk + #undef TARGET_BUILD_BUILTIN_VA_LIST #define TARGET_BUILD_BUILTIN_VA_LIST xtensa_build_builtin_va_list @@ -2738,6 +2744,18 @@ xtensa_return_addr (int count, rtx frame) return result; } +/* Disable the use of word-sized or smaller complex modes for structures, + and for function arguments in particular, where they cause problems with + register a7. The xtensa_copy_incoming_a7 function assumes that there is + a single reference to an argument in a7, but with small complex modes the + real and imaginary components may be extracted separately, leading to two + uses of the register, only one of which would be replaced. */ + +static bool +xtensa_member_type_forces_blk (const_tree, enum machine_mode mode) +{ + return mode == CQImode || mode == CHImode; +} /* Create the va_list data type. diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index b1a24c6..50e221a 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -165,15 +165,6 @@ extern unsigned xtensa_current_frame_size; bitfields and the structures that contain them. */ #define PCC_BITFIELD_TYPE_MATTERS 1 -/* Disable the use of word-sized or smaller complex modes for structures, - and for function arguments in particular, where they cause problems with - register a7. The xtensa_copy_incoming_a7 function assumes that there is - a single reference to an argument in a7, but with small complex modes the - real and imaginary components may be extracted separately, leading to two - uses of the register, only one of which would be replaced. */ -#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \ - ((MODE) == CQImode || (MODE) == CHImode) - /* Align string constants and constructors to at least a word boundary. The typical use of this macro is to increase alignment for string constants to be word aligned so that 'strcpy' calls that copy diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 2a2d500..1e9e7a6 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -1262,9 +1262,9 @@ these accesses should use the bitfield container type. The default is @code{!TARGET_STRICT_ALIGN}. @end deftypefn -@defmac MEMBER_TYPE_FORCES_BLK (@var{field}, @var{mode}) -Return 1 if a structure or array containing @var{field} should be accessed using -@code{BLKMODE}. +@deftypefn {Target Hook} bool TARGET_MEMBER_TYPE_FORCES_BLK (const_tree @var{field}, enum machine_mode @var{mode}) +Return true if a structure, union or array containing @var{field} should +be accessed using @code{BLKMODE}. If @var{field} is the only field in the structure, @var{mode} is its mode, otherwise @var{mode} is VOIDmode. @var{mode} is provided in the @@ -1272,7 +1272,7 @@ case where structures of one field would require the structure's mode to retain the field's mode. Normally, this is not needed. -@end defmac +@end deftypefn @defmac ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified}) Define this macro as an expression for the alignment of a type (given diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index e7d9cec..d20b8aa 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -1240,9 +1240,9 @@ these accesses should use the bitfield container type. The default is @code{!TARGET_STRICT_ALIGN}. @end deftypefn -@defmac MEMBER_TYPE_FORCES_BLK (@var{field}, @var{mode}) -Return 1 if a structure or array containing @var{field} should be accessed using -@code{BLKMODE}. +@hook TARGET_MEMBER_TYPE_FORCES_BLK +Return true if a structure, union or array containing @var{field} should +be accessed using @code{BLKMODE}. If @var{field} is the only field in the structure, @var{mode} is its mode, otherwise @var{mode} is VOIDmode. @var{mode} is provided in the @@ -1250,7 +1250,7 @@ case where structures of one field would require the structure's mode to retain the field's mode. Normally, this is not needed. -@end defmac +@end deftypefn @defmac ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified}) Define this macro as an expression for the alignment of a type (given diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 53554a9..0f55594 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1627,13 +1627,10 @@ compute_record_mode (tree type) if (simple_cst_equal (TYPE_SIZE (type), DECL_SIZE (field))) mode = DECL_MODE (field); -#ifdef MEMBER_TYPE_FORCES_BLK - /* With some targets, eg. c4x, it is sub-optimal - to access an aligned BLKmode structure as a scalar. */ - - if (MEMBER_TYPE_FORCES_BLK (field, mode)) + /* With some targets, it is sub-optimal to access an aligned + BLKmode structure as a scalar. */ + if (targetm.member_type_forces_blk (field, mode)) return; -#endif /* MEMBER_TYPE_FORCES_BLK */ } /* If we only have one real field; use its mode if that mode's size @@ -2270,9 +2267,7 @@ layout_type (tree type) TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (element); SET_TYPE_MODE (type, BLKmode); if (TYPE_SIZE (type) != 0 -#ifdef MEMBER_TYPE_FORCES_BLK - && ! MEMBER_TYPE_FORCES_BLK (type, VOIDmode) -#endif + && ! targetm.member_type_forces_blk (type, VOIDmode) /* BLKmode elements force BLKmode aggregate; else extract/store fields may lose. */ && (TYPE_MODE (TREE_TYPE (type)) != BLKmode diff --git a/gcc/system.h b/gcc/system.h index 9e7d503..48c9c89 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -808,7 +808,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; CAN_DEBUG_WITHOUT_FP UNLIKELY_EXECUTED_TEXT_SECTION_NAME \ HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P ALWAYS_STRIP_DOTDOT \ OUTPUT_ADDR_CONST_EXTRA SMALL_REGISTER_CLASSES ASM_OUTPUT_IDENT \ - ASM_BYTE_OP + ASM_BYTE_OP MEMBER_TYPE_FORCES_BLK /* Target macros only used for code built for the target, that have moved to libgcc-tm.h or have never been present elsewhere. */ diff --git a/gcc/target.def b/gcc/target.def index 5ac6d48..6f1968d 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -2332,6 +2332,14 @@ DEFHOOK tree, (tree type, tree expr), hook_tree_tree_tree_null) +/* True if a structure, union or array with MODE containing FIELD should + be accessed using BLKmode. */ +DEFHOOK +(member_type_forces_blk, + "", + bool, (const_tree field, enum machine_mode mode), + default_member_type_forces_blk) + /* Return the class for a secondary reload, and fill in extra information. */ DEFHOOK (secondary_reload, diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 52a9912..36f998a 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1513,4 +1513,12 @@ default_pch_valid_p (const void *data_p, size_t len) return NULL; } +/* Default version of member_type_forces_blk. */ + +bool +default_member_type_forces_blk (const_tree, enum machine_mode) +{ + return false; +} + #include "gt-targhooks.h" diff --git a/gcc/targhooks.h b/gcc/targhooks.h index f1cc403..aa8b3ba 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -189,3 +189,4 @@ extern const char *default_pch_valid_p (const void *, size_t); extern void default_asm_output_ident_directive (const char*);