Don't tail-merge blocks from different loops
authorTom de Vries <tom@codesourcery.com>
Mon, 3 Jul 2017 07:21:34 +0000 (07:21 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 3 Jul 2017 07:21:34 +0000 (07:21 +0000)
2017-07-03  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/81192
* tree-ssa-tail-merge.c (same_succ_hash): Use bb->loop_father->num in
hash.
(same_succ::equal): Don't find bbs to be equal if bb->loop_father
differs.
(find_same_succ_bb): Remove obsolete test on bb->loop_father->latch.

* gcc.dg/pr81192.c: Update.

From-SVN: r249894

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr81192.c
gcc/tree-ssa-tail-merge.c

index 7284fef28063acdaea6b9ca34097b4868ea31dbd..18f23c09f3166928696c155b3f75ba4e0a5bf721 100644 (file)
@@ -1,3 +1,12 @@
+2017-07-03  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/81192
+       * tree-ssa-tail-merge.c (same_succ_hash): Use bb->loop_father->num in
+       hash.
+       (same_succ::equal): Don't find bbs to be equal if bb->loop_father
+       differs.
+       (find_same_succ_bb): Remove obsolete test on bb->loop_father->latch.
+
 2017-07-03  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/81192
index dda405aa9e7277860b7a7478096a7776c9366bdc..12d441eb0109c1341944d23651769b9461654585 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-03  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/81192
+       * gcc.dg/pr81192.c: Update.
+
 2017-07-03  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/81192
index 57eb4781d4da1ac1c3aeb77b322ff1c36b0ddd57..8b3a77a60612b13374bb2792cdf4f8b739d6b0a3 100644 (file)
@@ -19,4 +19,4 @@ fn2 (void)
       ;
 }
 
-/* { dg-final { scan-tree-dump-times "(?n)find_duplicates: <bb .*> duplicate of <bb .*>" 1 "pre" } } */
+/* { dg-final { scan-tree-dump-not "(?n)find_duplicates: <bb .*> duplicate of <bb .*>" "pre" } } */
index e88072c1836799ca2d6358060b7006a27e3f31bc..6fa4e5b2ad91805bd91c821f15f3242d38a93159 100644 (file)
@@ -479,6 +479,8 @@ same_succ_hash (const same_succ *e)
   hstate.add_int (size);
   BB_SIZE (bb) = size;
 
+  hstate.add_int (bb->loop_father->num);
+
   for (i = 0; i < e->succ_flags.length (); ++i)
     {
       flags = e->succ_flags[i];
@@ -568,6 +570,9 @@ same_succ::equal (const same_succ *e1, const same_succ *e2)
   if (BB_SIZE (bb1) != BB_SIZE (bb2))
     return 0;
 
+  if (bb1->loop_father != bb2->loop_father)
+    return 0;
+
   gsi1 = gsi_start_nondebug_bb (bb1);
   gsi2 = gsi_start_nondebug_bb (bb2);
   gsi_advance_fw_nondebug_nonlocal (&gsi1);
@@ -695,15 +700,7 @@ find_same_succ_bb (basic_block bb, same_succ **same_p)
   edge_iterator ei;
   edge e;
 
-  if (bb == NULL
-      /* Be conservative with loop structure.  It's not evident that this test
-        is sufficient.  Before tail-merge, we've just called
-        loop_optimizer_finalize, and LOOPS_MAY_HAVE_MULTIPLE_LATCHES is now
-        set, so there's no guarantee that the loop->latch value is still valid.
-        But we assume that, since we've forced LOOPS_HAVE_SIMPLE_LATCHES at the
-        start of pre, we've kept that property intact throughout pre, and are
-        keeping it throughout tail-merge using this test.  */
-      || bb->loop_father->latch == bb)
+  if (bb == NULL)
     return;
   bitmap_set_bit (same->bbs, bb->index);
   FOR_EACH_EDGE (e, ei, bb->succs)