Kyrylo Tkachov <ktkac...@nvidia.com> writes:
> Hi all,
>
> In the testcase from patch [2/2] we want to match a vector rotate operation 
> from
> an IOR of left and right shifts by immediate.  simplify-rtx has code for just
> that but it looks like it's prepared to do handle only scalar operands.
> In practice most of the code works for vector modes as well except the shift
> amounts are checked to be CONST_INT rather than vector constants that we have
> here.  This is easily extended by using unwrap_const_vec_duplicate to extract
> the repeating constant shift amount.

FWIW, shifting a vector by a scalar is valid rtl (at least AIUI), so the
current code does handle that case.  But I agree it's missing shifting a
vector by a vector.

I suppose a fancy version would be to check the rotate condition for each
individual element of the vector shift amount.  Checking the duplicate
case is definitely a good (and strict) improvement over the status quo
though.

> diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
> index e8e60404ef6..7ff14594daa 100644
> --- a/gcc/simplify-rtx.cc
> +++ b/gcc/simplify-rtx.cc
> @@ -3477,12 +3477,16 @@ simplify_context::simplify_binary_operation_1 
> (rtx_code code,
>       }
>  
>        if (GET_CODE (opleft) == ASHIFT && GET_CODE (opright) == LSHIFTRT
> -          && rtx_equal_p (XEXP (opleft, 0), XEXP (opright, 0))
> -          && CONST_INT_P (XEXP (opleft, 1))
> -          && CONST_INT_P (XEXP (opright, 1))
> -          && (INTVAL (XEXP (opleft, 1)) + INTVAL (XEXP (opright, 1))
> +       && rtx_equal_p (XEXP (opleft, 0), XEXP (opright, 0)))
> +     {
> +       rtx leftcst = unwrap_const_vec_duplicate (XEXP (opleft, 1));
> +       rtx rightcst = unwrap_const_vec_duplicate (XEXP (opright, 1));
> +
> +       if (CONST_INT_P (leftcst) && CONST_INT_P (rightcst)
> +           && (INTVAL (leftcst) + INTVAL (rightcst)
>             == GET_MODE_UNIT_PRECISION (mode)))

Nit: looks like some reindentation might be missing here.

> -        return gen_rtx_ROTATE (mode, XEXP (opright, 0), XEXP (opleft, 1));
> +         return gen_rtx_ROTATE (mode, XEXP (opright, 0), XEXP (opleft, 1));
> +     }

Looks good.  So referring back to the above, vector shifts will retain a
scalar shift amount if they started with a scalar shift amount, and a
vector shift amount if they started with a vector shift amount.

OK with formatting tweak, thanks.

Richard

>  
>        /* Same, but for ashift that has been "simplified" to a wider mode
>          by simplify_shift_const.  */

Reply via email to