Commit 0d527f0d by David Malcolm Committed by Jakub Jelinek

re PR tree-optimization/88074 (g++ hangs on math expression)

	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.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>

From-SVN: r269139
parent 01d3d581
2019-02-23 David Malcolm <dmalcolm@redhat.com>
Jakub Jelinek <jakub@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.
2019-02-22 Harald Anlauf <anlauf@gmx.de>
PR fortran/83057
......
......@@ -6061,8 +6061,8 @@ norm2_add_squared (gfc_expr *result, gfc_expr *e)
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_expr *e)
}
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_expr *e)
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_expr *dim)
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment