OSDN Git Service

2012-10-29 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Oct 2012 14:25:22 +0000 (14:25 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Oct 2012 14:25:22 +0000 (14:25 +0000)
PR middle-end/53695
* tracer.c (tracer): Fixup loop structure.
* cfgloopmanip.c (force_single_succ_latches): Add assert.
(fix_loop_structure): Re-compute loop latches and disambiguate
loops with multiple latches if required.

* gcc.dg/torture/pr53695.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192943 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgloopmanip.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr53695.c [new file with mode: 0644]
gcc/tracer.c

index 280e29a..e32ede0 100644 (file)
@@ -1,3 +1,11 @@
+2012-10-29  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/53695
+       * tracer.c (tracer): Fixup loop structure.
+       * cfgloopmanip.c (force_single_succ_latches): Add assert.
+       (fix_loop_structure): Re-compute loop latches and disambiguate
+       loops with multiple latches if required.
+
 2012-10-29  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (ix86_decompose_address): Use simplify_gen_subreg
index eae68ca..b48e858 100644 (file)
@@ -1586,6 +1586,7 @@ force_single_succ_latches (void)
        continue;
 
       e = find_edge (loop->latch, loop->header);
+      gcc_checking_assert (e != NULL);
 
       split_edge (e);
     }
@@ -1848,6 +1849,32 @@ fix_loop_structure (bitmap changed_bbs)
        }
     }
 
+  /* Then re-compute the single latch if there is one.  */
+  FOR_EACH_LOOP (li, loop, 0)
+    {
+      edge_iterator ei;
+      edge e, latch = NULL;
+      FOR_EACH_EDGE (e, ei, loop->header->preds)
+       if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
+         {
+           if (!latch)
+             latch = e;
+           else
+             {
+               latch = NULL;
+               break;
+             }
+         }
+      if (latch
+         && latch->src->loop_father == loop)
+       loop->latch = latch->src;
+      else
+       loop->latch = NULL;
+    }
+
+  if (!loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
+    disambiguate_loops_with_multiple_latches ();
+
   if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS))
     create_preheaders (CP_SIMPLE_PREHEADERS);
 
index 0e1f365..d07052b 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-29  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/53695
+       * gcc.dg/torture/pr53695.c: New testcase.
+
 2012-10-28  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/ipa/inlinehint-3.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr53695.c b/gcc/testsuite/gcc.dg/torture/pr53695.c
new file mode 100644 (file)
index 0000000..eba0843
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-ftracer" } */
+
+void
+foo (const void **p)
+{
+  void *labs[] = { &&l1, &&l2, &&l3 };
+l1:
+  goto *p++;
+l2:
+  goto *p;
+l3:
+  ;
+}
index 9b1d724..7264ad2 100644 (file)
@@ -379,7 +379,12 @@ tracer (void)
   /* Trace formation is done on the fly inside tail_duplicate */
   changed = tail_duplicate ();
   if (changed)
-    free_dominance_info (CDI_DOMINATORS);
+    {
+      free_dominance_info (CDI_DOMINATORS);
+      calculate_dominance_info (CDI_DOMINATORS);
+      if (current_loops)
+       fix_loop_structure (NULL);
+    }
 
   if (dump_file)
     brief_dump_cfg (dump_file, dump_flags);