Add verify_sese
authorTom de Vries <tom@codesourcery.com>
Tue, 25 Nov 2014 17:10:00 +0000 (17:10 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 25 Nov 2014 17:10:00 +0000 (17:10 +0000)
2014-11-25  Tom de Vries  <tom@codesourcery.com>

* tree-cfg.c (verify_sese): New function.
(move_sese_region_to_fn): Call verify_sese.
* tree-cfg.h (verify_sese): Declare.

From-SVN: r218051

gcc/ChangeLog
gcc/tree-cfg.c
gcc/tree-cfg.h

index 76c6497c7341614f352e104e2272bf1ce2d1052c..8b0d92b647abdfbb5373c8095dabe1836c198440 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-25  Tom de Vries  <tom@codesourcery.com>
+
+       * tree-cfg.c (verify_sese): New function.
+       (move_sese_region_to_fn): Call verify_sese.
+       * tree-cfg.h (verify_sese): Declare.
+
 2014-11-25  Richard Biener  <rguenther@suse.de>
 
        PR lto/64065
index e78554f5721d6648bf387910a225bc25a28cec40..0a8d7a9f6ad475664ba63f08f3b25a65816bd239 100644 (file)
@@ -6870,6 +6870,61 @@ fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
     fixup_loop_arrays_after_move (fn1, fn2, loop);
 }
 
+/* Verify that the blocks in BBS_P are a single-entry, single-exit region
+   delimited by ENTRY_BB and EXIT_BB, possibly containing noreturn blocks.  */
+
+DEBUG_FUNCTION void
+verify_sese (basic_block entry, basic_block exit, vec<basic_block> *bbs_p)
+{
+  basic_block bb;
+  edge_iterator ei;
+  edge e;
+  bitmap bbs = BITMAP_ALLOC (NULL);
+  int i;
+
+  gcc_assert (entry != NULL);
+  gcc_assert (entry != exit);
+  gcc_assert (bbs_p != NULL);
+
+  gcc_assert (bbs_p->length () > 0);
+
+  FOR_EACH_VEC_ELT (*bbs_p, i, bb)
+    bitmap_set_bit (bbs, bb->index);
+
+  gcc_assert (bitmap_bit_p (bbs, entry->index));
+  gcc_assert (exit == NULL || bitmap_bit_p (bbs, exit->index));
+
+  FOR_EACH_VEC_ELT (*bbs_p, i, bb)
+    {
+      if (bb == entry)
+       {
+         gcc_assert (single_pred_p (entry));
+         gcc_assert (!bitmap_bit_p (bbs, single_pred (entry)->index));
+       }
+      else
+       for (ei = ei_start (bb->preds); !ei_end_p (ei); ei_next (&ei))
+         {
+           e = ei_edge (ei);
+           gcc_assert (bitmap_bit_p (bbs, e->src->index));
+         }
+
+      if (bb == exit)
+       {
+         gcc_assert (single_succ_p (exit));
+         gcc_assert (!bitmap_bit_p (bbs, single_succ (exit)->index));
+       }
+      else
+       for (ei = ei_start (bb->succs); !ei_end_p (ei); ei_next (&ei))
+         {
+           e = ei_edge (ei);
+           gcc_assert (bitmap_bit_p (bbs, e->dest->index));
+         }
+    }
+
+  BITMAP_FREE (bbs);
+}
+
+
 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
    single basic block in the original CFG and the new basic block is
@@ -6918,6 +6973,9 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
   bbs.create (0);
   bbs.safe_push (entry_bb);
   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
+#ifdef ENABLE_CHECKING
+  verify_sese (entry_bb, exit_bb, &bbs);
+#endif
 
   /* The blocks that used to be dominated by something in BBS will now be
      dominated by the new block.  */
index 626e97380d8adb293e974000400803945080fbca..d35e5ba41a666e1cfe314c734cef872128bcfb75 100644 (file)
@@ -73,6 +73,7 @@ extern bool gimple_duplicate_sese_tail (edge, edge, basic_block *, unsigned,
                                      basic_block *);
 extern void gather_blocks_in_sese_region (basic_block entry, basic_block exit,
                                          vec<basic_block> *bbs_p);
+extern void verify_sese (basic_block, basic_block, vec<basic_block> *);
 extern basic_block move_sese_region_to_fn (struct function *, basic_block,
                                           basic_block, tree);
 extern void dump_function_to_file (tree, FILE *, int);