This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, Fortran] PR54350 - fix freeing of gfc_ss scalarizer variables
- From: Mikael Morin <mikael dot morin at sfr dot fr>
- To: Tobias Burnus <burnus at net-b dot de>
- Cc: gfortran <fortran at gcc dot gnu dot org>, gcc patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 24 Aug 2012 00:27:45 +0200
- Subject: Re: [Patch, Fortran] PR54350 - fix freeing of gfc_ss scalarizer variables
- References: <503514B5.20402@net-b.de> <5035395D.7040606@sfr.fr> <5035FB3E.7030009@net-b.de> <50361AC6.4030700@sfr.fr> <5036474B.7070008@net-b.de> <50368ED4.5080101@net-b.de>
On 23/08/2012 22:13, Tobias Burnus wrote:
> Tobias Burnus wrote:
>> I am now down to a single kind of failure: pointer_remapping_*.f08
>> fails. One has code like:
>> ptr(1:5, 1:2) => arr
>>
>> The question is how to solve that one. If one removes the AR_FULL and
>> sets lse.descriptor_only, the test cases fail; nevetheless, I wonder
>> whether something along those lines could be the solution.
>
> That's what I do now: I added descriptor_only support to
> gfc_conv_expr_descriptor.
>
> The attached patch build and regtested successfully on x86-64-gnu-linux.
> OK for the trunk?
>
OK with...
> diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
> index 8c254dd..891fab4 100644
> --- a/gcc/fortran/trans-array.c
> +++ b/gcc/fortran/trans-array.c
> @@ -510,10 +510,24 @@ gfc_free_ss_chain (gfc_ss * ss)
> static void
> free_ss_info (gfc_ss_info *ss_info)
> {
> + int n;
> +
> ss_info->refcount--;
> if (ss_info->refcount > 0)
> return;
>
> + switch (ss_info->type)
> + {
> + case GFC_SS_SECTION:
> + for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
> + if (ss_info->data.array.subscript[n])
> + gfc_free_ss_chain (ss_info->data.array.subscript[n]);
> + break;
> +
> + default:
> + break;
> + }
> +
> gcc_assert (ss_info->refcount == 0);
> free (ss_info);
> }
... could you move the switch after the assert, and ...
> @@ -6382,6 +6419,16 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
> ss_type = ss_info->type;
> ss_expr = ss_info->expr;
>
> + /* Special case: TRANSPOSE which needs no temporary. */
> + if (expr->expr_type == EXPR_FUNCTION && expr->value.function.isym
> + && expr->value.function.isym->id == GFC_ISYM_TRANSPOSE
> + && NULL != (arg = gfc_get_noncopying_intrinsic_argument (expr)))
> + {
> + /* This is a call to transpose which has already been handled by the
> + scalarizer, so that we just need to get its argument's descriptor. */
> + expr = expr->value.function.actual->expr;
> + }
> +
... make this a while loop...
> @@ -6457,7 +6505,8 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
> gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE);
> /* ... which has already been handled by the scalarizer, so
> that we just need to get its argument's descriptor. */
> - gfc_conv_expr_descriptor (se, expr->value.function.actual->expr, ss);
> + gfc_free_ss_chain (ss);
> + gfc_conv_expr_descriptor (se, expr->value.function.actual->expr);
> return;
> }
>
... so that this part can be removed completely.
Many thanks.
Mikael
PS: My name can be removed from the ChangeLog