From 432b4f729dff4808de4f3b00ff9b312db095afc3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 17 Oct 2019 09:20:36 +0200 Subject: [PATCH] re PR tree-optimization/92115 (ICE in gimple_cond_get_ops_from_tree, at gimple-expr.c:577) 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 | 6 ++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr92115.c | 10 ++++++++++ gcc/tree-ssa-ifcombine.c | 6 ++++++ 4 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr92115.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index afe0d29f6e1..5fccbd4d1d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-10-17 Jakub Jelinek + + PR tree-optimization/92115 + * tree-ssa-ifcombine.c (ifcombine_ifandif): Force condition into + temporary if it could trap. + 2019-10-17 Richard Biener PR debug/91887 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e23272ae456..c79ba7b989a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-10-17 Jakub Jelinek + 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 index 00000000000..ae506d45081 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr92115.c @@ -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 (); +} diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index 90d8bb5e9e7..21c1b0e8918 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -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); -- 2.30.2