This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix type field walking in gimplifier unsharing
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: Richard Biener <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org, jason at redhat dot com, fortran at gcc dot gnu dot org
- Date: Fri, 29 Apr 2016 10:15:43 +0200
- Subject: Re: [PATCH] Fix type field walking in gimplifier unsharing
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot LSU dot 2 dot 11 dot 1604271030510 dot 13384 at t29 dot fhfr dot qr> <alpine dot LSU dot 2 dot 11 dot 1604281249090 dot 13384 at t29 dot fhfr dot qr> <alpine dot LSU dot 2 dot 11 dot 1604281408350 dot 13384 at t29 dot fhfr dot qr>
> The following works (for the testcase):
>
> Index: gcc/cp/decl.c
> ===================================================================
> --- gcc/cp/decl.c (revision 235547)
> +++ gcc/cp/decl.c (working copy)
> @@ -10393,8 +10393,11 @@ grokdeclarator (const cp_declarator *dec
> && (decl_context == NORMAL || decl_context == FIELD)
> && at_function_scope_p ()
> && variably_modified_type_p (type, NULL_TREE))
> - /* Force evaluation of the SAVE_EXPR. */
> - finish_expr_stmt (TYPE_SIZE (type));
> + {
> + TYPE_NAME (type) = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
> + NULL_TREE, type);
> + add_decl_expr (TYPE_NAME (type));
> + }
>
> if (declarator->kind == cdk_reference)
> {
>
> and I have a similar fix for the Fortran FE for one testcase I
> reduced to
>
> character(10), dimension (2) :: implicit_result
> character(10), dimension (2) :: source
> implicit_result = reallocate_hnv (LEN (source))
> contains
> FUNCTION reallocate_hnv(LEN)
> CHARACTER(LEN=LEN), DIMENSION(:), POINTER :: reallocate_hnv
> END FUNCTION reallocate_hnv
> end
>
> Index: fortran/trans-array.c
> ===================================================================
> --- fortran/trans-array.c (revision 235547)
> +++ fortran/trans-array.c (working copy)
> @@ -1094,6 +1094,16 @@ gfc_trans_create_temp_array (stmtblock_t
> info->descriptor = desc;
> size = gfc_index_one_node;
>
> + /* Emit a DECL_EXPR for the variable sized array type in
> + GFC_TYPE_ARRAY_DATAPTR_TYPE so the gimplification of its type
> + sizes works correctly. */
> + tree arraytype = TREE_TYPE (GFC_TYPE_ARRAY_DATAPTR_TYPE (type));
> + if (! TYPE_NAME (arraytype))
> + TYPE_NAME (arraytype) = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
> + NULL_TREE, arraytype);
> + gfc_add_expr_to_block (pre, build1 (DECL_EXPR,
> + arraytype, TYPE_NAME (arraytype)));
> +
> /* Fill in the array dtype. */
> tmp = gfc_conv_descriptor_dtype (desc);
> gfc_add_modify (pre, tmp, gfc_get_dtype (TREE_TYPE (desc)));
Great. We do exactly that in the Ada compiler (but of course the number of
places where we need to do it is an order of magnitude larger).
> I wonder if we can avoid allocating the TYPE_DECL by simply also
> allowing TREE_TYPE as operand of a DECL_EXPR (to avoid adding
> a 'TYPE_EXPR').
I agree that DECL_EXPR + TYPE_DECL is a bit heavy, but I'm not sure that the
benefit would be worth introducing the irregularity in the IL.
--
Eric Botcazou