[PATCH] vect: Enhance condition check to use partial vectors in vectorizable_condition
Richard Sandiford
richard.sandiford@arm.com
Wed Jul 8 12:56:47 GMT 2020
"Kewen.Lin" <linkw@linux.ibm.com> writes:
> Hi,
>
> This patch is derived from the review of vector with length patch series.
> The length-based partial vector approach doesn't support reduction so far,
> so we would like to disable vectorization with partial vectors explicitly
> for it in vectorizable_condition. Otherwise, it will cause some unexpected
> failures for a few cases like gcc.dg/vect/pr65947-2.c.
>
> But if we disable it for the cases excepting for reduction_type equal to
> EXTRACT_LAST_REDUCTION, it cause one regression failure on aarch64:
> gcc.target/aarch64/sve/reduc_8.c -march=armv8.2-a+sve
>
> The disabling makes the outer loop can't work with partial vectors, the
> check fails. But the case is safe to adopt it. As Richard S. pointed out
> in the review comments, the extra inactive lanes only matter for double
> reductions, so this patch is to permit vectorization with partial vectors
> for cases EXTRACT_LAST_REDUCTION or nested-cycle reduction.
>
> Testing is ongoing, is it ok for trunk if the testing goes well?
>
> BR,
> Kewen
> -----
> gcc/ChangeLog:
>
> * tree-vect-stmts.c (vectorizable_condition): Prohibit vectorization
> with partial vectors explicitly excepting for EXTRACT_LAST_REDUCTION
> or nested-cycle reduction.
>
> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
> index 40e2664f93b..c23520aceab 100644
> --- a/gcc/tree-vect-stmts.c
> +++ b/gcc/tree-vect-stmts.c
> @@ -9968,11 +9968,16 @@ vectorizable_condition (vec_info *vinfo,
> return false;
> }
>
> - if (loop_vinfo
> - && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
> - && reduction_type == EXTRACT_LAST_REDUCTION)
> - vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo),
> - ncopies * vec_num, vectype, NULL);
> + if (loop_vinfo && for_reduction
> + && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo))
> + {
> + if (reduction_type == EXTRACT_LAST_REDUCTION)
> + vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo),
> + ncopies * vec_num, vectype, NULL);
> + /* Extra inactive lanes should be safe for vect_nested_cycle. */
> + else if (STMT_VINFO_DEF_TYPE (reduc_info) != vect_nested_cycle)
> + LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
We should print a dump message when setting this to false. E.g.:
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"conditional reduction prevents the use"
" of partial vectors\n");
OK with that change, thanks.
Richard
More information about the Gcc-patches
mailing list