Given an (integer) vecreduce, we know the order of the inputs does not matter. We can convert UADDV(add(zext(extract_lo(x)), zext(extract_hi(x)))) into UADDV(UADDLP(x)). This can also happen through an extra add, where we transform UADDV(add(y, add(zext(extract_lo(x)), zext(extract_hi(x))))).
I've made sure the same thing happens signed cases too, which requires adding a new SADDLP node.
"naming the hardest problem in computer science"?
Just a nit about the function names. Perhaps this should be performSUADDVCombine for completeness/clarity?
Then, we wouldn't need to rename performUADDVCombine to performAddUADDVCombine although the new name is probably better otherwise a 1 character letter difference would be difficult to read.