We could go either direction on this transform. VectorCombine already goes this way for bitcasts (and handles more complicated cases using the cost model), so I'm proposing cast-first.
Deferring completely to VectorCombine is another possibility. But the backend should be able to invert this easily when the vectors have the same shape, so it doesn't seem like a transform that we need to avoid.
The motivating example from https://bugs.llvm.org/show_bug.cgi?id=49081 has an int-to-float sandwiched between 2 shuffles, and the backend currently does not reduce that, so on x86, we get something like:
pshufd $249, %xmm0, %xmm0 ## xmm0 = xmm0[1,2,3,3] cvtdq2ps %xmm0, %xmm0 shufps $144, %xmm0, %xmm0 ## xmm0 = xmm0[0,0,1,2]
...instead of just a single conversion instruction.