On 10/18/18, Richard Sandiford <richard.sandif...@arm.com> wrote: > "H.J. Lu" <hjl.to...@gmail.com> writes: >> On 10/17/18, Marc Glisse <marc.gli...@inria.fr> wrote: >>> On Wed, 17 Oct 2018, H.J. Lu wrote: >>> >>>> We may simplify >>>> >>>> (subreg (vec_merge (vec_duplicate X) (vector) (const_int 1)) 0) >>>> >>>> to X when mode of X is the same as of mode of subreg. >>> >>> Hello, >>> >>> we already have code to simplify vec_select(vec_merge): >>> >>> /* If we select elements in a vec_merge that all come from the same >>> operand, select from that operand directly. */ >>> >>> It would make sense to me to make the subreg transform as similar to it >>> as >>> possible, in particular you don't need to special case vec_duplicate, >>> the >>> transformation would see that everything comes from the first vector, >>> produce (subreg (vec_duplicate X) 0), and let another transformation >>> optimize that. > > Sorry, didn't see this before the OK. > >> What do you mean by another transformation? If simplify_subreg doesn't >> return X for >> >> (subreg (vec_merge (vec_duplicate X) >> (vector) >> (const_int ((1 << N) | M))) >> (N * sizeof (X))) >> >> >> no further transformation will be done. > > I think the point was that we should transform: > > (subreg (vec_merge X > (vector) > (const_int ((1 << N) | M))) > (N * sizeof (X))) > > into: > > simplify_gen_subreg (outermode, X, innermode, byte) > > which should further simplify when X is a vec_duplicate.
But sizeof (X) is the size of scalar of vec_dup. How do we check the mask of vec_merge? -- H.J.