diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2018-07-11 16:25:58 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2018-07-11 16:25:58 +0000 |
commit | f790df6be014576524f55670a136eb622e595377 (patch) | |
tree | 57bb8174db4eed98e1c999299ed25e43139a7969 /gcc/tree-ssa-threadupdate.c | |
parent | 288aaa5f852b6f93078e15b7ac17af3b4930decd (diff) | |
download | gcc-f790df6be014576524f55670a136eb622e595377.zip gcc-f790df6be014576524f55670a136eb622e595377.tar.gz gcc-f790df6be014576524f55670a136eb622e595377.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-threadupdate.c')
-rw-r--r-- | gcc/tree-ssa-threadupdate.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index 17f9b89..8080dff 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -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 ()) { @@ -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. */ @@ -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++; } @@ -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); @@ -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 (); |