From 00852255e4a0d3b67ed853aacbc4aa4f4dfe724a Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 6 Oct 2015 20:25:57 -0600 Subject: [PATCH][PR tree-optimization/67816] Fix jump threading when DOM removes conditionals in jump threading path PR tree-optimization/67816 * tree-ssa-threadupdate.h (remove_jump_threads_including): Renamed from remove_jump_threads_starting_at. Accept an edge rather than a basic block. * tree-ssa-threadupdate.c (removed_edges): New hash table. (remove_jump_threads_including): Note edges that get removed from the CFG for later pruning of jump threading paths including them. (thread_through_all_blocks): Remove paths which include edges that have been removed. * tree-ssa-dom.c (optimize_stmt): Call remove_jump_threads_including on each outgoing edges when optimizing away a control statement. * gcc.c-torture/compile/pr67816.c: New test. From-SVN: r228559 --- gcc/tree-ssa-dom.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'gcc/tree-ssa-dom.c') diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c226da5..941087d 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1840,8 +1840,13 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si, edge taken_edge = find_taken_edge (bb, val); if (taken_edge) { - /* Delete threads that start at BB. */ - remove_jump_threads_starting_at (bb); + + /* We need to remove any queued jump threads that + reference outgoing edges from this block. */ + edge_iterator ei; + edge e; + FOR_EACH_EDGE (e, ei, bb->succs) + remove_jump_threads_including (e); /* If BB is in a loop, then removing an outgoing edge from BB may cause BB to move outside the loop, changes in the -- cgit v1.1