[PATCH] Fold selects when the non-selected elements are undef from shufflevectors

Philip Reames listmail at philipreames.com
Tue May 6 12:17:13 PDT 2014


Could you spell out what you believe to be the right approach w.r.t. 
this topic?  I'd also appreciate any links to previous discussion on 
this topic; a quick google search didn't find much.

Reading through Filipe's patch, it seems entirely reasonable to me. It's 
a strict reduction in the number of shufflevectors in the IR. Even given 
the fact we can't lower shuffle vector perfectly in all cases, I don't 
see the harm in this patch.  I'm not trying to say you're wrong; I'm 
merely trying to understand what it is I'm not seeing here.


On 05/06/2014 09:22 AM, Nadav Rotem wrote:
> Hi Filipe,
> Thank you for working on this. I appreciate the fact that you are 
> eager to improve LLVM and that you went through the trouble of testing 
> your code on multiple targets and on considering different 
> alternatives to the problem.  I think that the patch below is 
> unrelated to the blend->select lowering so I will only address this 
> patch. We discussed on the possibility of creating new shuffles on the 
> llvm mailing lists more than once. We decided not to create new 
> shuffles because we may create new shuffle patterns that we can't 
> lower efficiently. I ran into this problem a few times myself in 
> different LLVM-based projects, mainly in the domain of graphics where 
> people write swizzles themselves. Please do not commit this patch 
> because it creates new shuffles. It is not the correct approach. You 
> may get lucky in you selection of testcase, but I am sure that there 
> are lots of other shuffle inputs on X86 and other targets that this 
> patch makes worse.
> Thanks,
> Nadav
>> Hi Nadav,
>> I'd really like this patch to get in, since it improves code 
>> generation on many targets (at the very least, I've tried arm and 
>> arm64 (mcpu=cyclone), ppc32 and ppc64 (mcpu=g5), and x86 and x86-64 
>> (mcpu=nehalem) and they all improve (they end up with no loads vs. 1 
>> or 2 loads, and code size is about half of what it was).
>> Even if we'd like to make the select instruction be the proper 
>> canonicalization of this operation, it seems that, for now, a 
>> shufflevector is better when it comes to lowering it.
>> Several targets have the action for the vselect as Expand, which will 
>> generate a bunch of code which would then have to be pattern-matched, 
>> instead of lowering the vselect as custom and falling-through to 
>> Expand if there's no special-case instruction/set of instructions 
>> that we can emit.
>> I ran opt+llc in this way, for the variants I mentioned above 
>> (./bin/opt is opt with this optimization):
>> ./bin/opt -O3 select-from-shuffles.ll | ./bin/llc -march=arm64 
>> -mcpu=cyclone > arm64-cylone-opt
>> opt -O3 select-from-shuffles.ll | ./bin/llc -march=arm64 
>> -mcpu=cyclone > arm64-cylone-opt
>> I can understand if we eventually drop this after we make the backend 
>> treat the select as the canonical form of this operation and have 
>> llvm always use that form, but for now it seems that the 
>> shufflevector is better lowered in some important targets.
>>   Filipe
>> On Fri, May 2, 2014 at 11:55 PM, Nadav Rotem <nrotem at apple.com 
>> <mailto:nrotem at apple.com>> wrote:
>>     Hi Filipe,
>>     We don't generate new shufflevector instructions during
>>     optimizations because the lowering of shuffle instructions is
>>     really complicated and we don't want to generate a shuffle that
>>     we don't lower by accident.
>>     Thanks,
>>     Nadav
>>     On May 2, 2014, at 4:34 PM, Filipe Cabecinhas
>>     <filcab+llvm.phabricator at gmail.com
>>     <mailto:filcab%2Bllvm.phabricator at gmail.com>> wrote:
>>     > Remove unused argument
>>     >
>>     > http://reviews.llvm.org/D3561
>>     >
>>     > Files:
>>     >  lib/Transforms/InstCombine/InstCombineSelect.cpp
>>     >  test/Transforms/InstCombine/select.ll
>>     > <D3561.9050.patch>_______________________________________________
>>     > llvm-commits mailing list
>>     > llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
>>     > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140506/9524a143/attachment.html>

More information about the llvm-commits mailing list