This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, Fortran] PR54350 - fix freeing of gfc_ss scalarizer variables


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]