vporpo's phi-undef-input.ll shows how we would build vectors with poison where we wanted undef. Rather than continuing to treat undef as a special case and fixing the handling of it, this change fixes the problem by limiting the special casing to poison. undef is now treated as any other constant, by selecting from a specific input, and preserved that way.
This is an alternative to D126939.
For undefs need to push UndefMaskElem: