From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id D3DD938582A3; Wed, 29 Mar 2023 11:56:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D3DD938582A3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1680090993; bh=6Gw0C4okORg0YDj0P+ilOkhHNzc5qAuzi8yIInq1KWc=; h=From:To:Subject:Date:From; b=ZFHL3oXv5+pi+O81pBORhJCK0cs328eFkaD89BMsxx3J0N8iByOpf+MdUox4Lkkcd VfOGmYzMIKODSSz+RhP9CSKdK9Tqj4QAsm1dnOr1kDQwNtbkk3MzBlUXvGQnPiPPIR xpdkboZayukW6Hv9ZM1anKoIbrIcVFjCzy4GWMTk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-6928] tree-optimization/109331 - make sure to clean up the CFG after forwprop X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: ad32fcb8e91ba85cb4676c6249b6adc4b0daf9df X-Git-Newrev: 86efc490ab86bfa00720479b4714da23cd7df797 Message-Id: <20230329115633.D3DD938582A3@sourceware.org> Date: Wed, 29 Mar 2023 11:56:33 +0000 (GMT) List-Id: https://gcc.gnu.org/g:86efc490ab86bfa00720479b4714da23cd7df797 commit r13-6928-g86efc490ab86bfa00720479b4714da23cd7df797 Author: Richard Biener Date: Wed Mar 29 11:59:16 2023 +0200 tree-optimization/109331 - make sure to clean up the CFG after forwprop When forwprop discovers unreachable code or makes decisions based on unreachable edges make sure to cleanup the CFG since otherwise SSA form can become invalid. PR tree-optimization/109331 * tree-ssa-forwprop.cc (pass_forwprop::execute): When we discover a taken edge make sure to cleanup the CFG. * gcc.dg/torture/pr109331.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/torture/pr109331.c | 16 ++++++++++++++++ gcc/tree-ssa-forwprop.cc | 6 +++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr109331.c b/gcc/testsuite/gcc.dg/torture/pr109331.c new file mode 100644 index 00000000000..72c57b9b74c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr109331.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +char *ustol_dpp; +void ustol(int flags) +{ + char *s; + if (s) + flags |= 3; + switch (flags & 3) + case 3: + while (*s) + case '+': + ++s; + if (flags) + ustol_dpp = s; +} diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc index bb0fa306312..9b567440ba4 100644 --- a/gcc/tree-ssa-forwprop.cc +++ b/gcc/tree-ssa-forwprop.cc @@ -4046,7 +4046,11 @@ pass_forwprop::execute (function *fun) /* Mark outgoing exectuable edges. */ if (edge e = find_taken_edge (bb, NULL)) - e->flags |= EDGE_EXECUTABLE; + { + e->flags |= EDGE_EXECUTABLE; + if (EDGE_COUNT (bb->succs) > 1) + cfg_changed = true; + } else { FOR_EACH_EDGE (e, ei, bb->succs)