On Fri, 2019-02-22 at 14:19 +0100, Jakub Jelinek wrote:
> On Thu, Feb 21, 2019 at 04:50:27PM -0500, David Malcolm wrote:
> > gcc/fortran/ChangeLog:
> >     PR middle-end/88074
> >     * simplify.c (norm2_add_squared): Use mp_exp_t rather than
> >     mpfr_exp_t.
> 
> I have discussed this with Richard on IRC earlier today, there is
> another
> issue that mpfr_regular_p is only 3.0 and later.  And he prefers that
> mp_exp_t over say
> #if MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)
> typedef mp_exp_t mpfr_exp_t;
> #endif
> 
> So, here is the full patch I'll bootstrap/regtest soon:

FWIW, your patch fixed the bootstrap for me (and the regression tests
look sane:
  gfortran.sum : total: 49370 PASS: 49164 XFAIL: 126 UNSUPPORTED: 80
though sadly I've blown away my known-good baseline for comparison)

Dave

> 2019-02-22  David Malcolm  <dmalc...@redhat.com>
>           Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/88074
>       * simplify.c (norm2_do_sqrt, gfc_simplify_norm2): Use
>       mpfr_number_p && !mpfr_zero_p instead of mpfr_regular_p.
>       (norm2_add_squared): Likewise.  Use mp_exp_t rather than
> mpfr_exp_t.
> 
> --- gcc/fortran/simplify.c.jj 2019-02-21 22:20:07.272388243
> +0100
> +++ gcc/fortran/simplify.c    2019-02-22 11:07:36.093374586 +0100
> @@ -6061,8 +6061,8 @@ norm2_add_squared (gfc_expr *result, gfc
>  
>    gfc_set_model_kind (result->ts.kind);
>    int index = gfc_validate_kind (BT_REAL, result->ts.kind, false);
> -  mpfr_exp_t exp;
> -  if (mpfr_regular_p (result->value.real))
> +  mp_exp_t exp;
> +  if (mpfr_number_p (result->value.real) && !mpfr_zero_p (result-
> >value.real))
>      {
>        exp = mpfr_get_exp (result->value.real);
>        /* If result is getting close to overflowing, scale down.  */
> @@ -6076,7 +6076,7 @@ norm2_add_squared (gfc_expr *result, gfc
>      }
>  
>    mpfr_init (tmp);
> -  if (mpfr_regular_p (e->value.real))
> +  if (mpfr_number_p (e->value.real) && !mpfr_zero_p (e->value.real))
>      {
>        exp = mpfr_get_exp (e->value.real);
>        /* If e**2 would overflow or close to overflowing, scale
> down.  */
> @@ -6117,7 +6117,9 @@ norm2_do_sqrt (gfc_expr *result, gfc_exp
>    if (result != e)
>      mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
>    mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
> -  if (norm2_scale && mpfr_regular_p (result->value.real))
> +  if (norm2_scale
> +      && mpfr_number_p (result->value.real)
> +      && !mpfr_zero_p (result->value.real))
>      {
>        mpfr_t tmp;
>        mpfr_init (tmp);
> @@ -6156,7 +6158,9 @@ gfc_simplify_norm2 (gfc_expr *e, gfc_exp
>        result = simplify_transformation_to_scalar (result, e, NULL,
>                                                 norm2_add_squared)
> ;
>        mpfr_sqrt (result->value.real, result->value.real,
> GFC_RND_MODE);
> -      if (norm2_scale && mpfr_regular_p (result->value.real))
> +      if (norm2_scale
> +       && mpfr_number_p (result->value.real)
> +       && !mpfr_zero_p (result->value.real))
>       {
>         mpfr_t tmp;
>         mpfr_init (tmp);
> 
>       Jakub

Reply via email to