aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-20 23:41:26 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-20 23:41:26 +0100
commitb2d6c9e88c22c18b1109bb39f265f64fffdbb901 (patch)
treebcb70f7063bd66f7d8aa1217e5cf490b3555fb64
parentc5a32f1ae9300e3fa4c4d8d59bc178aec6600c19 (diff)
downloadgcc-b2d6c9e88c22c18b1109bb39f265f64fffdbb901.zip
gcc-b2d6c9e88c22c18b1109bb39f265f64fffdbb901.tar.gz
gcc-b2d6c9e88c22c18b1109bb39f265f64fffdbb901.tar.bz2
re PR tree-optimization/88074 (g++ hangs on math expression)
PR middle-end/88074 PR middle-end/89415 * toplev.c (do_compile): Double the emin/emax exponents to workaround buggy mpc_norm. * gcc.dg/pr88074-2.c: New test. From-SVN: r269055
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr88074-2.c17
-rw-r--r--gcc/toplev.c8
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f164119..1babbc7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/88074
+ PR middle-end/89415
+ * toplev.c (do_compile): Double the emin/emax exponents to workaround
+ buggy mpc_norm.
+
2019-02-20 Uroš Bizjak <ubizjak@gmail.com>
PR target/89397
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6be764f..b5e800c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2019-02-20 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/88074
+ PR middle-end/89415
+ * gcc.dg/pr88074-2.c: New test.
+
PR c++/89336
* g++.dg/cpp1y/constexpr-89336-3.C: New test.
diff --git a/gcc/testsuite/gcc.dg/pr88074-2.c b/gcc/testsuite/gcc.dg/pr88074-2.c
new file mode 100644
index 0000000..a93c19d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr88074-2.c
@@ -0,0 +1,17 @@
+/* PR middle-end/88074 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+/* { dg-final { scan-tree-dump-not "link_error " "optimized" } } */
+
+extern void link_error (void);
+int
+main ()
+{
+ if (((__FLT128_MAX__ * 0.5 + __FLT128_MAX__ * 0.5i)
+ / (__FLT128_MAX__ * 0.25 + __FLT128_MAX__ * 0.25i))
+ != (_Complex _Float128) 2)
+ link_error ();
+ return 0;
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index d8096ce..d3719ff 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -2173,8 +2173,12 @@ do_compile ()
max_exp = fmt->emax;
}
}
- if (mpfr_set_emin (min_exp)
- || mpfr_set_emax (max_exp))
+ /* E.g. mpc_norm assumes it can square a number without bothering with
+ with range scaling, so until that is fixed, double the minimum
+ and maximum exponents, plus add some buffer for arithmetics
+ on the squared numbers. */
+ if (mpfr_set_emin (2 * (min_exp - 1))
+ || mpfr_set_emax (2 * (max_exp + 1)))
sorry ("mpfr not configured to handle all float modes");
/* Set up the back-end if requested. */