Commit f790df6b by Aldy Hernandez Committed by Aldy Hernandez

tree-ssa-threadupdate.c (thread_through_all_blocks): Do not jump thread twice…

tree-ssa-threadupdate.c (thread_through_all_blocks): Do not jump thread twice from the same starting edge.

        * tree-ssa-threadupdate.c (thread_through_all_blocks): Do not jump
	thread twice from the same starting edge.

From-SVN: r262559
parent 288aaa5f
2018-07-11 Aldy Hernandez <aldyh@redhat.com> 2018-07-11 Aldy Hernandez <aldyh@redhat.com>
* tree-ssa-threadupdate.c (thread_through_all_blocks): Do not jump
thread twice from the same starting edge.
2018-07-11 Aldy Hernandez <aldyh@redhat.com>
* vr-values.c (gimple_stmt_nonzero_p): Abstract common code to... * vr-values.c (gimple_stmt_nonzero_p): Abstract common code to...
* gimple.c (gimple_call_nonnull_result_p): ...here... * gimple.c (gimple_call_nonnull_result_p): ...here...
(gimple_call_nonnull_arg): ...and here. (gimple_call_nonnull_arg): ...and here.
......
...@@ -2428,6 +2428,7 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2428,6 +2428,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
unsigned int i; unsigned int i;
struct loop *loop; struct loop *loop;
auto_bitmap threaded_blocks; auto_bitmap threaded_blocks;
hash_set<edge> visited_starting_edges;
if (!paths.exists ()) if (!paths.exists ())
{ {
...@@ -2473,10 +2474,17 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2473,10 +2474,17 @@ thread_through_all_blocks (bool may_peel_loop_headers)
continue; continue;
} }
/* Do not jump-thread twice from the same block. */ /* Do not jump-thread twice from the same starting edge.
if (bitmap_bit_p (threaded_blocks, entry->src->index)
/* We may not want to realize this jump thread path Previously we only checked that we weren't threading twice
for various reasons. So check it first. */ from the same BB, but that was too restrictive. Imagine a
path that starts from GIMPLE_COND(x_123 == 0,...), where both
edges out of this conditional yield paths that can be
threaded (for example, both lead to an x_123==0 or x_123!=0
conditional further down the line. */
if (visited_starting_edges.contains (entry)
/* We may not want to realize this jump thread path for
various reasons. So check it first. */
|| !valid_jump_thread_path (path)) || !valid_jump_thread_path (path))
{ {
/* Remove invalid FSM jump-thread paths. */ /* Remove invalid FSM jump-thread paths. */
...@@ -2496,7 +2504,7 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2496,7 +2504,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
{ {
/* We do not update dominance info. */ /* We do not update dominance info. */
free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_DOMINATORS);
bitmap_set_bit (threaded_blocks, entry->src->index); visited_starting_edges.add (entry);
retval = true; retval = true;
thread_stats.num_threaded_edges++; thread_stats.num_threaded_edges++;
} }
...@@ -2514,7 +2522,7 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2514,7 +2522,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
edge entry = (*path)[0]->e; edge entry = (*path)[0]->e;
/* Do not jump-thread twice from the same block. */ /* Do not jump-thread twice from the same block. */
if (bitmap_bit_p (threaded_blocks, entry->src->index)) if (visited_starting_edges.contains (entry))
{ {
delete_jump_thread_path (path); delete_jump_thread_path (path);
paths.unordered_remove (i); paths.unordered_remove (i);
...@@ -2523,8 +2531,6 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2523,8 +2531,6 @@ thread_through_all_blocks (bool may_peel_loop_headers)
i++; i++;
} }
bitmap_clear (threaded_blocks);
mark_threaded_blocks (threaded_blocks); mark_threaded_blocks (threaded_blocks);
initialize_original_copy_tables (); initialize_original_copy_tables ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment