This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix up gimple cross-jumping (PR tree-optimization/71643)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>,Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 25 Jun 2016 12:33:34 +0200
- Subject: Re: [PATCH] Fix up gimple cross-jumping (PR tree-optimization/71643)
- Authentication-results: sourceware.org; auth=none
- References: <20160624183401 dot GG7387 at tucnak dot redhat dot com>
On June 24, 2016 8:34:01 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>My recent change to handle labels (other than forced/non-local) caused
>ICE on the following testcase, I thought EH pads would always differ
>with
>the special stuff in them for each region, but with
>__builtin_unreachable
>we can end up with the same bbs, which EH edge redirection isn't able
>to
>cope with though.
>
>So, the following patch disables cross-jumping of bbs with EH incoming
>edges (we weren't allowing that before either, because those need to
>have
>some labels at the start and those were always unique to each bb).
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Thanks,
Richard.
>2016-06-24 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/71643
> * tree-ssa-tail-merge.c (find_clusters_1): Ignore basic blocks with
> EH preds.
>
> * tree-ssa-tail-merge.c (deps_ok_for_redirect_from_bb_to_bb): Don't
> leak a bitmap if dep_bb is NULL.
>
> * g++.dg/opt/pr71643.C: New test.
>
>--- gcc/tree-ssa-tail-merge.c.jj 2016-06-14 12:18:31.000000000 +0200
>+++ gcc/tree-ssa-tail-merge.c 2016-06-24 14:25:37.901398826 +0200
>@@ -1398,11 +1398,11 @@ deps_ok_for_redirect_from_bb_to_bb (basi
> basic_block cd, dep_bb = BB_DEP_BB (to);
> edge_iterator ei;
> edge e;
>- bitmap from_preds = BITMAP_ALLOC (NULL);
>
> if (dep_bb == NULL)
> return true;
>
>+ bitmap from_preds = BITMAP_ALLOC (NULL);
> FOR_EACH_EDGE (e, ei, from->preds)
> bitmap_set_bit (from_preds, e->src->index);
> cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
>@@ -1446,7 +1446,7 @@ find_clusters_1 (same_succ *same_succ)
>/* TODO: handle blocks with phi-nodes. We'll have to find
>corresponding
> phi-nodes in bb1 and bb2, with the same alternatives for the same
> preds. */
>- if (bb_has_non_vop_phi (bb1))
>+ if (bb_has_non_vop_phi (bb1) || bb_has_eh_pred (bb1))
> continue;
>
> nr_comparisons = 0;
>@@ -1454,7 +1454,7 @@ find_clusters_1 (same_succ *same_succ)
> {
> bb2 = BASIC_BLOCK_FOR_FN (cfun, j);
>
>- if (bb_has_non_vop_phi (bb2))
>+ if (bb_has_non_vop_phi (bb2) || bb_has_eh_pred (bb2))
> continue;
>
> if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER
>(bb2))
>--- gcc/testsuite/g++.dg/opt/pr71643.C.jj 2016-06-24 14:21:09.572703177
>+0200
>+++ gcc/testsuite/g++.dg/opt/pr71643.C 2016-06-24 14:20:55.000000000
>+0200
>@@ -0,0 +1,20 @@
>+// PR tree-optimization/71643
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+struct A
>+{
>+ void *operator new (__SIZE_TYPE__, unsigned);
>+ void operator delete (void *, unsigned) { __builtin_unreachable ();
>}
>+ A (int x);
>+ static A *bar (int x) { return new (3) A (x); }
>+};
>+void baz (A *, A *);
>+
>+void
>+foo (int a, int b)
>+{
>+ A *p = A::bar (a);
>+ A *q = A::bar (b);
>+ baz (p, q);
>+}
>
> Jakub