On April 24, 2019 10:02:00 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> 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 <ja...@redhat.com> > > 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