diff options
author | Bin Cheng <bin.cheng@arm.com> | 2016-10-13 10:54:24 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2016-10-13 10:54:24 +0000 |
commit | 37cf9f4f1c3251d594468e52e41e18433130aba7 (patch) | |
tree | 56d76e56218e4754b1b1136931ad80b30c324fda | |
parent | d96004b805ee1ad4425b81f3a225240e2745715f (diff) | |
download | gcc-37cf9f4f1c3251d594468e52e41e18433130aba7.zip gcc-37cf9f4f1c3251d594468e52e41e18433130aba7.tar.gz gcc-37cf9f4f1c3251d594468e52e41e18433130aba7.tar.bz2 |
tree-vect-loop.c (vectorizable_live_operation): Support handling for live variable outside loop but not in lcssa form.
* tree-vect-loop.c (vectorizable_live_operation): Support handling
for live variable outside loop but not in lcssa form.
From-SVN: r241096
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 30 |
2 files changed, 22 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 242805e..d51c0eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-10-13 Bin Cheng <bin.cheng@arm.com> + * tree-vect-loop.c (vectorizable_live_operation): Support handling + for live variable outside loop but not in lcssa form. + +2016-10-13 Bin Cheng <bin.cheng@arm.com> + * cfg.c (reset_original_copy_tables): New func. * cfg.h (reset_original_copy_tables): New decl. diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index a84ca3f..7b0431e 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6488,14 +6488,6 @@ vectorizable_live_operation (gimple *stmt, : gimple_get_lhs (stmt); lhs_type = TREE_TYPE (lhs); - /* Find all uses of STMT outside the loop - there should be at least one. */ - auto_vec<gimple *, 4> worklist; - FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) - if (!flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)) - && !is_gimple_debug (use_stmt)) - worklist.safe_push (use_stmt); - gcc_assert (worklist.length () >= 1); - bitsize = TYPE_SIZE (TREE_TYPE (vectype)); vec_bitsize = TYPE_SIZE (vectype); @@ -6546,12 +6538,24 @@ vectorizable_live_operation (gimple *stmt, if (stmts) gsi_insert_seq_on_edge_immediate (single_exit (loop), stmts); - /* Replace all uses of the USE_STMT in the worklist with the newly inserted - statement. */ - while (!worklist.is_empty ()) + /* Replace use of lhs with newly computed result. If the use stmt is a + single arg PHI, just replace all uses of PHI result. It's necessary + because lcssa PHI defining lhs may be before newly inserted stmt. */ + use_operand_p use_p; + FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) + if (!flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)) + && !is_gimple_debug (use_stmt)) { - use_stmt = worklist.pop (); - replace_uses_by (gimple_phi_result (use_stmt), new_tree); + if (gimple_code (use_stmt) == GIMPLE_PHI + && gimple_phi_num_args (use_stmt) == 1) + { + replace_uses_by (gimple_phi_result (use_stmt), new_tree); + } + else + { + FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) + SET_USE (use_p, new_tree); + } update_stmt (use_stmt); } |