On March 21, 2018 9:24:06 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>On the following testcase, path isolation decides to duplicate a bb and
>redirect edge from ENTRY bb to its successor to this duplicate bb and
>tree cleanup then removes all other basic blocks as unreachable.
>
>When blocks are removed, forced labels are moved to their bb->prev_bb
>block,
>but inserting any stmts into the ENTRY bb is of course invalid.
>
>This patch makes sure we insert it into the ENTRY successor instead in
>that
>case.  Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
>trunk?

OK. 

Richard. 

>2018-03-21  Jakub Jelinek  <ja...@redhat.com>
>
>       PR tree-optimization/84960
>       * tree-cfg.c (remove_bb): Don't move forced labels into bb->prev_bb
>       if it is ENTRY block, move them into single succ of ENTRY in that
>case.
>
>       * gcc.c-torture/compile/pr84960.c: New test.
>
>--- gcc/tree-cfg.c.jj  2018-02-09 06:44:38.445804410 +0100
>+++ gcc/tree-cfg.c     2018-03-21 12:43:57.835337795 +0100
>@@ -2301,6 +2301,12 @@ remove_bb (basic_block bb)
>               }
> 
>             new_bb = bb->prev_bb;
>+            /* Don't move any labels into ENTRY block.  */
>+            if (new_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
>+              {
>+                new_bb = single_succ (new_bb);
>+                gcc_assert (new_bb != bb);
>+              }
>             new_gsi = gsi_start_bb (new_bb);
>             gsi_remove (&i, false);
>             gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
>--- gcc/testsuite/gcc.c-torture/compile/pr84960.c.jj   2018-03-21
>12:49:15.299278319 +0100
>+++ gcc/testsuite/gcc.c-torture/compile/pr84960.c      2018-03-21
>12:49:04.245280389 +0100
>@@ -0,0 +1,17 @@
>+/* PR tree-optimization/84960 */
>+/* { dg-do compile { target indirect_jumps } } */
>+
>+void
>+foo (unsigned int a, float b, void *c)
>+{
>+lab:
>+  if ((b - (a %= 0) < 1U) * -1U)
>+    ;
>+  else
>+    {
>+      unsigned int f = a;
>+      __builtin_unreachable ();
>+      c = &&lab;
>+    }
>+  goto *c;
>+}
>
>       Jakub

Reply via email to