Skip to content

Commit

Permalink
* tree-ssa-threadupdate.c (thread_through_all_blocks): Do not jump
Browse files Browse the repository at this point in the history
	thread twice from the same starting edge.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@262559 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
aldyh committed Jul 11, 2018
1 parent 21d374a commit 8095249
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 8 deletions.
5 changes: 5 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2018-07-11 Aldy Hernandez <[email protected]>

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

2018-07-11 Aldy Hernandez <[email protected]>

* vr-values.c (gimple_stmt_nonzero_p): Abstract common code to...
Expand Down
22 changes: 14 additions & 8 deletions gcc/tree-ssa-threadupdate.c
Original file line number Diff line number Diff line change
Expand Up @@ -2428,6 +2428,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
unsigned int i;
struct loop *loop;
auto_bitmap threaded_blocks;
hash_set<edge> visited_starting_edges;

if (!paths.exists ())
{
Expand Down Expand Up @@ -2473,10 +2474,17 @@ thread_through_all_blocks (bool may_peel_loop_headers)
continue;
}

/* Do not jump-thread twice from the same block. */
if (bitmap_bit_p (threaded_blocks, entry->src->index)
/* We may not want to realize this jump thread path
for various reasons. So check it first. */
/* Do not jump-thread twice from the same starting edge.
Previously we only checked that we weren't threading twice
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))
{
/* Remove invalid FSM jump-thread paths. */
Expand All @@ -2496,7 +2504,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
{
/* We do not update dominance info. */
free_dominance_info (CDI_DOMINATORS);
bitmap_set_bit (threaded_blocks, entry->src->index);
visited_starting_edges.add (entry);
retval = true;
thread_stats.num_threaded_edges++;
}
Expand All @@ -2514,7 +2522,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
edge entry = (*path)[0]->e;

/* 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);
paths.unordered_remove (i);
Expand All @@ -2523,8 +2531,6 @@ thread_through_all_blocks (bool may_peel_loop_headers)
i++;
}

bitmap_clear (threaded_blocks);

mark_threaded_blocks (threaded_blocks);

initialize_original_copy_tables ();
Expand Down

0 comments on commit 8095249

Please sign in to comment.