diff options
Diffstat (limited to 'gcc/tree-vect-stmts.cc')
-rw-r--r-- | gcc/tree-vect-stmts.cc | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index e2dcfaa..2e9b3d2e 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -5460,6 +5460,7 @@ vectorizable_conversion (vec_info *vinfo, vec<tree> vec_oprnds1 = vNULL; tree vop0; bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (vinfo); + loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); int multi_step_cvt = 0; vec<tree> interm_types = vNULL; tree intermediate_type, cvt_type = NULL_TREE; @@ -5802,6 +5803,20 @@ vectorizable_conversion (vec_info *vinfo, gcc_unreachable (); } + if (modifier == WIDEN + && loop_vinfo + && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) + && (code1 == VEC_WIDEN_MULT_EVEN_EXPR + || widening_evenodd_fn_p (code1))) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "can't use a fully-masked loop because" + " widening operation on even/odd elements" + " mixes up lanes.\n"); + LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false; + } + if (!vec_stmt) /* transformation not required. */ { if (!vect_maybe_update_slp_op_vectype (slp_op0, vectype_in) @@ -13363,7 +13378,8 @@ vect_analyze_stmt (vec_info *vinfo, need extra handling, except for vectorizable reductions. */ if (!bb_vinfo && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type - && STMT_VINFO_TYPE (stmt_info) != lc_phi_info_type + && (STMT_VINFO_TYPE (stmt_info) != lc_phi_info_type + || STMT_VINFO_DEF_TYPE (stmt_info) == vect_internal_def) && (!node->ldst_lanes || SLP_TREE_CODE (node) == VEC_PERM_EXPR) && !can_vectorize_live_stmts (as_a <loop_vec_info> (vinfo), node, node_instance, |