Kyrylo Tkachov <[email protected]> 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. */