diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index 46f439fb8a3..302101fa6a0 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -313,55 +313,6 @@ vect_get_internal_def (vec_info *vinfo, tree op) return NULL; } -/* Check whether NAME, an ssa-name used in STMT_VINFO, - is a result of a type promotion, such that: - DEF_STMT: NAME = NOP (name0) - If CHECK_SIGN is TRUE, check that either both types are signed or both are - unsigned. */ - -static bool -type_conversion_p (vec_info *vinfo, tree name, bool check_sign, - tree *orig_type, gimple **def_stmt, bool *promotion) -{ - tree type = TREE_TYPE (name); - tree oprnd0; - enum vect_def_type dt; - - stmt_vec_info def_stmt_info; - if (!vect_is_simple_use (name, vinfo, &dt, &def_stmt_info, def_stmt)) - return false; - - if (dt != vect_internal_def - && dt != vect_external_def && dt != vect_constant_def) - return false; - - if (!*def_stmt) - return false; - - if (!is_gimple_assign (*def_stmt)) - return false; - - if (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (*def_stmt))) - return false; - - oprnd0 = gimple_assign_rhs1 (*def_stmt); - - *orig_type = TREE_TYPE (oprnd0); - if (!INTEGRAL_TYPE_P (type) || !INTEGRAL_TYPE_P (*orig_type) - || ((TYPE_UNSIGNED (type) != TYPE_UNSIGNED (*orig_type)) && check_sign)) - return false; - - if (TYPE_PRECISION (type) >= (TYPE_PRECISION (*orig_type) * 2)) - *promotion = true; - else - *promotion = false; - - if (!vect_is_simple_use (oprnd0, vinfo, &dt)) - return false; - - return true; -} - /* Holds information about an input operand after some sign changes and type promotions have been peeled away. */ class vect_unpromoted_value { @@ -5408,154 +5359,6 @@ vect_recog_mod_var_pattern (vec_info *vinfo, return pattern_stmt; } -/* Function vect_recog_mixed_size_cond_pattern - - Try to find the following pattern: - - type x_t, y_t; - TYPE a_T, b_T, c_T; - loop: - S1 a_T = x_t CMP y_t ? b_T : c_T; - - where type 'TYPE' is an integral type which has different size - from 'type'. b_T and c_T are either constants (and if 'TYPE' is wider - than 'type', the constants need to fit into an integer type - with the same width as 'type') or results of conversion from 'type'. - - Input: - - * STMT_VINFO: The stmt from which the pattern search begins. - - Output: - - * TYPE_OUT: The type of the output of this pattern. - - * Return value: A new stmt that will be used to replace the pattern. - Additionally a def_stmt is added. - - a_it = x_t CMP y_t ? b_it : c_it; - a_T = (TYPE) a_it; */ - -static gimple * -vect_recog_mixed_size_cond_pattern (vec_info *vinfo, - stmt_vec_info stmt_vinfo, tree *type_out) -{ - gimple *last_stmt = stmt_vinfo->stmt; - tree cond_expr, then_clause, else_clause; - tree type, vectype, comp_vectype, itype = NULL_TREE, vecitype; - gimple *pattern_stmt, *def_stmt; - tree orig_type0 = NULL_TREE, orig_type1 = NULL_TREE; - gimple *def_stmt0 = NULL, *def_stmt1 = NULL; - bool promotion; - tree comp_scalar_type; - - if (!is_gimple_assign (last_stmt) - || gimple_assign_rhs_code (last_stmt) != COND_EXPR - || STMT_VINFO_DEF_TYPE (stmt_vinfo) != vect_internal_def) - return NULL; - - cond_expr = gimple_assign_rhs1 (last_stmt); - then_clause = gimple_assign_rhs2 (last_stmt); - else_clause = gimple_assign_rhs3 (last_stmt); - - if (!COMPARISON_CLASS_P (cond_expr)) - return NULL; - - comp_scalar_type = TREE_TYPE (TREE_OPERAND (cond_expr, 0)); - comp_vectype = get_vectype_for_scalar_type (vinfo, comp_scalar_type); - if (comp_vectype == NULL_TREE) - return NULL; - - type = TREE_TYPE (gimple_assign_lhs (last_stmt)); - if (types_compatible_p (type, comp_scalar_type) - || ((TREE_CODE (then_clause) != INTEGER_CST - || TREE_CODE (else_clause) != INTEGER_CST) - && !INTEGRAL_TYPE_P (comp_scalar_type)) - || !INTEGRAL_TYPE_P (type)) - return NULL; - - if ((TREE_CODE (then_clause) != INTEGER_CST - && !type_conversion_p (vinfo, then_clause, false, - &orig_type0, &def_stmt0, &promotion)) - || (TREE_CODE (else_clause) != INTEGER_CST - && !type_conversion_p (vinfo, else_clause, false, - &orig_type1, &def_stmt1, &promotion))) - return NULL; - - if (orig_type0 && orig_type1 - && !types_compatible_p (orig_type0, orig_type1)) - return NULL; - - if (orig_type0) - { - if (!types_compatible_p (orig_type0, comp_scalar_type)) - return NULL; - then_clause = gimple_assign_rhs1 (def_stmt0); - itype = orig_type0; - } - - if (orig_type1) - { - if (!types_compatible_p (orig_type1, comp_scalar_type)) - return NULL; - else_clause = gimple_assign_rhs1 (def_stmt1); - itype = orig_type1; - } - - - HOST_WIDE_INT cmp_mode_size - = GET_MODE_UNIT_BITSIZE (TYPE_MODE (comp_vectype)); - - scalar_int_mode type_mode = SCALAR_INT_TYPE_MODE (type); - if (GET_MODE_BITSIZE (type_mode) == cmp_mode_size) - return NULL; - - vectype = get_vectype_for_scalar_type (vinfo, type); - if (vectype == NULL_TREE) - return NULL; - - if (expand_vec_cond_expr_p (vectype, comp_vectype, TREE_CODE (cond_expr))) - return NULL; - - if (itype == NULL_TREE) - itype = build_nonstandard_integer_type (cmp_mode_size, - TYPE_UNSIGNED (type)); - - if (itype == NULL_TREE - || GET_MODE_BITSIZE (SCALAR_TYPE_MODE (itype)) != cmp_mode_size) - return NULL; - - vecitype = get_vectype_for_scalar_type (vinfo, itype); - if (vecitype == NULL_TREE) - return NULL; - - if (!expand_vec_cond_expr_p (vecitype, comp_vectype, TREE_CODE (cond_expr))) - return NULL; - - if (GET_MODE_BITSIZE (type_mode) > cmp_mode_size) - { - if ((TREE_CODE (then_clause) == INTEGER_CST - && !int_fits_type_p (then_clause, itype)) - || (TREE_CODE (else_clause) == INTEGER_CST - && !int_fits_type_p (else_clause, itype))) - return NULL; - } - - def_stmt = gimple_build_assign (vect_recog_temp_ssa_var (itype, NULL), - COND_EXPR, unshare_expr (cond_expr), - fold_convert (itype, then_clause), - fold_convert (itype, else_clause)); - pattern_stmt = gimple_build_assign (vect_recog_temp_ssa_var (type, NULL), - NOP_EXPR, gimple_assign_lhs (def_stmt)); - - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, vecitype); - *type_out = vectype; - - vect_pattern_detected ("vect_recog_mixed_size_cond_pattern", last_stmt); - - return pattern_stmt; -} - /* Helper function of vect_recog_bool_pattern. Called recursively, return true if bool VAR can and should be optimized that way. Assume it shouldn't @@ -7398,7 +7201,6 @@ static vect_recog_func vect_vect_recog_func_ptrs[] = { { vect_recog_sat_add_pattern, "sat_add" }, { vect_recog_sat_sub_pattern, "sat_sub" }, { vect_recog_sat_trunc_pattern, "sat_trunc" }, - { vect_recog_mixed_size_cond_pattern, "mixed_size_cond" }, { vect_recog_gcond_pattern, "gcond" }, { vect_recog_bool_pattern, "bool" }, /* This must come before mask conversion, and includes the parts