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);