diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-05-16 23:44:40 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-05-16 23:44:40 +0200 |
commit | 4e65deeffb7205dc20b70fdfbce51bc6b381f0db (patch) | |
tree | 04497663af09ac6033253ea43e12935fb81791b0 /gcc/tree-vect-loop-manip.c | |
parent | d069df01eda5094cb2c934a7e1567219ba36e511 (diff) | |
download | gcc-4e65deeffb7205dc20b70fdfbce51bc6b381f0db.zip gcc-4e65deeffb7205dc20b70fdfbce51bc6b381f0db.tar.gz gcc-4e65deeffb7205dc20b70fdfbce51bc6b381f0db.tar.bz2 |
omp-low.c (lower_rec_input_clauses): If OMP_CLAUSE_IF has non-constant expression...
* omp-low.c (lower_rec_input_clauses): If OMP_CLAUSE_IF
has non-constant expression, force sctx.lane and use two
argument IFN_GOMP_SIMD_LANE instead of single argument.
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Don't DCE
two argument IFN_GOMP_SIMD_LANE without lhs.
* tree-vectorizer.h (struct _loop_vec_info): Add simd_if_cond
member.
(LOOP_VINFO_SIMD_IF_COND, LOOP_REQUIRES_VERSIONING_FOR_SIMD_IF_COND):
Define.
(LOOP_REQUIRES_VERSIONING): Or in
LOOP_REQUIRES_VERSIONING_FOR_SIMD_IF_COND.
* tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize
simd_if_cond.
(vect_analyze_loop_2): Punt if LOOP_VINFO_SIMD_IF_COND is constant 0.
* tree-vect-loop-manip.c (vect_loop_versioning): Add runtime check
from simd if clause if needed.
* gcc.dg/vect/vect-simd-1.c: New test.
* gcc.dg/vect/vect-simd-2.c: New test.
* gcc.dg/vect/vect-simd-3.c: New test.
* gcc.dg/vect/vect-simd-4.c: New test.
From-SVN: r271298
Diffstat (limited to 'gcc/tree-vect-loop-manip.c')
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 77d3dac..b3fae5b 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -3009,6 +3009,8 @@ vect_loop_versioning (loop_vec_info loop_vinfo, bool version_align = LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT (loop_vinfo); bool version_alias = LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo); bool version_niter = LOOP_REQUIRES_VERSIONING_FOR_NITERS (loop_vinfo); + tree version_simd_if_cond + = LOOP_REQUIRES_VERSIONING_FOR_SIMD_IF_COND (loop_vinfo); if (check_profitability) cond_expr = fold_build2 (GE_EXPR, boolean_type_node, scalar_loop_iters, @@ -3044,6 +3046,31 @@ vect_loop_versioning (loop_vec_info loop_vinfo, vect_create_cond_for_alias_checks (loop_vinfo, &cond_expr); } + if (version_simd_if_cond) + { + gcc_assert (dom_info_available_p (CDI_DOMINATORS)); + if (flag_checking) + if (basic_block bb + = gimple_bb (SSA_NAME_DEF_STMT (version_simd_if_cond))) + gcc_assert (bb != loop->header + && dominated_by_p (CDI_DOMINATORS, loop->header, bb) + && (scalar_loop == NULL + || (bb != scalar_loop->header + && dominated_by_p (CDI_DOMINATORS, + scalar_loop->header, bb)))); + tree zero = build_zero_cst (TREE_TYPE (version_simd_if_cond)); + tree c = fold_build2 (NE_EXPR, boolean_type_node, + version_simd_if_cond, zero); + if (cond_expr) + cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, + c, cond_expr); + else + cond_expr = c; + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "created versioning for simd if condition check.\n"); + } + cond_expr = force_gimple_operand_1 (unshare_expr (cond_expr), &gimplify_stmt_list, is_gimple_condexpr, NULL_TREE); |