From: Richard Biener <richard.guenther@gmail.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>,
Richard Sandiford <richard.sandiford@arm.com>
Subject: Re: [5/5] Don't defer choice of vector type for bools (PR 92596)
Date: Fri, 29 Nov 2019 12:58:00 -0000 [thread overview]
Message-ID: <CAFiYyc1q_ZxHSU+zD+Gvy-vnT0P2=fvpqUMFTSd5oyuKGBZT=g@mail.gmail.com> (raw)
In-Reply-To: <mpt5zj3yomj.fsf@arm.com>
On Fri, Nov 29, 2019 at 11:16 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> Now that stmt_vec_info records the choice between vector mask
> types and normal nonmask types, we can use that information in
> vect_get_vector_types_for_stmt instead of deferring the choice
> of vector type till later.
>
> vect_get_mask_type_for_stmt used to check whether the boolean inputs
> to an operation:
> (a) consistently used mask types or consistently used nonmask types; and
> (b) agreed on the number of elements.
>
> (b) shouldn't be a problem when (a) is met. If the operation
> consistently uses mask types, tree-vect-patterns.c will have corrected
> any mismatches in mask precision. (This is because we only use mask
> types for a small well-known set of operations and tree-vect-patterns.c
> knows how to handle any that could have different mask precisions.)
> And if the operation consistently uses normal nonmask types, there's
> no reason why booleans should need extra vector compatibility checks
> compared to ordinary integers.
>
> So the potential difficulties all seem to come from (a). Now that
> we've chosen the result type ahead of time, we also have to consider
> whether the outputs and inputs consistently use mask types.
>
> Taking each vectorizable_* routine in turn:
>
> - vectorizable_call
>
> vect_get_vector_types_for_stmt only handled booleans specially
> for gassigns, so vect_get_mask_type_for_stmt never had chance to
> handle calls. I'm not sure we support any calls that operate on
> booleans, but as things stand, a boolean result would always have
> a nonmask type. Presumably any vector argument would also need to
> use nonmask types, unless it corresponds to internal_fn_mask_index
> (which is already a special case).
>
> For safety, I've added a check for mask/nonmask combinations here
> even though we didn't check this previously.
>
> - vectorizable_simd_clone_call
>
> Again, vect_get_mask_type_for_stmt never had chance to handle calls.
> The result of the call will always be a nonmask type and the patch
> for PR 92710 rejects mask arguments. So all booleans should
> consistently use nonmask types here.
>
> - vectorizable_conversion
>
> The function already rejects any conversion between booleans in which
> one type isn't a mask type.
>
> - vectorizable_operation
>
> This function definitely needs a consistency check, e.g. to handle
> & and | in which one operand is loaded from memory and the other is
> a comparison result. Ideally we'd handle this via pattern stmts
> instead (like we do for the all-mask case), but that's future work.
>
> - vectorizable_assignment
>
> VECT_SCALAR_BOOLEAN_TYPE_P requires single-bit precision, so the
> current code already rejects problematic cases.
>
> - vectorizable_load
>
> Loads always produce nonmask types and there are no relevant inputs
> to check against.
>
> - vectorizable_store
>
> vect_check_store_rhs already rejects mask/nonmask combinations
> via useless_type_conversion_p.
>
> - vectorizable_reduction
> - vectorizable_lc_phi
>
> PHIs always have nonmask types. After the change above, attempts
> to combine the PHI result with a mask type would be rejected by
> vectorizable_operation. (Again, it would be better to handle
> this using pattern stmts.)
>
> - vectorizable_induction
>
> We don't generate inductions for booleans.
>
> - vectorizable_shift
>
> The function already rejects boolean shifts via type_has_mode_precision_p.
>
> - vectorizable_condition
>
> The function already rejects mismatches via useless_type_conversion_p.
>
> - vectorizable_comparison
>
> The function already rejects comparisons between mask and nonmask types.
> The result is always a mask type.
OK.
Thanks for cleaning this up!
Richard.
>
> 2019-11-29 Richard Sandiford <richard.sandiford@arm.com>
>
> gcc/
> PR tree-optimization/92596
> * tree-vect-stmts.c (vectorizable_call): Punt on hybrid mask/nonmask
> operations.
> (vectorizable_operation): Likewise, instead of relying on
> vect_get_mask_type_for_stmt to do this.
> (vect_get_vector_types_for_stmt): Always return a vector type
> immediately, rather than deferring the choice for boolean results.
> Use a vector mask type instead of a normal vector if
> vect_use_mask_type_p.
> (vect_get_mask_type_for_stmt): Delete.
> * tree-vect-loop.c (vect_determine_vf_for_stmt_1): Remove
> mask_producers argument and special boolean_type_node handling.
> (vect_determine_vf_for_stmt): Remove mask_producers argument and
> update calls to vect_determine_vf_for_stmt_1. Remove doubled call.
> (vect_determine_vectorization_factor): Update call accordingly.
> * tree-vect-slp.c (vect_build_slp_tree_1): Remove special
> boolean_type_node handling.
> (vect_slp_analyze_node_operations_1): Likewise.
>
> gcc/testsuite/
> PR tree-optimization/92596
> * gcc.dg/vect/bb-slp-pr92596.c: New test.
> * gcc.dg/vect/bb-slp-43.c: Likewise.
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2019-11-29 09:13:43.000000000 +0000
> +++ gcc/tree-vect-stmts.c 2019-11-29 09:13:43.768143063 +0000
> @@ -3325,6 +3325,15 @@ vectorizable_call (stmt_vec_info stmt_in
> return false;
> }
>
> + if (VECTOR_BOOLEAN_TYPE_P (vectype_out)
> + != VECTOR_BOOLEAN_TYPE_P (vectype_in))
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> + "mixed mask and nonmask vector types\n");
> + return false;
> + }
> +
> /* FORNOW */
> nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
> nunits_out = TYPE_VECTOR_SUBPARTS (vectype_out);
> @@ -6037,7 +6046,8 @@ vectorizable_operation (stmt_vec_info st
>
> /* Most operations cannot handle bit-precision types without extra
> truncations. */
> - if (!VECTOR_BOOLEAN_TYPE_P (vectype_out)
> + bool mask_op_p = VECTOR_BOOLEAN_TYPE_P (vectype_out);
> + if (!mask_op_p
> && !type_has_mode_precision_p (TREE_TYPE (scalar_dest))
> /* Exception are bitwise binary operations. */
> && code != BIT_IOR_EXPR
> @@ -6099,10 +6109,11 @@ vectorizable_operation (stmt_vec_info st
> if (maybe_ne (nunits_out, nunits_in))
> return false;
>
> + tree vectype2 = NULL_TREE, vectype3 = NULL_TREE;
> if (op_type == binary_op || op_type == ternary_op)
> {
> op1 = gimple_assign_rhs2 (stmt);
> - if (!vect_is_simple_use (op1, vinfo, &dt[1]))
> + if (!vect_is_simple_use (op1, vinfo, &dt[1], &vectype2))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -6113,7 +6124,7 @@ vectorizable_operation (stmt_vec_info st
> if (op_type == ternary_op)
> {
> op2 = gimple_assign_rhs3 (stmt);
> - if (!vect_is_simple_use (op2, vinfo, &dt[2]))
> + if (!vect_is_simple_use (op2, vinfo, &dt[2], &vectype3))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -6138,6 +6149,21 @@ vectorizable_operation (stmt_vec_info st
>
> gcc_assert (ncopies >= 1);
>
> + /* Reject attempts to combine mask types with nonmask types, e.g. if
> + we have an AND between a (nonmask) boolean loaded from memory and
> + a (mask) boolean result of a comparison.
> +
> + TODO: We could easily fix these cases up using pattern statements. */
> + if (VECTOR_BOOLEAN_TYPE_P (vectype) != mask_op_p
> + || (vectype2 && VECTOR_BOOLEAN_TYPE_P (vectype2) != mask_op_p)
> + || (vectype3 && VECTOR_BOOLEAN_TYPE_P (vectype3) != mask_op_p))
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> + "mixed mask and nonmask vector types\n");
> + return false;
> + }
> +
> /* Supportable by target? */
>
> vec_mode = TYPE_MODE (vectype);
> @@ -12065,9 +12091,6 @@ vect_gen_while_not (gimple_seq *seq, tre
>
> - Set *STMT_VECTYPE_OUT to:
> - NULL_TREE if the statement doesn't need to be vectorized;
> - - boolean_type_node if the statement is a boolean operation whose
> - vector type can only be determined once all the other vector types
> - are known; and
> - the equivalent of STMT_VINFO_VECTYPE otherwise.
>
> - Set *NUNITS_VECTYPE_OUT to the vector type that contains the maximum
> @@ -12124,11 +12147,22 @@ vect_get_vector_types_for_stmt (stmt_vec
> tree scalar_type = NULL_TREE;
> if (group_size == 0 && STMT_VINFO_VECTYPE (stmt_info))
> {
> - *stmt_vectype_out = vectype = STMT_VINFO_VECTYPE (stmt_info);
> + vectype = STMT_VINFO_VECTYPE (stmt_info);
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> "precomputed vectype: %T\n", vectype);
> }
> + else if (vect_use_mask_type_p (stmt_info))
> + {
> + unsigned int precision = stmt_info->mask_precision;
> + scalar_type = build_nonstandard_integer_type (precision, 1);
> + vectype = get_mask_type_for_scalar_type (vinfo, scalar_type, group_size);
> + if (!vectype)
> + return opt_result::failure_at (stmt, "not vectorized: unsupported"
> + " data-type %T\n", scalar_type);
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_NOTE, vect_location, "vectype: %T\n", vectype);
> + }
> else
> {
> if (data_reference *dr = STMT_VINFO_DATA_REF (stmt_info))
> @@ -12138,28 +12172,6 @@ vect_get_vector_types_for_stmt (stmt_vec
> else
> scalar_type = TREE_TYPE (gimple_get_lhs (stmt));
>
> - /* Pure bool ops don't participate in number-of-units computation.
> - For comparisons use the types being compared. */
> - if (!STMT_VINFO_DATA_REF (stmt_info)
> - && VECT_SCALAR_BOOLEAN_TYPE_P (scalar_type)
> - && is_gimple_assign (stmt)
> - && gimple_assign_rhs_code (stmt) != COND_EXPR)
> - {
> - *stmt_vectype_out = boolean_type_node;
> -
> - tree rhs1 = gimple_assign_rhs1 (stmt);
> - if (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison
> - && !VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (rhs1)))
> - scalar_type = TREE_TYPE (rhs1);
> - else
> - {
> - if (dump_enabled_p ())
> - dump_printf_loc (MSG_NOTE, vect_location,
> - "pure bool operation.\n");
> - return opt_result::success ();
> - }
> - }
> -
> if (dump_enabled_p ())
> {
> if (group_size)
> @@ -12177,18 +12189,15 @@ vect_get_vector_types_for_stmt (stmt_vec
> " unsupported data-type %T\n",
> scalar_type);
>
> - if (!*stmt_vectype_out)
> - *stmt_vectype_out = vectype;
> -
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location, "vectype: %T\n", vectype);
> }
> + *stmt_vectype_out = vectype;
>
> /* Don't try to compute scalar types if the stmt produces a boolean
> vector; use the existing vector type instead. */
> tree nunits_vectype = vectype;
> - if (!VECTOR_BOOLEAN_TYPE_P (vectype)
> - && *stmt_vectype_out != boolean_type_node)
> + if (!VECTOR_BOOLEAN_TYPE_P (vectype))
> {
> /* The number of units is set according to the smallest scalar
> type (or the largest vector size, but we only support one
> @@ -12213,9 +12222,8 @@ vect_get_vector_types_for_stmt (stmt_vec
> }
> }
>
> - gcc_assert (*stmt_vectype_out == boolean_type_node
> - || multiple_p (TYPE_VECTOR_SUBPARTS (nunits_vectype),
> - TYPE_VECTOR_SUBPARTS (*stmt_vectype_out)));
> + gcc_assert (multiple_p (TYPE_VECTOR_SUBPARTS (nunits_vectype),
> + TYPE_VECTOR_SUBPARTS (*stmt_vectype_out)));
>
> if (dump_enabled_p ())
> {
> @@ -12227,84 +12235,3 @@ vect_get_vector_types_for_stmt (stmt_vec
> *nunits_vectype_out = nunits_vectype;
> return opt_result::success ();
> }
> -
> -/* Try to determine the correct vector type for STMT_INFO, which is a
> - statement that produces a scalar boolean result. Return the vector
> - type on success, otherwise return NULL_TREE. If GROUP_SIZE is nonzero
> - and we're performing BB vectorization, make sure that the number of
> - elements in the vector is no bigger than GROUP_SIZE. */
> -
> -opt_tree
> -vect_get_mask_type_for_stmt (stmt_vec_info stmt_info, unsigned int group_size)
> -{
> - vec_info *vinfo = stmt_info->vinfo;
> - gimple *stmt = stmt_info->stmt;
> - tree mask_type = NULL;
> - tree vectype, scalar_type;
> -
> - if (is_gimple_assign (stmt)
> - && TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison
> - && !VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
> - {
> - scalar_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
> - mask_type = get_mask_type_for_scalar_type (vinfo, scalar_type,
> - group_size);
> -
> - if (!mask_type)
> - return opt_tree::failure_at (stmt,
> - "not vectorized: unsupported mask\n");
> - }
> - else
> - {
> - tree rhs;
> - ssa_op_iter iter;
> - enum vect_def_type dt;
> -
> - FOR_EACH_SSA_TREE_OPERAND (rhs, stmt, iter, SSA_OP_USE)
> - {
> - if (!vect_is_simple_use (rhs, stmt_info->vinfo, &dt, &vectype))
> - return opt_tree::failure_at (stmt,
> - "not vectorized:can't compute mask"
> - " type for statement, %G", stmt);
> -
> - /* No vectype probably means external definition.
> - Allow it in case there is another operand which
> - allows to determine mask type. */
> - if (!vectype)
> - continue;
> -
> - if (!mask_type)
> - mask_type = vectype;
> - else if (maybe_ne (TYPE_VECTOR_SUBPARTS (mask_type),
> - TYPE_VECTOR_SUBPARTS (vectype)))
> - return opt_tree::failure_at (stmt,
> - "not vectorized: different sized mask"
> - " types in statement, %T and %T\n",
> - mask_type, vectype);
> - else if (VECTOR_BOOLEAN_TYPE_P (mask_type)
> - != VECTOR_BOOLEAN_TYPE_P (vectype))
> - return opt_tree::failure_at (stmt,
> - "not vectorized: mixed mask and "
> - "nonmask vector types in statement, "
> - "%T and %T\n",
> - mask_type, vectype);
> - }
> -
> - /* We may compare boolean value loaded as vector of integers.
> - Fix mask_type in such case. */
> - if (mask_type
> - && !VECTOR_BOOLEAN_TYPE_P (mask_type)
> - && gimple_code (stmt) == GIMPLE_ASSIGN
> - && TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
> - mask_type = truth_type_for (mask_type);
> - }
> -
> - /* No mask_type should mean loop invariant predicate.
> - This is probably a subject for optimization in if-conversion. */
> - if (!mask_type)
> - return opt_tree::failure_at (stmt,
> - "not vectorized: can't compute mask type "
> - "for statement: %G", stmt);
> -
> - return opt_tree::success (mask_type);
> -}
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2019-11-29 09:13:43.000000000 +0000
> +++ gcc/tree-vect-loop.c 2019-11-29 09:13:43.764143091 +0000
> @@ -163,8 +163,7 @@ static stmt_vec_info vect_is_simple_redu
> static opt_result
> vect_determine_vf_for_stmt_1 (stmt_vec_info stmt_info,
> bool vectype_maybe_set_p,
> - poly_uint64 *vf,
> - vec<stmt_vec_info > *mask_producers)
> + poly_uint64 *vf)
> {
> gimple *stmt = stmt_info->stmt;
>
> @@ -192,8 +191,6 @@ vect_determine_vf_for_stmt_1 (stmt_vec_i
> gcc_assert ((STMT_VINFO_DATA_REF (stmt_info)
> || vectype_maybe_set_p)
> && STMT_VINFO_VECTYPE (stmt_info) == stmt_vectype);
> - else if (stmt_vectype == boolean_type_node)
> - mask_producers->safe_push (stmt_info);
> else
> STMT_VINFO_VECTYPE (stmt_info) = stmt_vectype;
> }
> @@ -206,21 +203,17 @@ vect_determine_vf_for_stmt_1 (stmt_vec_i
>
> /* Subroutine of vect_determine_vectorization_factor. Set the vector
> types of STMT_INFO and all attached pattern statements and update
> - the vectorization factor VF accordingly. If some of the statements
> - produce a mask result whose vector type can only be calculated later,
> - add them to MASK_PRODUCERS. Return true on success or false if
> - something prevented vectorization. */
> + the vectorization factor VF accordingly. Return true on success
> + or false if something prevented vectorization. */
>
> static opt_result
> -vect_determine_vf_for_stmt (stmt_vec_info stmt_info, poly_uint64 *vf,
> - vec<stmt_vec_info > *mask_producers)
> +vect_determine_vf_for_stmt (stmt_vec_info stmt_info, poly_uint64 *vf)
> {
> vec_info *vinfo = stmt_info->vinfo;
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location, "==> examining statement: %G",
> stmt_info->stmt);
> - opt_result res
> - = vect_determine_vf_for_stmt_1 (stmt_info, false, vf, mask_producers);
> + opt_result res = vect_determine_vf_for_stmt_1 (stmt_info, false, vf);
> if (!res)
> return res;
>
> @@ -239,10 +232,7 @@ vect_determine_vf_for_stmt (stmt_vec_inf
> dump_printf_loc (MSG_NOTE, vect_location,
> "==> examining pattern def stmt: %G",
> def_stmt_info->stmt);
> - if (!vect_determine_vf_for_stmt_1 (def_stmt_info, true,
> - vf, mask_producers))
> - res = vect_determine_vf_for_stmt_1 (def_stmt_info, true,
> - vf, mask_producers);
> + res = vect_determine_vf_for_stmt_1 (def_stmt_info, true, vf);
> if (!res)
> return res;
> }
> @@ -251,7 +241,7 @@ vect_determine_vf_for_stmt (stmt_vec_inf
> dump_printf_loc (MSG_NOTE, vect_location,
> "==> examining pattern statement: %G",
> stmt_info->stmt);
> - res = vect_determine_vf_for_stmt_1 (stmt_info, true, vf, mask_producers);
> + res = vect_determine_vf_for_stmt_1 (stmt_info, true, vf);
> if (!res)
> return res;
> }
> @@ -296,7 +286,6 @@ vect_determine_vectorization_factor (loo
> tree vectype;
> stmt_vec_info stmt_info;
> unsigned i;
> - auto_vec<stmt_vec_info> mask_producers;
>
> DUMP_VECT_SCOPE ("vect_determine_vectorization_factor");
>
> @@ -354,8 +343,7 @@ vect_determine_vectorization_factor (loo
> {
> stmt_info = loop_vinfo->lookup_stmt (gsi_stmt (si));
> opt_result res
> - = vect_determine_vf_for_stmt (stmt_info, &vectorization_factor,
> - &mask_producers);
> + = vect_determine_vf_for_stmt (stmt_info, &vectorization_factor);
> if (!res)
> return res;
> }
> @@ -373,16 +361,6 @@ vect_determine_vectorization_factor (loo
> return opt_result::failure_at (vect_location,
> "not vectorized: unsupported data-type\n");
> LOOP_VINFO_VECT_FACTOR (loop_vinfo) = vectorization_factor;
> -
> - for (i = 0; i < mask_producers.length (); i++)
> - {
> - stmt_info = mask_producers[i];
> - opt_tree mask_type = vect_get_mask_type_for_stmt (stmt_info);
> - if (!mask_type)
> - return opt_result::propagate_failure (mask_type);
> - STMT_VINFO_VECTYPE (stmt_info) = mask_type;
> - }
> -
> return opt_result::success ();
> }
>
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2019-11-29 09:13:43.000000000 +0000
> +++ gcc/tree-vect-slp.c 2019-11-29 09:13:43.764143091 +0000
> @@ -925,17 +925,6 @@ vect_build_slp_tree_1 (unsigned char *sw
> || rhs_code == LROTATE_EXPR
> || rhs_code == RROTATE_EXPR)
> {
> - if (vectype == boolean_type_node)
> - {
> - if (dump_enabled_p ())
> - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> - "Build SLP failed: shift of a"
> - " boolean.\n");
> - /* Fatal mismatch. */
> - matches[0] = false;
> - return false;
> - }
> -
> vec_mode = TYPE_MODE (vectype);
>
> /* First see if we have a vector/vector shift. */
> @@ -1157,9 +1146,8 @@ vect_build_slp_tree_1 (unsigned char *sw
> if (alt_stmt_code != ERROR_MARK
> && TREE_CODE_CLASS (alt_stmt_code) != tcc_reference)
> {
> - if (vectype == boolean_type_node
> - || !vect_two_operations_perm_ok_p (stmts, group_size,
> - vectype, alt_stmt_code))
> + if (!vect_two_operations_perm_ok_p (stmts, group_size,
> + vectype, alt_stmt_code))
> {
> for (i = 0; i < group_size; ++i)
> if (gimple_assign_rhs_code (stmts[i]->stmt) == alt_stmt_code)
> @@ -2751,25 +2739,6 @@ vect_slp_analyze_node_operations_1 (vec_
> stmt_vec_info stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
> gcc_assert (STMT_SLP_TYPE (stmt_info) != loop_vect);
>
> - /* For BB vectorization vector types are assigned here.
> - Memory accesses already got their vector type assigned
> - in vect_analyze_data_refs. */
> - bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> - if (bb_vinfo && STMT_VINFO_VECTYPE (stmt_info) == boolean_type_node)
> - {
> - unsigned int group_size = SLP_TREE_SCALAR_STMTS (node).length ();
> - tree vectype = vect_get_mask_type_for_stmt (stmt_info, group_size);
> - if (!vectype)
> - /* vect_get_mask_type_for_stmt has already explained the
> - failure. */
> - return false;
> -
> - stmt_vec_info sstmt_info;
> - unsigned int i;
> - FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, sstmt_info)
> - STMT_VINFO_VECTYPE (sstmt_info) = vectype;
> - }
> -
> /* Calculate the number of vector statements to be created for the
> scalar stmts in this node. For SLP reductions it is equal to the
> number of vector statements in the children (which has already been
> Index: gcc/testsuite/gcc.dg/vect/bb-slp-pr92596.c
> ===================================================================
> --- /dev/null 2019-09-17 11:41:18.176664108 +0100
> +++ gcc/testsuite/gcc.dg/vect/bb-slp-pr92596.c 2019-11-29 09:13:43.764143091 +0000
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-O3" } */
> +
> +typedef struct {
> + long n[5];
> +} secp256k1_fe;
> +
> +secp256k1_fe a;
> +
> +void fn1(int p1) { a.n[0] = a.n[1] = a.n[2] = p1; }
> +void fn2() {
> + int b;
> + fn1(!b);
> +}
> Index: gcc/testsuite/gcc.dg/vect/bb-slp-43.c
> ===================================================================
> --- /dev/null 2019-09-17 11:41:18.176664108 +0100
> +++ gcc/testsuite/gcc.dg/vect/bb-slp-43.c 2019-11-29 09:13:43.752143175 +0000
> @@ -0,0 +1,17 @@
> +/* { dg-do compile } */
> +
> +void
> +f (int *restrict x, short *restrict y)
> +{
> + x[0] = x[0] == 1 & y[0] == 2;
> + x[1] = x[1] == 1 & y[1] == 2;
> + x[2] = x[2] == 1 & y[2] == 2;
> + x[3] = x[3] == 1 & y[3] == 2;
> + x[4] = x[4] == 1 & y[4] == 2;
> + x[5] = x[5] == 1 & y[5] == 2;
> + x[6] = x[6] == 1 & y[6] == 2;
> + x[7] = x[7] == 1 & y[7] == 2;
> +}
> +
> +/* { dg-final { scan-tree-dump-not "mixed mask and nonmask" "slp2" } } */
> +/* { dg-final { scan-tree-dump-not "vector operands from scalars" "slp2" { target { { vect_int && vect_bool_cmp } && { vect_unpack && vect_hw_misalign } } xfail vect_variable_length } } } */
prev parent reply other threads:[~2019-11-29 12:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-29 10:11 [0/5] Don't defer vector type choice " Richard Sandiford
2019-11-29 10:13 ` [1/5] Improve tree-vect-patterns.c handling of boolean comparisons Richard Sandiford
2019-11-29 10:53 ` Richard Biener
2019-11-29 10:14 ` [2/5] Make vectorizable_operation punt early on codes it doesn't handle Richard Sandiford
2019-11-29 10:26 ` Richard Biener
2019-11-29 10:14 ` [3/5] Make vect_get_mask_type_for_stmt take a group size Richard Sandiford
2019-11-29 10:30 ` Richard Biener
2019-11-29 10:15 ` [4/5] Record the vector mask precision in stmt_vec_info Richard Sandiford
2019-11-29 10:34 ` Richard Biener
2019-11-29 10:25 ` [5/5] Don't defer choice of vector type for bools (PR 92596) Richard Sandiford
2019-11-29 12:58 ` Richard Biener [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFiYyc1q_ZxHSU+zD+Gvy-vnT0P2=fvpqUMFTSd5oyuKGBZT=g@mail.gmail.com' \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=richard.sandiford@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).