re PR tree-optimization/92115 (ICE in gimple_cond_get_ops_from_tree, at gimple-expr...
authorJakub Jelinek <jakub@redhat.com>
Thu, 17 Oct 2019 07:20:36 +0000 (09:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 17 Oct 2019 07:20:36 +0000 (09:20 +0200)
PR tree-optimization/92115
* tree-ssa-ifcombine.c (ifcombine_ifandif): Force condition into
temporary if it could trap.

* gcc.dg/pr92115.c: New test.

From-SVN: r277092

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr92115.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c

index afe0d29..5fccbd4 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/92115
+       * tree-ssa-ifcombine.c (ifcombine_ifandif): Force condition into
+       temporary if it could trap.
+
 2019-10-17  Richard Biener  <rguenther@suse.de>
 
        PR debug/91887
index e23272a..c79ba7b 100644 (file)
@@ -1,5 +1,8 @@
 2019-10-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/92115
+       * gcc.dg/pr92115.c: New test.
+
        PR fortran/87752
        * gfortran.dg/gomp/pr87752.f90: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr92115.c b/gcc/testsuite/gcc.dg/pr92115.c
new file mode 100644 (file)
index 0000000..ae506d4
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR tree-optimization/92115 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fexceptions -ffinite-math-only -fnon-call-exceptions -fsignaling-nans -fno-signed-zeros" } */
+
+void
+foo (double x)
+{
+  if (x == 0.0 && !__builtin_signbit (x))
+    __builtin_abort ();
+}
index 90d8bb5..21c1b0e 100644 (file)
@@ -599,6 +599,12 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv,
       t = canonicalize_cond_expr_cond (t);
       if (!t)
        return false;
+      if (!is_gimple_condexpr_for_cond (t))
+       {
+         gsi = gsi_for_stmt (inner_cond);
+         t = force_gimple_operand_gsi_1 (&gsi, t, is_gimple_condexpr_for_cond,
+                                         NULL, true, GSI_SAME_STMT);
+       }
       gimple_cond_set_condition_from_tree (inner_cond, t);
       update_stmt (inner_cond);