aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-02-25 11:17:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-02-25 11:17:31 +0100
commit98561a9b580924293278921f25b5f588e587a4af (patch)
tree7f16fff7359d19855690094fa2060ab4af1435f5 /gcc
parent9d975cb6a6cf049da5c0c3fada48a9dc3c016c63 (diff)
downloadgcc-98561a9b580924293278921f25b5f588e587a4af.zip
gcc-98561a9b580924293278921f25b5f588e587a4af.tar.gz
gcc-98561a9b580924293278921f25b5f588e587a4af.tar.bz2
re PR middle-end/79396 (ICE (verify_flow_info failed) with -fnon-call-exceptions -O2 -march=haswell)
PR middle-end/79396 * tree-eh.c (operation_could_trap_p, stmt_could_throw_1_p): Handle FMA_EXPR like tcc_binary or tcc_unary. * g++.dg/opt/pr79396.C: New test. From-SVN: r245735
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr79396.C13
-rw-r--r--gcc/tree-eh.c6
4 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 04d95a3..18410bc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2017-02-25 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/79396
+ * tree-eh.c (operation_could_trap_p, stmt_could_throw_1_p): Handle
+ FMA_EXPR like tcc_binary or tcc_unary.
+
* tree-ssa-loop-niter.c (number_of_iterations_exit): Simplify warning.
PR debug/77589
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6e37ca9..e2850e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/79396
+ * g++.dg/opt/pr79396.C: New test.
+
2017-02-25 Dominique d'Humieres <dominiq@lps.ens.fr>
PR fortran/79597
diff --git a/gcc/testsuite/g++.dg/opt/pr79396.C b/gcc/testsuite/g++.dg/opt/pr79396.C
new file mode 100644
index 0000000..328c271
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr79396.C
@@ -0,0 +1,13 @@
+// PR middle-end/79396
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions -O2" }
+// { dg-additional-options "-mfma" { target i?86-*-* x86_64-*-* } }
+
+struct A { A (); ~A (); };
+
+float
+foo (float x)
+{
+ A a;
+ return __builtin_pow (x, 2) + 2;
+}
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index 42fe9df..0b785e9 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -2513,7 +2513,8 @@ operation_could_trap_p (enum tree_code op, bool fp_operation, bool honor_trapv,
if (TREE_CODE_CLASS (op) != tcc_comparison
&& TREE_CODE_CLASS (op) != tcc_unary
- && TREE_CODE_CLASS (op) != tcc_binary)
+ && TREE_CODE_CLASS (op) != tcc_binary
+ && op != FMA_EXPR)
return false;
return operation_could_trap_helper_p (op, fp_operation, honor_trapv,
@@ -2738,7 +2739,8 @@ stmt_could_throw_1_p (gimple *stmt)
if (TREE_CODE_CLASS (code) == tcc_comparison
|| TREE_CODE_CLASS (code) == tcc_unary
- || TREE_CODE_CLASS (code) == tcc_binary)
+ || TREE_CODE_CLASS (code) == tcc_binary
+ || code == FMA_EXPR)
{
if (is_gimple_assign (stmt)
&& TREE_CODE_CLASS (code) == tcc_comparison)