This is an archive of the discontinued LLVM Phabricator instance.

[X86] Improve DAGCombiner BUILD_VECTOR with two sources of elements
ClosedPublic

Authored by mkuper on Dec 21 2014, 5:51 AM.

Details

Summary

This partially solves 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

AVX2 is still far from optimal, and will be handled separately.

Diff Detail

Repository
rL LLVM

Event Timeline

mkuper updated this revision to Diff 17536.Dec 21 2014, 5:51 AM
mkuper retitled this revision from to [X86] Improve DAGCombiner BUILD_VECTOR with two sources of elements .
mkuper updated this object.
mkuper edited the test plan for this revision. (Show Details)
mkuper added reviewers: spatel, RKSimon, andreadb.
mkuper added a subscriber: Unknown Object (MLST).
spatel accepted this revision.Dec 22 2014, 10:43 AM
spatel edited edge metadata.

LGTM.

This revision is now accepted and ready to land.Dec 22 2014, 10:43 AM
This revision was automatically updated to reflect the committed changes.