summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>2012-08-14 16:01:10 +0000
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>2012-08-14 16:01:10 +0000
commit4e9768188f093c874916a3a7399802af58fe0c2a (patch)
tree4464f678351d15a2ac886efa3d2f24239ee68188 /gcc
parent1cface392e052c3530d3ea14b977e2a4f699dc74 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cfgloop.c28
-rw-r--r--gcc/cfgloopmanip.c3
-rw-r--r--gcc/graphite-scop-detection.c1
-rw-r--r--gcc/tree-cfgcleanup.c2
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);