aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2019-02-23 00:14:52 +0000
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-23 01:14:52 +0100
commit0d527f0d31acd5f41ec6dc01ac4b8b5ab432b8ed (patch)
tree5927151576089aa92ef77733188bd5f8a3c8bd54 /gcc/fortran/simplify.c
parent01d3d58151a8e8f21e92b4b29069be6fe6af7057 (diff)
downloadgcc-0d527f0d31acd5f41ec6dc01ac4b8b5ab432b8ed.zip
gcc-0d527f0d31acd5f41ec6dc01ac4b8b5ab432b8ed.tar.gz
gcc-0d527f0d31acd5f41ec6dc01ac4b8b5ab432b8ed.tar.bz2
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
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index fa6396b..942f2ee 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -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);