diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-14 16:01:10 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-14 16:01:10 +0000 |
commit | 4e9768188f093c874916a3a7399802af58fe0c2a (patch) | |
tree | 4464f678351d15a2ac886efa3d2f24239ee68188 /gcc | |
parent | 1cface392e052c3530d3ea14b977e2a4f699dc74 (diff) | |
download | gcc-4e9768188f093c874916a3a7399802af58fe0c2a.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190390 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgloop.c | 28 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 3 | ||||
-rw-r--r-- | gcc/graphite-scop-detection.c | 1 | ||||
-rw-r--r-- | gcc/tree-cfgcleanup.c | 2 |
5 files changed, 39 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f94cbc99016..98c83004c89 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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, diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c index dd75be668e3..44df99b8f33 100644 --- a/gcc/cfgloop.c +++ b/gcc/cfgloop.c @@ -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); diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 98a306fd68c..d84a56de193 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -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. */ diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 2fb1997c844..408e6b2fb52 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -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 diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index b665c5890be..45f33682e30 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -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); |