This patch extends SLP Vectorizer to vectorize code involving structs/arrays that resemble vectors. The motivation, as explained here is to vectorize tuples and structs in Julia that act like vectors.
Per Arnold Schwaighofer's suggestion, the improvement works backwards from a store of insert value instructions. The associated patch D14260 adds a peephole optimization to inst-combine to clean up.
I limited the SLPVectorization change to aggregates that resemble vectors of length 2, 4, 8, or 16 since other lengths seem unlikely to pay off, but I could be wrong.
In some spots, I changed logic for "extractelement" to be "polymorphic" to "extractelement" or "extractvalue". In other places (e.g. findBuildVector"), that seemed to be more trouble than it was worth and so I coded custom logic (e.g. findBuildAggregate).
Nitpick: i should be capitalized (or should we use another name at all?).