This is a subset of a transform that we do in instcombine:
binop (splat X), SplatC --> splat (binop X, SplatC)
...and it seems to usually be working as intended (we seem to get more demanded-bits/elements optimizations), but I'm still going through these test diffs.
The end motivation is to reduce the number of patterns that we have to match when trying to scalarize with D60150.
This is intentionally limited to only work when the constant has no undef lanes, but we might be able to ease that as a follow-up. Otherwise, at least in the more general transform in instcombine, we have to deal with potential poison propagation and undef simplification.
Like in getKnownUndefForVectorBinop - add a TODO about not creating nodes on the fly.