From 37e27de43133b87ceb529d863f0d1f54d87cf2d8 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 15 Jan 2020 13:29:25 +0100 Subject: [PATCH] middle-end/93273 - fix sinking clobbers across backedges 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 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 | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr93273.C | 12 ++++++++++++ gcc/tree-eh.c | 4 +++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr93273.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0c961d059c..0ad4e97d1a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-01-15 Richard Biener + + 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 * BASE-VER: Bump to 10.0.1. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f0f1778719..da638d35809 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-15 Richard Biener + + PR middle-end/93273 + * g++.dg/torture/pr93273.C: New testcase. + 2020-01-15 Richard Sandiford 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 index 00000000000..229642b5456 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr93273.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +void _setjmp(void *); +struct S { ~S(); }; +void * (* fn)(); +void f(); +void g() +{ + S s; + _setjmp(fn()); + []{ f(); }(); +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index dc80f574a2c..454b22cddec 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -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); -- 2.30.2