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

Filipe Cabecinhas filcab+llvm.phabricator at gmail.com
Mon May 5 18:03:08 PDT 2014

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 >

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.


On Fri, May 2, 2014 at 11:55 PM, Nadav Rotem <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> 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
> > 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/20140505/0dcb49d6/attachment.html>

More information about the llvm-commits mailing list