From 3cc2fa2a17d7d3b72d2140306686c827612234d0 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 5 Jul 2015 14:14:41 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/tree-vect-stmts.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) 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); -- 2.30.2