aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-eh.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-01-15 13:29:25 +0100
committerRichard Biener <rguenther@suse.de>2020-01-15 15:40:51 +0100
commit37e27de43133b87ceb529d863f0d1f54d87cf2d8 (patch)
treea222548477cde34a8d48a9227f5f04b1853ef429 /gcc/tree-eh.c
parenta52d93219c63d38fa9a97d0eb727e7fcc935e9b3 (diff)
downloadgcc-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/tree-eh.c')
-rw-r--r--gcc/tree-eh.c4
1 files changed, 3 insertions, 1 deletions
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);