graphite-scop-detection.c (create_sese_edges): Compute dominance info before trying...
authorSteven Bosscher <steven@gcc.gnu.org>
Tue, 14 Aug 2012 16:01:10 +0000 (16:01 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Tue, 14 Aug 2012 16:01:10 +0000 (16:01 +0000)
* graphite-scop-detection.c (create_sese_edges): Compute dominance
info before trying to fix loop structure.
* cfgloopmanip.c (fix_loop_structure): Require fast DOM queries.
* tree-cfgcleanup.c (repair_loop_structures): Likewise.
* cfgloop.c (verify_loop_structure): Verify loop fathers.

From-SVN: r190390

gcc/ChangeLog
gcc/cfgloop.c
gcc/cfgloopmanip.c
gcc/graphite-scop-detection.c
gcc/tree-cfgcleanup.c

index f94cbc990167a9a26326c06ca9bad9c0fb04e48d..98c83004c8980844296b176f75e30fd551ff99cd 100644 (file)
@@ -1,5 +1,11 @@
 2012-08-14  Steven Bosscher  <steven@gcc.gnu.org>
 
+       * graphite-scop-detection.c (create_sese_edges): Compute dominance
+       info before trying to fix loop structure.
+       * cfgloopmanip.c (fix_loop_structure): Require fast DOM queries.
+       * tree-cfgcleanup.c (repair_loop_structures): Likewise.
+       * cfgloop.c (verify_loop_structure): Verify loop fathers.
+
        * dominance.c (init_dom_info): Use gcc_checking_assert, not gcc_assert.
        (dom_convert_dir_to_idx, compute_dom_fast_query,
        get_immediate_dominator, set_immediate_dominator, get_dominated_by,
index dd75be668e3ad3f5560e4e3fd62103178c79ee99..44df99b8f33092509fec37aebb13b22f4239ef46 100644 (file)
@@ -1294,6 +1294,7 @@ cancel_loop_tree (struct loop *loop)
      -- loop header have just single entry edge and single latch edge
      -- loop latches have only single successor that is header of their loop
      -- irreducible loops are correctly marked
+     -- the cached loop depth and loop father of each bb is correct
   */
 DEBUG_FUNCTION void
 verify_loop_structure (void)
@@ -1308,6 +1309,7 @@ verify_loop_structure (void)
   loop_iterator li;
   struct loop_exit *exit, *mexit;
   bool dom_available = dom_info_available_p (CDI_DOMINATORS);
+  sbitmap visited = sbitmap_alloc (last_basic_block);
 
   /* We need up-to-date dominators, compute or verify them.  */
   if (!dom_available)
@@ -1344,11 +1346,34 @@ verify_loop_structure (void)
        if (!flow_bb_inside_loop_p (loop, bbs[j]))
          {
            error ("bb %d do not belong to loop %d",
-                   bbs[j]->index, loop->num);
+                  bbs[j]->index, loop->num);
            err = 1;
          }
       free (bbs);
     }
+  sbitmap_zero (visited);
+  FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
+    {
+      bbs = get_loop_body (loop);
+
+      for (j = 0; j < loop->num_nodes; j++)
+       {
+         bb = bbs[j];
+
+         /* Ignore this block if it is in an inner loop.  */
+         if (TEST_BIT (visited, bb->index))
+           continue;
+         SET_BIT (visited, bb->index);
+
+         if (bb->loop_father != loop)
+           {
+             error ("bb %d has father loop %d, should be loop %d",
+                    bb->index, bb->loop_father->num, loop->num);
+             err = 1;
+           }
+       }
+      free (bbs);
+    }
 
   /* Check headers and latches.  */
   FOR_EACH_LOOP (li, loop, 0)
@@ -1556,6 +1581,7 @@ verify_loop_structure (void)
 
   gcc_assert (!err);
 
+  sbitmap_free (visited);
   free (sizes);
   if (!dom_available)
     free_dominance_info (CDI_DOMINATORS);
index 98a306fd68c8fe3867ae1f0e88af7e0a67b1dfa3..d84a56de1937864c597db4e20a58b50803528825 100644 (file)
@@ -1640,6 +1640,9 @@ fix_loop_structure (bitmap changed_bbs)
   bool record_exits = false;
   struct loop **superloop = XNEWVEC (struct loop *, number_of_loops ());
 
+  /* We need exact and fast dominance info to be available.  */
+  gcc_assert (dom_info_state (CDI_DOMINATORS) == DOM_OK);
+
   /* Remove the old bb -> loop mapping.  Remember the depth of the blocks in
      the loop hierarchy, so that we can recognize blocks whose loop nesting
      relationship has changed.  */
index 2fb1997c844a395631be94b2f47ca83f9fd93783..408e6b2fb527b5adceedfd79d49b9d2fd32b576a 100644 (file)
@@ -1029,6 +1029,7 @@ create_sese_edges (VEC (sd_region, heap) *regions)
 
   unmark_exit_edges (regions);
 
+  calculate_dominance_info (CDI_DOMINATORS);
   fix_loop_structure (NULL);
 
 #ifdef ENABLE_CHECKING
index b665c5890bef65eab7cc57b069294eab9a89f3c6..45f33682e30524a88bf766f500edda59d0676948 100644 (file)
@@ -737,6 +737,8 @@ repair_loop_structures (void)
 {
   bitmap changed_bbs;
 
+  calculate_dominance_info (CDI_DOMINATORS);
+
   timevar_push (TV_REPAIR_LOOPS);
   changed_bbs = BITMAP_ALLOC (NULL);
   fix_loop_structure (changed_bbs);