I’m having some trouble understanding the following lines in InstructionCombining.cpp, which possibly contain a bug:
if (Mask[i] >= 2e)
When Mask[i] is bigger than the size of LHSMask it reads out of bounds on that last line. I believe the first line is there to try to prevent that but then it should be comparing to LHSMask.size() not 2*e (e being Mask.size()).
Upon quick inspection of the code, I don’t think this is necessarily a bug right now, but the function could be improved.
I believe this stems (in part at least) from the fact that shufflevector used to require that the sources and the mask have the same size, which was changed a few months ago to allow an arbitrarily-sized mask.
This would be a bug all throughout this function (which generally assumes this is still the case), if the function didn’t do the following check early:
unsigned VWidth = cast(SVI.getType())->getNumElements();
if (VWidth != cast(LHS->getType())->getNumElements())
In other words, if the mask size is not equal to the number of elements in the vectors, it skips this transformation.
Because the LHS is a shufflevector in the part of the code you are mentioning, and the result of a shufflevector has the same number of elements as its mask, you are actually guaranteed that LHSMask.size() == Mask.size(), because LHSMask.size() == LHS->getNumElements() == Mask.size().
It shouldn’t be too hard to relax the constraint that this optimization requires the number of elements being shuffle to be equal to the mask size, but it’ll probably take some careful testing!