On April 6, 2018 6:04:48 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>When create_preheader is called with CP_FALLTHRU_PREHEADERS and
>the loop header is cold, but the bb dominating the loop is hot (or vice
>versa) and there are just 2 incoming edges into the header, we use
>split_edge, which unfortunately make the new bb use the partition of
>the
>source rather than destination, so this newly created preheader is
>never
>fallthru without jump, because the edge is EDGE_CROSSING.
>
>Fixed by forcing to use make_forwarder_block in that case, that uses
>the
>partition of the bb on which it is called (i.e. loop header).
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK. 

Richard. 
>2018-04-06  Jakub Jelinek  <ja...@redhat.com>
>
>       PR rtl-optimization/84872
>       * cfgloopmanip.c (create_preheader): Use make_forwarder_block even if
>       nentry == 1 when CP_FALLTHRU_PREHEADERS and single_entry is
>       EDGE_CROSSING edge.
>
>       * gcc.dg/graphite/pr84872.c: New test.
>
>--- gcc/cfgloopmanip.c.jj      2018-01-03 10:19:56.065534103 +0100
>+++ gcc/cfgloopmanip.c 2018-04-06 12:57:53.141922946 +0200
>@@ -1494,7 +1494,9 @@ create_preheader (struct loop *loop, int
> 
>   mfb_kj_edge = loop_latch_edge (loop);
>   latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
>-  if (nentry == 1)
>+  if (nentry == 1
>+      && ((flags & CP_FALLTHRU_PREHEADERS) == 0
>+        || (single_entry->flags & EDGE_CROSSING) == 0))
>     dummy = split_edge (single_entry);
>   else
>     {
>--- gcc/testsuite/gcc.dg/graphite/pr84872.c.jj 2018-04-06
>13:06:07.017014715 +0200
>+++ gcc/testsuite/gcc.dg/graphite/pr84872.c    2018-04-06
>13:05:46.358011993 +0200
>@@ -0,0 +1,19 @@
>+/* PR rtl-optimization/84872 */
>+/* { dg-do compile { target pthread } } */
>+/* { dg-options "-O1 -floop-parallelize-all
>-freorder-blocks-and-partition -fschedule-insns2
>-fselective-scheduling2 -fsel-sched-pipelining -fno-tree-dce" } */
>+
>+void
>+foo (int x)
>+{
>+  int a[2];
>+  int b, c = 0;
>+
>+  for (b = 0; b < 2; ++b)
>+    a[b] = 0;
>+  for (b = 0; b < 2; ++b)
>+    a[b] = 0;
>+
>+  while (c < 1)
>+    while (x < 1)
>+      ++x;
>+}
>
>       Jakub

Reply via email to