From 1a2a336065391b74c634e35854f382b24cdeaf35 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Tue, 25 Nov 2014 17:10:00 +0000 Subject: [PATCH] Add verify_sese 2014-11-25 Tom de Vries * 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 | 6 ++++++ gcc/tree-cfg.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ gcc/tree-cfg.h | 1 + 3 files changed, 65 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 76c6497c734..8b0d92b647a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-11-25 Tom de Vries + + * 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 PR lto/64065 diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e78554f5721..0a8d7a9f6ad 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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 *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. */ diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h index 626e97380d8..d35e5ba41a6 100644 --- a/gcc/tree-cfg.h +++ b/gcc/tree-cfg.h @@ -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 *bbs_p); +extern void verify_sese (basic_block, basic_block, vec *); extern basic_block move_sese_region_to_fn (struct function *, basic_block, basic_block, tree); extern void dump_function_to_file (tree, FILE *, int); -- 2.30.2