Marek Polacek <pola...@redhat.com> wrote:

>On Tue, Jan 22, 2013 at 06:44:40PM +0100, Zdenek Dvorak wrote:
>> > I was however worried that we might end up with an edge
>> > coming out of BB
>> > from different loop heading into the header.  In this case setting
>up
>> > loop's latch as the source of the latch edge would be wrong.
>> 
>> Actually, the comment suggesting that possibility does not make much
>sense.
>> A latch (a predecessor of the header H that is dominated by H)
>belongs to
>> the loop headed by H by definition, so I am not quite sure what the
>test was supposed to do.
>> 
>> The latch block may of course belong to a subloop of the loop, but
>that is not
>> forbidden (and it is taken care of further in fix_loop_structure
>through force_single_succ_latches
>> in the situations where we want to avoid this possibility),
>
>Well, okay then, thanks.  So below is the new version of the patch.
>Regtested/bootstrapped on x86_64-linux again, ok for trunk?
>
>Richi, are you with this one?

Yes. I cannot quite remember why I added this extra test. Maybe it's in the 
place I mostly copied this code from as well.

Thanks,
Richard.

>2013-01-22  Marek Polacek  <pola...@redhat.com>
>
>       * cfgloopmanip.c (fix_loop_structure): Remove redundant condition.
>
>       * testsuite/gcc.dg/pr56035.c: New test.
>
>--- gcc/cfgloopmanip.c.mp      2013-01-22 14:11:25.241233824 +0100
>+++ gcc/cfgloopmanip.c 2013-01-22 19:00:39.850689745 +0100
>@@ -1823,10 +1823,8 @@ fix_loop_structure (bitmap changed_bbs)
>       /* If there was no latch, schedule the loop for removal.  */
>       if (!first_latch)
>       loop->header = NULL;
>-      /* If there was a single latch and it belongs to the loop of the
>-       header, record it.  */
>-      else if (latch
>-             && latch->src->loop_father == loop)
>+      /* If there was a single latch, record it.  */
>+      else if (latch)
>       loop->latch = latch->src;
>       /* Otherwise there are multiple latches which are eventually
>          disambiguated below.  */
>--- gcc/testsuite/gcc.dg/pr56035.c.mp  2013-01-22 14:27:21.104614758
>+0100
>+++ gcc/testsuite/gcc.dg/pr56035.c     2013-01-22 14:31:01.642266091 +0100
>@@ -0,0 +1,35 @@
>+/* PR tree-optimization/56035 */
>+/* { dg-do compile } */
>+/* { dg-options "-O1 -ftree-vectorize -fcse-follow-jumps
>-fstrict-overflow" } */
>+
>+short a, c, *p;
>+
>+void
>+f (void)
>+{
>+  int b;
>+
>+  if (c)
>+  lbl1:
>+    for (a = 0; a < 1; a++)
>+      {
>+      for (c = 0; c < 1; c++)
>+        {
>+          goto lbl1;
>+          while (*p++)
>+          lbl2:
>+            ;
>+        }
>+      }
>+
>+  for (;; b++)
>+    {
>+      if (c)
>+      goto lbl2;
>+    lbl3:
>+      for (c = 0; c < 9; c++)
>+      for (c = -17; c < 2; c++)
>+        if (*p)
>+          goto lbl3;
>+    }
>+}
>
>       Marek


Reply via email to