tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1): Rework father_bb setting...
authorRichard Biener <rguenther@suse.de>
Wed, 11 Jul 2018 07:04:59 +0000 (07:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 11 Jul 2018 07:04:59 +0000 (07:04 +0000)
2018-07-10  Richard Biener  <rguenther@suse.de>

* tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1):
Rework father_bb setting in a way to avoid propagating constants
multiple times on a loop body.

From-SVN: r262550

gcc/ChangeLog
gcc/tree-ssa-loop-ivcanon.c

index a333a523b8e97fc0296742784e566ece4e214069..8250b44e49a5ab0cf1bfdde7a7bb7452154ce4e6 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-10  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely_1):
+       Rework father_bb setting in a way to avoid propagating constants
+       multiple times on a loop body.
+
 2018-07-10  Mark Wielaard  <mark@klomp.org>
 
        PR debug/86459
index 5f741c3b4988c8fc12b3ecc64d8118b3ba3412b7..326589f63c364b79a6c8fa63eddc70e068d2c93a 100644 (file)
@@ -1378,17 +1378,37 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
   /* Process inner loops first.  Don't walk loops added by the recursive
      calls because SSA form is not up-to-date.  They can be handled in the
      next iteration.  */
+  bitmap child_father_bbs = NULL;
   for (inner = loop->inner; inner != NULL; inner = inner->next)
     if ((unsigned) inner->num < num)
-      changed |= tree_unroll_loops_completely_1 (may_increase_size,
-                                                unroll_outer, father_bbs,
-                                                inner);
+      {
+       if (!child_father_bbs)
+         child_father_bbs = BITMAP_ALLOC (NULL);
+       if (tree_unroll_loops_completely_1 (may_increase_size, unroll_outer,
+                                           child_father_bbs, inner))
+         {
+           bitmap_ior_into (father_bbs, child_father_bbs);
+           bitmap_clear (child_father_bbs);
+           changed = true;
+         }
+      }
+  if (child_father_bbs)
+    BITMAP_FREE (child_father_bbs);
 
   /* If we changed an inner loop we cannot process outer loops in this
      iteration because SSA form is not up-to-date.  Continue with
      siblings of outer loops instead.  */
   if (changed)
-    return true;
+    {
+      /* If we are recorded as father clear all other fathers that
+         are necessarily covered already to avoid redundant work.  */
+      if (bitmap_bit_p (father_bbs, loop->header->index))
+       {
+         bitmap_clear (father_bbs);
+         bitmap_set_bit (father_bbs, loop->header->index);
+       }
+      return true;
+    }
 
   /* Don't unroll #pragma omp simd loops until the vectorizer
      attempts to vectorize those.  */
@@ -1418,7 +1438,13 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer,
         computations; otherwise, the size might blow up before the
         iteration is complete and the IR eventually cleaned up.  */
       if (loop_outer (loop_father))
-       bitmap_set_bit (father_bbs, loop_father->header->index);
+       {
+         /* Once we process our father we will have processed
+            the fathers of our children as well, so avoid doing
+            redundant work and clear fathers we've gathered sofar.  */
+         bitmap_clear (father_bbs);
+         bitmap_set_bit (father_bbs, loop_father->header->index);
+       }
 
       return true;
     }