Hi!

While we in theory could move over the EH stuff from the division
instructions to the multiplication ones (right now we do not do even that),
we would need to add EH even to the divisions added by insert_reciprocals.

The following patch just punts on divisions that can throw internally,
bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

If it affects some important -fnon-call-exceptions codebase and anyone is
interested in handling it differently, it can be always reverted and handled
properly.

2019-04-16  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/90090
        * tree-ssa-math-opts.c (is_division_by): Ignore divisions that can
        throw internally.
        (is_division_by_square): Likewise.  Formatting fix.

        * g++.dg/opt/pr90090.C: New test.

--- gcc/tree-ssa-math-opts.c.jj 2019-04-08 10:11:28.620219138 +0200
+++ gcc/tree-ssa-math-opts.c    2019-04-15 09:42:22.173868303 +0200
@@ -334,7 +334,8 @@ is_division_by (gimple *use_stmt, tree d
         /* Do not recognize x / x as valid division, as we are getting
            confused later by replacing all immediate uses x in such
            a stmt.  */
-        && gimple_assign_rhs1 (use_stmt) != def;
+        && gimple_assign_rhs1 (use_stmt) != def
+        && !stmt_can_throw_internal (cfun, use_stmt);
 }
 
 /* Return TRUE if USE_STMT is a multiplication of DEF by A.  */
@@ -367,13 +368,12 @@ is_division_by_square (gimple *use_stmt,
 {
   if (gimple_code (use_stmt) == GIMPLE_ASSIGN
       && gimple_assign_rhs_code (use_stmt) == RDIV_EXPR
-      && gimple_assign_rhs1 (use_stmt) != gimple_assign_rhs2 (use_stmt))
+      && gimple_assign_rhs1 (use_stmt) != gimple_assign_rhs2 (use_stmt)
+      && !stmt_can_throw_internal (cfun, use_stmt))
     {
       tree denominator = gimple_assign_rhs2 (use_stmt);
       if (TREE_CODE (denominator) == SSA_NAME)
-       {
-         return is_square_of (SSA_NAME_DEF_STMT (denominator), def);
-       }
+       return is_square_of (SSA_NAME_DEF_STMT (denominator), def);
     }
   return 0;
 }
--- gcc/testsuite/g++.dg/opt/pr90090.C.jj       2019-04-15 10:34:58.151821097 
+0200
+++ gcc/testsuite/g++.dg/opt/pr90090.C  2019-04-15 10:36:12.856620867 +0200
@@ -0,0 +1,19 @@
+// PR tree-optimization/90090
+// { dg-do compile }
+// { dg-options "-Ofast -fno-associative-math -fsignaling-nans -fno-tree-dce 
-fnon-call-exceptions" }
+
+double bar (double, double, double, double, double);
+double baz ();
+
+double
+foo (double a)
+{
+  try
+    {
+      return bar (1.0/a, 2.0/a, 4.0/a, 8.0/a, 16.0/a);
+    }
+  catch (...)
+    {
+      return baz ();
+    }
+}

        Jakub

Reply via email to