On April 24, 2019 10:02:00 AM GMT+02:00, Jakub Jelinek wrote:
>Hi!
>
>The GIMPLE bb removal code doesn't really remove GIMPLE_LABEL
>stmts referencing FORCED_LABELs (and likewise non-local labels,
>except it turns them into FORCED_LABELs), but instead moves them
>at the start of some other bb.
>
>As can be seen on the testcases, that breaks
> if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
>{
> error ("EH landing pad label ");
> print_generic_expr (stderr, label);
> fprintf (stderr, " is not first in a sequence of labels in bb %d",
> bb->index);
> err = 1;
>}
>checking and in theory could break
> if (prev_stmt && DECL_NONLOCAL (label))
>{
> error ("nonlocal label ");
> print_generic_expr (stderr, label);
> fprintf (stderr, " is not first in a sequence of labels in bb %d",
> bb->index);
> err = 1;
>}
>too. Fixed by moving these FORCED_LABELs after the existing labels
>in the other bb, rather than before those.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Richard.
>2019-04-24 Jakub Jelinek
>
> PR tree-optimization/90208
> * tree-cfg.c (remove_bb): Move forced labels from removed bbs
> after labels of new_bb, not before them.
>
> * gcc.dg/tsan/pr90208-1.c: New test.
> * gcc.dg/tsan/pr90208-2.c: New test.
>
>--- gcc/tree-cfg.c.jj 2019-03-14 23:44:27.861560155 +0100
>+++ gcc/tree-cfg.c 2019-04-23 14:40:05.949571172 +0200
>@@ -2265,7 +2265,7 @@ remove_bb (basic_block bb)
> new_bb = single_succ (new_bb);
> gcc_assert (new_bb != bb);
> }
>-new_gsi = gsi_start_bb (new_bb);
>+new_gsi = gsi_after_labels (new_bb);
> gsi_remove (&i, false);
> gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
> }
>--- gcc/testsuite/gcc.dg/tsan/pr90208-1.c.jj 2019-04-23
>14:48:16.034625947 +0200
>+++ gcc/testsuite/gcc.dg/tsan/pr90208-1.c 2019-04-23 14:48:12.450684051
>+0200
>@@ -0,0 +1,5 @@
>+/* PR tree-optimization/90208 */
>+/* { dg-do compile } */
>+/* { dg-options "-O3 -fexceptions -fsanitize=thread" } */
>+
>+#include "../../gcc.c-torture/compile/pr89280.c"
>--- gcc/testsuite/gcc.dg/tsan/pr90208-2.c.jj 2019-04-23
>14:50:23.850553809 +0200
>+++ gcc/testsuite/gcc.dg/tsan/pr90208-2.c 2019-04-23 14:51:09.819808554
>+0200
>@@ -0,0 +1,20 @@
>+/* PR tree-optimization/90208 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fexceptions -fsanitize=thread" } */
>+
>+void *b[5];
>+void foo (void);
>+
>+void
>+bar (int d)
>+{
>+ while (d)
>+foo ();
>+}
>+
>+void
>+baz (void)
>+{
>+ bar (2);
>+ __builtin_setjmp (b);
>+}
>
> Jakub