[LLVMdev] Shuffle combine
Stefanus Du Toit
stefanus.dutoit at rapidmind.com
Wed Apr 1 07:30:48 PDT 2009
On 1-Apr-09, at 7:34 AM, Nicolas Capens wrote:
> I’m having some trouble understanding the following lines in
> InstructionCombining.cpp, which possibly contain a bug:
> if (Mask[i] >= 2*e)
> 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-
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<VectorType>(SVI.getType())->getNumElements();
if (VWidth != cast<VectorType>(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() ==
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!
Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev