Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2018-09-17  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/87301
        * tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_cleanup): Properly
        clean EH info from leftover copy assignments.

        * gcc.dg/torture/pr87301.c: New testcase.

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c        (revision 264357)
+++ gcc/tree-ssa-sccvn.c        (working copy)
@@ -5461,7 +5461,10 @@ eliminate_dom_walker::eliminate_cleanup
                if (is_gimple_assign (stmt))
                  {
                    gimple_assign_set_rhs_from_tree (&gsi, sprime);
-                   update_stmt (gsi_stmt (gsi));
+                   stmt = gsi_stmt (gsi);
+                   update_stmt (stmt);
+                   if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
+                     bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
                    continue;
                  }
                else
Index: gcc/testsuite/gcc.dg/torture/pr87301.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr87301.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr87301.c      (working copy)
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wno-div-by-zero" } */
+
+void
+bl (int *be)
+{
+  int lo;
+    {
+      int **ny;
+
+      if (*be == 0)
+       {
+         int ***k8 = &ny;
+         int uj = (__INTPTR_TYPE__)&lo;
+
+         for (;;)
+           if (***k8 == 0)
+             {
+               uj = !!(1 / 0) ? !(lo = 0) : 0;
+               (void) uj;
+
+               if (*ny == 0)
+                 for (;;)
+                   if (***k8 == 0)
+                     {
+                     }
+
+               for (lo = 0; lo < 2; ++lo)
+                 {
+                 }
+             }
+       }
+    }
+}

Reply via email to