diff options
author | Richard Biener <rguenther@suse.de> | 2020-01-15 13:29:25 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-01-15 15:40:51 +0100 |
commit | 37e27de43133b87ceb529d863f0d1f54d87cf2d8 (patch) | |
tree | a222548477cde34a8d48a9227f5f04b1853ef429 /gcc | |
parent | a52d93219c63d38fa9a97d0eb727e7fcc935e9b3 (diff) | |
download | gcc-37e27de43133b87ceb529d863f0d1f54d87cf2d8.zip gcc-37e27de43133b87ceb529d863f0d1f54d87cf2d8.tar.gz gcc-37e27de43133b87ceb529d863f0d1f54d87cf2d8.tar.bz2 |
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 <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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr93273.C | 12 | ||||
-rw-r--r-- | gcc/tree-eh.c | 4 |
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0c961d..0ad4e97 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f0f177..da638d3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..229642b --- /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 dc80f57..454b22c 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); |