Handle original loop tree in expand_omp_for_generic
authorTom de Vries <tom@codesourcery.com>
Tue, 13 Oct 2015 10:08:40 +0000 (10:08 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 13 Oct 2015 10:08:40 +0000 (10:08 +0000)
2015-10-13  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/67476
* omp-low.c (expand_omp_for_generic): Handle original loop tree.

From-SVN: r228754

gcc/ChangeLog
gcc/omp-low.c

index e5ede0bda318eb461d2e3ef1cac32c7e15b29a10..4632387b2ac0f258d0eca8fd95bc0ca688debda4 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-13  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/67476
+       * omp-low.c (expand_omp_for_generic): Handle original loop tree.
+
 2015-10-13  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-data-refs.c (vect_analyze_data_ref_dependences): Allocate
index b2a93b99c7eb2bbd5527c69d43355cca31bbee00..7e894e4da7adf4d64886cdabf41096e51a4b976a 100644 (file)
@@ -6439,7 +6439,6 @@ expand_omp_for_generic (struct omp_region *region,
       remove_edge (e);
 
       make_edge (cont_bb, l2_bb, EDGE_FALSE_VALUE);
-      add_bb_to_loop (l2_bb, cont_bb->loop_father);
       e = find_edge (cont_bb, l1_bb);
       if (e == NULL)
        {
@@ -6516,17 +6515,30 @@ expand_omp_for_generic (struct omp_region *region,
       set_immediate_dominator (CDI_DOMINATORS, l1_bb,
                               recompute_dominator (CDI_DOMINATORS, l1_bb));
 
-      struct loop *outer_loop = alloc_loop ();
-      outer_loop->header = l0_bb;
-      outer_loop->latch = l2_bb;
-      add_loop (outer_loop, l0_bb->loop_father);
+      /* We enter expand_omp_for_generic with a loop.  This original loop may
+        have its own loop struct, or it may be part of an outer loop struct
+        (which may be the fake loop).  */
+      struct loop *outer_loop = entry_bb->loop_father;
+      bool orig_loop_has_loop_struct = l1_bb->loop_father != outer_loop;
 
-      if (!gimple_omp_for_combined_p (fd->for_stmt))
+      add_bb_to_loop (l2_bb, outer_loop);
+
+      /* We've added a new loop around the original loop.  Allocate the
+        corresponding loop struct.  */
+      struct loop *new_loop = alloc_loop ();
+      new_loop->header = l0_bb;
+      new_loop->latch = l2_bb;
+      add_loop (new_loop, outer_loop);
+
+      /* Allocate a loop structure for the original loop unless we already
+        had one.  */
+      if (!orig_loop_has_loop_struct
+         && !gimple_omp_for_combined_p (fd->for_stmt))
        {
-         struct loop *loop = alloc_loop ();
-         loop->header = l1_bb;
+         struct loop *orig_loop = alloc_loop ();
+         orig_loop->header = l1_bb;
          /* The loop may have multiple latches.  */
-         add_loop (loop, outer_loop);
+         add_loop (orig_loop, new_loop);
        }
     }
 }