[InstCombine] recognize bswap disguised as shufflevector
authorSanjay Patel <spatel@rotateright.com>
Mon, 2 Sep 2019 13:33:20 +0000 (13:33 +0000)
committerSanjay Patel <spatel@rotateright.com>
Mon, 2 Sep 2019 13:33:20 +0000 (13:33 +0000)
commit561c39994b95ec6c930850ff556b161d9d27af37
tree0158962bf0a199a5aa8ba25f4f5cdea4c261089f
parenteafede2afeb45c826957d49c7895a04655f1f08d
[InstCombine] recognize bswap disguised as shufflevector

bitcast <N x i8> (shuf X, undef, <N, N-1,...0>) to i{N*8} --> bswap (bitcast X to i{N*8})

In PR43146:
https://bugs.llvm.org/show_bug.cgi?id=43146
...we have a more complicated case where SLP is making a mess of bswap. This patch won't
do anything for that currently, but we need to improve bswap recognition in instcombine,
SLP, and/or a standalone pass to avoid that problem.

This is limited using the data-layout so we don't try to do this transform with actual
vector types. The backend does not appear to have folds to convert in either direction,
so we don't want to mess up something that is actually better lowered as a shuffle.

On x86, we're trading something like this:

  vmovd %edi, %xmm0
  vpshufb LCPI0_0(%rip), %xmm0, %xmm0 ## xmm0 = xmm0[3,2,1,0,u,u,u,u,u,u,u,u,u,u,u,u]
  vmovd %xmm0, %eax

For:

  movl %edi, %eax
  bswapl %eax

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

llvm-svn: 370659
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
llvm/test/Transforms/InstCombine/bswap.ll