Improve verification of loop->latch in verify_loop_structure
authorTom de Vries <tom@codesourcery.com>
Wed, 25 Nov 2015 11:28:49 +0000 (11:28 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 25 Nov 2015 11:28:49 +0000 (11:28 +0000)
2015-11-25  Tom de Vries  <tom@codesourcery.com>

* cfgloop.c (find_single_latch): New function, factored out of ...
(flow_loops_find): ... here.
(verify_loop_structure): Improve verification of loop->latch.
* cfgloop.h (find_single_latch): Declare.
* omp-low.c (expand_omp_for_generic): Initialize latch of orig_loop.

From-SVN: r230866

gcc/ChangeLog
gcc/cfgloop.c
gcc/cfgloop.h
gcc/omp-low.c

index b2efa82f04b4e0400b668a0a836f2aa24ac90f30..82d23c0e2a9676eed82a31ad1687d675cf6f25ed 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-25  Tom de Vries  <tom@codesourcery.com>
+
+       * cfgloop.c (find_single_latch): New function, factored out of ...
+       (flow_loops_find): ... here.
+       (verify_loop_structure): Improve verification of loop->latch.
+       * cfgloop.h (find_single_latch): Declare.
+       * omp-low.c (expand_omp_for_generic): Initialize latch of orig_loop.
+
 2015-11-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config/sol2.h (SUPPORTS_INIT_PRIORITY): Move up.
index 83a526276dbef8554b75709847645d844fbab4dd..e7cb78a5351246dd3534cd5d47f34ff25f761677 100644 (file)
@@ -388,6 +388,33 @@ bb_loop_header_p (basic_block header)
   return false;
 }
 
+/* Return the latch block for this header block, if it has just a single one.
+   Otherwise, return NULL.  */
+
+basic_block
+find_single_latch (struct loop* loop)
+{
+  basic_block header = loop->header;
+  edge_iterator ei;
+  edge e;
+  basic_block latch = NULL;
+
+  FOR_EACH_EDGE (e, ei, header->preds)
+    {
+      basic_block cand = e->src;
+      if (!flow_bb_inside_loop_p (loop, cand))
+       continue;
+
+      if (latch != NULL)
+       /* More than one latch edge.  */
+       return NULL;
+
+      latch = cand;
+    }
+
+  return latch;
+}
+
 /* Find all the natural loops in the function and save in LOOPS structure and
    recalculate loop_father information in basic block structures.
    If LOOPS is non-NULL then the loop structures for already recorded loops
@@ -482,29 +509,10 @@ flow_loops_find (struct loops *loops)
     {
       struct loop *loop = larray[i];
       basic_block header = loop->header;
-      edge_iterator ei;
-      edge e;
 
       flow_loop_tree_node_add (header->loop_father, loop);
       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
-
-      /* Look for the latch for this header block, if it has just a
-        single one.  */
-      FOR_EACH_EDGE (e, ei, header->preds)
-       {
-         basic_block latch = e->src;
-
-         if (flow_bb_inside_loop_p (loop, latch))
-           {
-             if (loop->latch != NULL)
-               {
-                 /* More than one latch edge.  */
-                 loop->latch = NULL;
-                 break;
-               }
-             loop->latch = latch;
-           }
-       }
+      loop->latch = find_single_latch (loop);
     }
 
   return loops;
@@ -1434,6 +1442,28 @@ verify_loop_structure (void)
              error ("loop %d%'s latch is not dominated by its header", i);
              err = 1;
            }
+         if (find_single_latch (loop) == NULL)
+           {
+             error ("loop %d%'s latch is is not the only latch", i);
+             err = 1;
+           }
+       }
+      else
+       {
+         if (loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
+           {
+             if (find_single_latch (loop) != NULL)
+               {
+                 error ("loop %d%'s latch is missing", i);
+                 err = 1;
+               }
+           }
+         else
+           {
+             error ("loop %d%'s latch is missing, and loops may not have"
+                    " multiple latches", i);
+             err = 1;
+           }
        }
       if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
        {
index ee73bf994c18fc037e0de94b7b5c879182109893..7faf591796ff6ccf22446f02c2e5ab988ee3905d 100644 (file)
@@ -270,6 +270,7 @@ bool mark_irreducible_loops (void);
 void release_recorded_exits (function *);
 void record_loop_exits (void);
 void rescan_loop_exit (edge, bool, bool);
+basic_block find_single_latch (struct loop*);
 
 /* Loop data structure manipulation/querying.  */
 extern void flow_loop_tree_node_add (struct loop *, struct loop *);
index 0d4c6e59e8cdeaac63c387863ff144f8e27f60e3..2d782eb0c94520ec8714e2640b94724dc49edad4 100644 (file)
@@ -8903,6 +8903,7 @@ expand_omp_for_generic (struct omp_region *region,
          orig_loop->header = l1_bb;
          /* The loop may have multiple latches.  */
          add_loop (orig_loop, new_loop);
+         orig_loop->latch = find_single_latch (orig_loop);
        }
     }
 }