[LLVMdev] Shuffle combine

Mon Ping Wang wangmp at apple.com
Sat Apr 4 22:10:33 PDT 2009


Hi,

Feel free to file a bug report if you would like.  I meant to clean  
this up after I made the change to extended the shuffle but never got  
around to it.  I'll try to deal with it sometime next week if time  
permits.

   -- Mon Ping

  --

On Apr 3, 2009, at 11:57 AM, Stefanus Du Toit wrote:

> Hi Nicolas,
>
> On 2-Apr-09, at 6:04 PM, Nicolas Capens wrote:
>> Thanks for verifying this. Could you patch this or should I open a  
>> new bug report and find a generic solution first?
>
> I don't have write access so the best I could do would be to submit  
> a patch, and I'm crazy busy at the moment.
>
> I actually think the check I described below is fine and would fix  
> this bug (but haven't tested it), but the function could be improved  
> to operate on more cases. I'd actually be happy to work on a patch  
> for this in my spare time since I haven't hacked on LLVM in a while,  
> but if you're interested in doing it let me know. In any case, the  
> one-line patch (plus a test case, and probably an assert to do the  
> bounds check in debug mode) would probably be worthwhile to do right  
> away.
>
> 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 18:59
>> To: LLVM Developers Mailing List
>> Subject: Re: [LLVMdev] Shuffle combine
>>
>> 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
>>
>>
>>
>> <ATT00001.txt>
>
> --
> Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
>   RapidMind Inc.
>   phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090404/6cc0394b/attachment.html>


More information about the llvm-dev mailing list