From: Jakub Jelinek Date: Sun, 5 Jul 2015 12:14:41 +0000 (+0200) Subject: re PR tree-optimization/66718 (Non-invariant ADDR_EXPR not vectorized) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3cc2fa2a17d7d3b72d2140306686c827612234d0;p=gcc.git re PR tree-optimization/66718 (Non-invariant ADDR_EXPR not vectorized) PR tree-optimization/66718 * tree-vect-stmts.c (vectorizable_call): Replace uses of GOMP_SIMD_LANE outside of loop with vf - 1 rather than 0. From-SVN: r225434 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ccf4396074..13f9ba75dc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2015-07-05 Jakub Jelinek + PR tree-optimization/66718 + * tree-vect-stmts.c (vectorizable_call): Replace uses of + GOMP_SIMD_LANE outside of loop with vf - 1 rather than 0. + PR tree-optimization/66718 * tree-vect-stmts.c (vectorizable_assignment, vectorizable_store, vectorizable_load, vectorizable_condition): Move vectype, diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index c6565228d08..5ac70231f3e 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -2601,6 +2601,30 @@ vectorizable_call (gimple gs, gimple_stmt_iterator *gsi, gimple *vec_stmt, lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info)); else lhs = gimple_call_lhs (stmt); + + if (gimple_call_internal_p (stmt) + && gimple_call_internal_fn (stmt) == IFN_GOMP_SIMD_LANE) + { + /* Replace uses of the lhs of GOMP_SIMD_LANE call outside the loop + with vf - 1 rather than 0, that is the last iteration of the + vectorized loop. */ + imm_use_iterator iter; + use_operand_p use_p; + gimple use_stmt; + FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) + { + basic_block use_bb = gimple_bb (use_stmt); + if (use_bb + && !flow_bb_inside_loop_p (LOOP_VINFO_LOOP (loop_vinfo), use_bb)) + { + FOR_EACH_IMM_USE_ON_STMT (use_p, iter) + SET_USE (use_p, build_int_cst (TREE_TYPE (lhs), + ncopies * nunits_out - 1)); + update_stmt (use_stmt); + } + } + } + new_stmt = gimple_build_assign (lhs, build_zero_cst (type)); set_vinfo_for_stmt (new_stmt, stmt_info); set_vinfo_for_stmt (stmt, NULL);