From 37cf9f4f1c3251d594468e52e41e18433130aba7 Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Thu, 13 Oct 2016 10:54:24 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/tree-vect-loop.c | 30 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 242805eeda7..d51c0eb779c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-10-13 Bin Cheng + + * tree-vect-loop.c (vectorizable_live_operation): Support handling + for live variable outside loop but not in lcssa form. + 2016-10-13 Bin Cheng * cfg.c (reset_original_copy_tables): New func. diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index a84ca3f2f34..7b0431ec1ff 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 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); } -- 2.30.2