[x86] Teach the new vector shuffle lowering to use 'punpcklwd' and
authorChandler Carruth <chandlerc@gmail.com>
Mon, 15 Sep 2014 09:02:37 +0000 (09:02 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 15 Sep 2014 09:02:37 +0000 (09:02 +0000)
commita6cc351c5b576ffadaaf00fb5b5771a2ac153160
tree7005be253a6257dda13ba333c9fefd740dd33df5
parentd090be97a8c477bd63e6b60245288ddff0d04ede
[x86] Teach the new vector shuffle lowering to use 'punpcklwd' and
'punpckhwd' instructions when suitable rather than falling back to the
generic algorithm.

While we could canonicalize to these patterns late in the process, that
wouldn't help when the freedom to use them is only visible during
initial lowering when undef lanes are well understood. This, it turns
out, is very important for matching the shuffle patterns that are used
to lower sign extension. Fixes a small but relevant regression in
gcc-loops with the new lowering.

When I changed this I noticed that several 'pshufd' lowerings became
unpck variants. This is bad because it removes the ability to freely
copy in the same instruction. I've adjusted the widening test to handle
undef lanes correctly and now those will correctly continue to use
'pshufd' to lower. However, this caused a bunch of churn in the test
cases. No functional change, just churn.

Both of these changes are part of addressing a general weakness in the
new lowering -- it doesn't sufficiently leverage undef lanes. I've at
least a couple of patches that will help there at least in an academic
sense.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217752 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/vector-shuffle-128-v8.ll