[DagCombine] Improve DAGCombiner BUILD_VECTOR when it has two sources of elements
authorMichael Kuperstein <michael.m.kuperstein@intel.com>
Tue, 23 Dec 2014 08:59:45 +0000 (08:59 +0000)
committerMichael Kuperstein <michael.m.kuperstein@intel.com>
Tue, 23 Dec 2014 08:59:45 +0000 (08:59 +0000)
commit1f0ddef59352d53e9f5037a19732e9dab407702a
tree4ce0c72a957409279630e1fbfa211ca0c0c04c45
parent775294d1833592121e6ff3495a903d407f28aecb
[DagCombine] Improve DAGCombiner BUILD_VECTOR when it has two sources of elements

This partially fixes PR21943.

For AVX, we go from:

vmovq   (%rsi), %xmm0
vmovq   (%rdi), %xmm1
vpermilps       $-27, %xmm1, %xmm2 ## xmm2 = xmm1[1,1,2,3]
vinsertps       $16, %xmm2, %xmm1, %xmm1 ## xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
vinsertps       $32, %xmm0, %xmm1, %xmm1 ## xmm1 = xmm1[0,1],xmm0[0],xmm1[3]
vpermilps       $-27, %xmm0, %xmm0 ## xmm0 = xmm0[1,1,2,3]
vinsertps       $48, %xmm0, %xmm1, %xmm0 ## xmm0 = xmm1[0,1,2],xmm0[0]

To the expected:

vmovq   (%rdi), %xmm0
vmovhpd (%rsi), %xmm0, %xmm0
retq

Fixing this for AVX2 is still open.

Differential Revision: http://reviews.llvm.org/D6749

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