Richard Biener <[email protected]> writes:
> The following fixes an oversight in the guards covering VEC_PERM_EXPR
> folding.  When the existing permutes are not handled by the CPU then
> we know we have not yet applied vector lowering.  But only when we
> also consider the variable permute fallback.
>
> This doesn't fix the PR because !can_vec_perm_p does not tell us
> the truth since both vector lowering and RTL expansion will eventually
> consider vec_shl and vec_shr.  I'd like to retire those fallbacks
> of vec_perm_const, we instead should require for targets to
> syntesize a whole vector shift themselves.
>
> The alternative would be to (optionally?) pass in op0 and op1
> to can_vec_perm_const_p.

Perhaps we'd need to do that anyway, even if we get rid of the optabs.
I don't see otherwise how the target would distinguish a VEC_PERM_EXPR
involving zero with a VEC_PERM_EXPR involving some other constant.
Also, shift_amt_for_vec_perm_mask seems to be forgiving about the
index used into the second vector, which is only possible if you
know that the second vector is uniform.

Thanks,
Richard


>
> Thoughts?
>
> Thanks,
> Richard.
>
>       PR middle-end/125875
>       * match.pd: When checking for !can_vec_perm_const_p also
>       allow variable permutes.
> ---
>  gcc/match.pd | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 475939a0b63..d8073a90956 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -11688,9 +11688,9 @@ and,
>         number of VEC_PERM_EXPRs that can't be handled.  */
>         if (can_vec_perm_const_p (result_mode, op_mode, sel2, false)
>          || (single_use (@0)
> -            ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, false)
> -               || !can_vec_perm_const_p (result_mode, op_mode, sel1, false))
> -            : !can_vec_perm_const_p (result_mode, op_mode, sel1, false)))
> +            ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, true)
> +               || !can_vec_perm_const_p (result_mode, op_mode, sel1, true))
> +            : !can_vec_perm_const_p (result_mode, op_mode, sel1, true)))
>        op0 = vec_perm_indices_to_tree (TREE_TYPE (@5), sel2);
>       }
>       (if (op0)
> @@ -11755,9 +11755,9 @@ and,
>           number of VEC_PERM_EXPRs that can't be handled.  */
>        if (can_vec_perm_const_p (result_mode, op_mode, sel2, false)
>            || (single_use (@0)
> -              ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, false)
> -                 || !can_vec_perm_const_p (result_mode, op_mode, sel1, 
> false))
> -              : !can_vec_perm_const_p (result_mode, op_mode, sel1, false)))
> +              ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, true)
> +                 || !can_vec_perm_const_p (result_mode, op_mode, sel1, true))
> +              : !can_vec_perm_const_p (result_mode, op_mode, sel1, true)))
>          op0 = vec_perm_indices_to_tree (TREE_TYPE (@4), sel2);
>         }
>         (if (op0)
> @@ -11819,9 +11819,9 @@ and,
>           number of VEC_PERM_EXPRs that can't be handled.  */
>        if (can_vec_perm_const_p (result_mode, op_mode, sel2, false)
>            || (single_use (@0)
> -              ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, false)
> -                 || !can_vec_perm_const_p (result_mode, op_mode, sel1, 
> false))
> -              : !can_vec_perm_const_p (result_mode, op_mode, sel1, false)))
> +              ? (!can_vec_perm_const_p (result_mode, op_mode, sel0, true)
> +                 || !can_vec_perm_const_p (result_mode, op_mode, sel1, true))
> +              : !can_vec_perm_const_p (result_mode, op_mode, sel1, true)))
>          op0 = vec_perm_indices_to_tree (TREE_TYPE (@4), sel2);
>         }
>         (if (op0)

Reply via email to