aboutsummaryrefslogtreecommitdiff
path: root/gcc/dominance.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-10-31 21:37:10 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-10-31 21:37:10 +0000
commit03b06a83441cac588cf04f494915ffd3868a9bed (patch)
tree457138650afbcc0d91ef7e60a9f2ca4718a4b83d /gcc/dominance.c
parente212c7f56c62dc492e7d2af6d55636d19229d114 (diff)
downloadgcc-03b06a83441cac588cf04f494915ffd3868a9bed.zip
gcc-03b06a83441cac588cf04f494915ffd3868a9bed.tar.gz
gcc-03b06a83441cac588cf04f494915ffd3868a9bed.tar.bz2
re PR tree-optimization/55018 (CDDCE pass is too aggressive sometimes with infinite loops and with some functions)
gcc/ PR tree-optimization/55018 * basic-block.h (dfs_find_deadend): New prototype. * cfganal.c (dfs_find_deadend): No longer static. Use bitmap instead of sbitmap for visited. (flow_dfs_compute_reverse_execute): Use dfs_find_deadend here, too. * dominance.c (calc_dfs_tree): If saw_unconnected, traverse from dfs_find_deadend of unconnected b instead of b directly. testsuite/ PR tree-optimization/55018 * gcc.dg/torture/pr55018.c: New test. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r193047
Diffstat (limited to 'gcc/dominance.c')
-rw-r--r--gcc/dominance.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/dominance.c b/gcc/dominance.c
index 10a58cd..683f3f5 100644
--- a/gcc/dominance.c
+++ b/gcc/dominance.c
@@ -377,14 +377,18 @@ calc_dfs_tree (struct dom_info *di, bool reverse)
{
FOR_EACH_BB_REVERSE (b)
{
+ basic_block b2;
if (di->dfs_order[b->index])
continue;
- bitmap_set_bit (di->fake_exit_edge, b->index);
- di->dfs_order[b->index] = di->dfsnum;
- di->dfs_to_bb[di->dfsnum] = b;
+ b2 = dfs_find_deadend (b);
+ gcc_checking_assert (di->dfs_order[b2->index] == 0);
+ bitmap_set_bit (di->fake_exit_edge, b2->index);
+ di->dfs_order[b2->index] = di->dfsnum;
+ di->dfs_to_bb[di->dfsnum] = b2;
di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
di->dfsnum++;
- calc_dfs_tree_nonrec (di, b, reverse);
+ calc_dfs_tree_nonrec (di, b2, reverse);
+ gcc_checking_assert (di->dfs_order[b->index]);
}
}
}