OSDN Git Service

[DAGCombiner] shrink/widen a vselect to match its condition operand size (PR14657)
authorSanjay Patel <spatel@rotateright.com>
Sun, 30 Apr 2017 22:44:51 +0000 (22:44 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sun, 30 Apr 2017 22:44:51 +0000 (22:44 +0000)
commit7c77a6cf1a120385f7bdce71d493922b11772d98
tree43a10006f91e88eacc45565e64718f11eea944ed
parent21ade9ba1e089139374d0906a11d5b40978e3811
[DAGCombiner] shrink/widen a vselect to match its condition operand size (PR14657)

We discussed shrinking/widening of selects in IR in D26556, and I'll try to get back to that
patch eventually. But I'm hoping that this transform is less iffy in the DAG where we can check
legality of the select that we want to produce.

A few things to note:

1. We can't wait until after legalization and do this generically because (at least in the x86
   tests from PR14657), we'll have PACKSS and bitcasts in the pattern.
2. This might benefit more of the SSE codegen if we lifted the legal-or-custom requirement, but
   that requires a closer look to make sure we don't end up worse.
3. There's a 'vblendv' opportunity that we're missing that results in andn/and/or in some cases.
   That should be fixed next.
4. I'm assuming that AVX1 offers the worst of all worlds wrt uneven ISA support with multiple
   legal vector sizes, but if there are other targets like that, we should add more tests.
5. There's a codegen miracle in the multi-BB tests from PR14657 (the gcc auto-vectorization tests):
   despite IR that is terrible for the target, this patch allows us to generate the optimal loop
   code because something post-ISEL is hoisting the splat extends above the vector loops.

Differential Revision: https://reviews.llvm.org/D32620

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301781 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/cast-vsel.ll