Jonathan Wright <jonathan.wri...@arm.com> writes:
> Hi,
>
> Extracting a bitfield from a vector can be achieved by casting the
> vector to a new type whose elements are the same size as the desired
> bitfield, before generating a subreg. However, this is only an
> optimization if the original vector can be accessed in the new
> machine mode without first being copied - a condition denoted by the
> TARGET_MODES_TIEABLE_P hook.
>
> This patch adds a check to make sure that the vector modes are
> tieable before attempting to generate a subreg. This is a necessary
> prerequisite for a subsequent patch that will introduce new machine
> modes for Arm Neon vector-tuple types.
>
> Bootstrapped and regression tested on aarch64-none-linux-gnu and
> x86_64-pc-linux-gnu - no issues.
>
> Ok for master?
>
> Thanks,
> Jonathan
>
> ---
>
> gcc/ChangeLog:
>
> 2021-10-11  Jonathan Wright  <jonathan.wri...@arm.com>
>
>         * expmed.c (extract_bit_field_1): Ensure modes are tieable.

OK, thanks.

Richard

> diff --git a/gcc/expmed.c b/gcc/expmed.c
> index 
> 59734d4841cbd2056a7d5bda9134af79c8024c87..f58fb9d877d66809b39253ccdc803f0ecb009326
>  100644
> --- a/gcc/expmed.c
> +++ b/gcc/expmed.c
> @@ -1734,7 +1734,8 @@ extract_bit_field_1 (rtx str_rtx, poly_uint64 bitsize, 
> poly_uint64 bitnum,
>        FOR_EACH_MODE_FROM (new_mode, new_mode)
>       if (known_eq (GET_MODE_SIZE (new_mode), GET_MODE_SIZE (GET_MODE (op0)))
>           && known_eq (GET_MODE_UNIT_SIZE (new_mode), GET_MODE_SIZE (tmode))
> -         && targetm.vector_mode_supported_p (new_mode))
> +         && targetm.vector_mode_supported_p (new_mode)
> +         && targetm.modes_tieable_p (GET_MODE (op0), new_mode))
>         break;
>        if (new_mode != VOIDmode)
>       op0 = gen_lowpart (new_mode, op0);

Reply via email to