This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fixup loops in DCE (PR middle-end/67005)
- From: Richard Biener <rguenther at suse dot de>
- To: Marek Polacek <polacek at redhat dot com>,GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 27 Aug 2015 18:53:52 +0200
- Subject: Re: [PATCH] Fixup loops in DCE (PR middle-end/67005)
- Authentication-results: sourceware.org; auth=none
- References: <20150827152455 dot GA24595 at redhat dot com>
On August 27, 2015 5:24:55 PM GMT+02:00, Marek Polacek <polacek@redhat.com> wrote:
>The fix for this PR is to also schedule fixup of loops even if we're
>removing
>an entry into an irreducible region -- that might scramble the loop
>structure
>so we need to be careful.
>
>Bootstrapped/regtested on x86_64-linux, ok for trunk?
Actually the edge flag should be redundant and covered by the destination block check.
OK with that removed.
Thanks,
Richard.
>2015-08-27 Marek Polacek <polacek@redhat.com>
>
> PR middle-end/67005
> * tree-ssa-dce.c (remove_dead_stmt): Also schedule fixup if removing
> an entry into an irreducible region.
>
> * gcc.dg/torture/pr67005.c: New test.
>
>diff --git gcc/testsuite/gcc.dg/torture/pr67005.c
>gcc/testsuite/gcc.dg/torture/pr67005.c
>index e69de29..922c5c4 100644
>--- gcc/testsuite/gcc.dg/torture/pr67005.c
>+++ gcc/testsuite/gcc.dg/torture/pr67005.c
>@@ -0,0 +1,15 @@
>+/* { dg-do compile } */
>+
>+int a;
>+void
>+f (void)
>+{
>+ if (!a);
>+ else
>+ lbl:
>+ a = a;
>+
>+ if (a)
>+ a = 8;
>+ goto lbl;
>+}
>diff --git gcc/tree-ssa-dce.c gcc/tree-ssa-dce.c
>index 2d2edc8..b2cd23f 100644
>--- gcc/tree-ssa-dce.c
>+++ gcc/tree-ssa-dce.c
>@@ -1125,10 +1125,12 @@ remove_dead_stmt (gimple_stmt_iterator *i,
>basic_block bb)
> if (e != e2)
> {
> cfg_altered = true;
>- /* If we made a BB unconditionally exit a loop then this
>- transform alters the set of BBs in the loop. Schedule
>- a fixup. */
>- if (loop_exit_edge_p (bb->loop_father, e))
>+ /* If we made a BB unconditionally exit a loop or removed
>+ an entry into an irreducible region, then this transform
>+ alters the set of BBs in the loop. Schedule a fixup. */
>+ if (loop_exit_edge_p (bb->loop_father, e)
>+ || (e2->flags & EDGE_IRREDUCIBLE_LOOP)
>+ || (e2->dest->flags & BB_IRREDUCIBLE_LOOP))
> loops_state_set (LOOPS_NEED_FIXUP);
> remove_edge (e2);
> }
>
> Marek