middle-end/93273 - fix sinking clobbers across backedges
authorRichard Biener <rguenther@suse.de>
Wed, 15 Jan 2020 12:29:25 +0000 (13:29 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 15 Jan 2020 14:40:51 +0000 (15:40 +0100)
The previous work to fix PR93199 didn't take into account backedges
when defering insertion.  The following simply avoids to defer in that
case since we know we'll not take secondary opportunities there.

2020-01-15  Richard Biener  <rguenther@suse.de>

        PR middle-end/93273
        * tree-eh.c (sink_clobbers): If we already visited the destination
        block do not defer insertion.
        (pass_lower_eh_dispatch::execute): Maintain BB_VISITED for
        the purpose of defered insertion.

* g++.dg/torture/pr93273.C: New testcase.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr93273.C [new file with mode: 0644]
gcc/tree-eh.c

index e0c961d059c56b9a3e0f9e884e4801548fa3055f..0ad4e97d1a95adca45627b2c2b51f01bfd922b57 100644 (file)
@@ -1,3 +1,11 @@
+2020-01-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/93273
+       * tree-eh.c (sink_clobbers): If we already visited the destination
+       block do not defer insertion.
+       (pass_lower_eh_dispatch::execute): Maintain BB_VISITED for
+       the purpose of defered insertion.
+
 2020-01-15  Jakub Jelinek  <jakub@redhat.com>
 
        * BASE-VER: Bump to 10.0.1.
index 0f0f177871989a968342316f50212824335c79d5..da638d35809314baf69dfcf1ce4a1ccc44463dc7 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/93273
+       * g++.dg/torture/pr93273.C: New testcase.
+
 2020-01-15  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR tree-optimization/93247
diff --git a/gcc/testsuite/g++.dg/torture/pr93273.C b/gcc/testsuite/g++.dg/torture/pr93273.C
new file mode 100644 (file)
index 0000000..229642b
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+void _setjmp(void *);
+struct S { ~S(); };
+void * (* fn)();
+void f();
+void g()
+{
+  S s;
+  _setjmp(fn());
+  []{ f(); }();
+}
index dc80f574a2cb9eb66e1d4dc9d2f14cef0f906d53..454b22cddece6e3bbe7d8f0ffed8fc06444dd57c 100644 (file)
@@ -3622,7 +3622,7 @@ sink_clobbers (basic_block bb,
 
   gimple *first_sunk = NULL;
   gimple *last_sunk = NULL;
-  if (sunk)
+  if (sunk && !(succbb->flags & BB_VISITED))
     dgsi = gsi_start (sunk[succbb->index]);
   else
     dgsi = gsi_after_labels (succbb);
@@ -3910,6 +3910,7 @@ pass_lower_eh_dispatch::execute (function *fun)
          else if (!any_resx_to_process)
            sink_clobbers (bb, NULL, &any_resx_to_process);
        }
+      bb->flags &= ~BB_VISITED;
     }
   if (redirected)
     {
@@ -3940,6 +3941,7 @@ pass_lower_eh_dispatch::execute (function *fun)
              gsi_insert_seq_before (&gsi, sunk[bb->index], GSI_NEW_STMT);
              sunk[bb->index] = NULL;
            }
+         bb->flags |= BB_VISITED;
        }
       free (rpo);
       free (sunk);