[LLVMdev] Shuffle combine
Stefanus Du Toit
stefanus.dutoit at rapidmind.com
Wed Apr 1 09:58:53 PDT 2009
On 1-Apr-09, at 12:42 PM, Nicolas Capens wrote:
> Hi Stefanus,
>
> Thanks for the info. I still think it’s a bug though. Take for
> example a case where the vectors each have four elements. The values
> in Mask[] can range from 0 to 7, while HLSMask only has 4 elements.
> So LHSMask[Mask[i]] can go out of bounds, no?
Good point! One easy way to fix this would be to use:
if (Mask[i] >= e) {
instead. The code could also be improved to consider the new mask
equal to lhsmask/mask in places where they both refer to undefined
elements.
Stefanus
> Cheers,
>
> Nicolas
>
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-
> bounces at cs.uiuc.edu] On Behalf Of Stefanus Du Toit
> Sent: woensdag 1 april 2009 16:31
> To: LLVM Developers Mailing List
> Subject: Re: [LLVMdev] Shuffle combine
>
> Hi Nicolas,
>
> 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)
> NewMask.push_back(2*e);
> else
> NewMask.push_back(LHSMask[Mask[i]]);
>
> 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<VectorType>(SVI.getType())->getNumElements();
>
> if (VWidth != cast<VectorType>(LHS->getType())->getNumElements())
> return 0;
>
> 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!
>
> Stefanus
>
> --
> Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
> RapidMind Inc.
> phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463
>
>
>
> <ATT00001.txt>
--
Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
RapidMind Inc.
phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090401/c7b5328b/attachment.html>
More information about the llvm-dev
mailing list