DAGCombine's mergeStoresOfConstantsOrVecElts optimization is told
whether it's to use vector types and also whether it's to issue a
truncating store. However, the truncating store code path assumes a
scalar integer ConstantSDNode, and when using vector types it creates
either a BUILD_VECTOR or CONCAT_VECTORS to store: neither of which
is a constant.
The riscv64 target is able to expose a crash here because it switches
on both code paths at the same time. The f32 is stored as i32 which
must be promoted to i64, necessitating a truncating store.
It also decides later that it prefers a vector store of v2f32.
While vector truncating stores are legal, this combine is not able to
emit them. We also don't have a test case. This patch adds an assert to
catch this case more gracefully, and updates one of the caller functions
to the function to turn off the use of truncating stores when preferring
vectors.