aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfganal.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-08-01 10:47:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-08-01 10:47:14 +0000
commit34e5c5116fa58f77ea5eef61d8fb6b9e91c92d79 (patch)
tree6180256fcd038c7f361f782de52817a7c47b4fb4 /gcc/cfganal.c
parent35c38fa674ab01152c743f421226f3cbc829cd94 (diff)
downloadgcc-34e5c5116fa58f77ea5eef61d8fb6b9e91c92d79.zip
gcc-34e5c5116fa58f77ea5eef61d8fb6b9e91c92d79.tar.gz
gcc-34e5c5116fa58f77ea5eef61d8fb6b9e91c92d79.tar.bz2
tree-ssa-pre.c (print_pre_expr): Handle NULL expr.
2017-08-01 Richard Biener <rguenther@suse.de> * tree-ssa-pre.c (print_pre_expr): Handle NULL expr. (compute_antic): Seed worklist with exit block predecessors. * cfganal.c (dfs_find_deadend): For a cycle return the source of the edge closing it. * gcc.dg/tree-ssa/ssa-dce-3.c: Adjust. * gcc.dg/tree-ssa/split-path-5.c: Remove case with just dead endless loop. * gcc.dg/uninit-23.c: Adjust. From-SVN: r250767
Diffstat (limited to 'gcc/cfganal.c')
-rw-r--r--gcc/cfganal.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/gcc/cfganal.c b/gcc/cfganal.c
index 792ea62..394d986 100644
--- a/gcc/cfganal.c
+++ b/gcc/cfganal.c
@@ -737,23 +737,24 @@ post_order_compute (int *post_order, bool include_entry_exit,
basic_block
dfs_find_deadend (basic_block bb)
{
- bitmap visited = BITMAP_ALLOC (NULL);
+ auto_bitmap visited;
+ basic_block next = bb;
for (;;)
{
- if (EDGE_COUNT (bb->succs) == 0
- || ! bitmap_set_bit (visited, bb->index))
- {
- BITMAP_FREE (visited);
- return bb;
- }
+ if (EDGE_COUNT (next->succs) == 0)
+ return next;
+
+ if (! bitmap_set_bit (visited, next->index))
+ return bb;
+ bb = next;
/* If we are in an analyzed cycle make sure to try exiting it.
Note this is a heuristic only and expected to work when loop
fixup is needed as well. */
if (! bb->loop_father
|| ! loop_outer (bb->loop_father))
- bb = EDGE_SUCC (bb, 0)->dest;
+ next = EDGE_SUCC (bb, 0)->dest;
else
{
edge_iterator ei;
@@ -761,7 +762,7 @@ dfs_find_deadend (basic_block bb)
FOR_EACH_EDGE (e, ei, bb->succs)
if (loop_exit_edge_p (bb->loop_father, e))
break;
- bb = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
+ next = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
}
}