From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 51520 invoked by alias); 15 Jan 2020 12:33:39 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 51510 invoked by uid 89); 15 Jan 2020 12:33:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.1 spammy=39107 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 15 Jan 2020 12:33:29 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 60F27ACA3 for ; Wed, 15 Jan 2020 12:33:27 +0000 (UTC) Date: Wed, 15 Jan 2020 13:19:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] middle-end/93273 - fix sinking clobbers across backedges Message-ID: User-Agent: Alpine 2.21 (LSU 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2020-01/txt/msg00880.txt.bz2 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. Bootstrap & regtest on x86_64-unknown-linux-gnu in progress. Richard. 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 8ef85773d7a..a4d772b1c69 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 Richard Biener * alias.c (record_alias_subset): Avoid redundant work when diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 879d7b1d4a3..7ab3e33c134 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 Joseph Myers PR c/93072 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.16.4