https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83203
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- A general comment from my side here is that RTL really has too many ways to express vector "combinations" / "shuffles". In particular vec_merge can be expressed (up to the CONST_INT bitmask limit to 128 vector elements...) as (vec_select (vec_concat (...)). vec_merge has the advantage of not requiring the intermediate larger vector mode vec_concat requires. -> vec_perm to the rescue... but that requires changing all targets & patterns. The difficulty is that different targets perfer different variants (vec_merge vs. select/concat), so generic simplifications are very difficult to "tune". Eventually combine needs to learn the equivalence between vec_merge and select/concat and try "both"? Or we need to declare vec_merge as canonical when the bitmask is large enough (and fix all targets for that). Though in my view the select vector is easier to read in .md than the bitmask as integer...