[InstCombine] Fix SSE2/AVX2 vector logical shift by constant
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 7 Aug 2015 18:22:50 +0000 (18:22 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 7 Aug 2015 18:22:50 +0000 (18:22 +0000)
commit547527cc835268a04e68dd36913350fc72692a4f
tree2d0a77a80c801e61bab5f7d5fc6afb014565cbb0
parent433c477edd7b66f823a823a597a6b65eab2941f1
[InstCombine] Fix SSE2/AVX2 vector logical shift by constant

This patch fixes the sse2/avx2 vector shift by constant instcombine call to correctly deal with the fact that the shift amount is formed from the entire lower 64-bit and not just the lowest element as it currently assumes.

e.g.

%1 = tail call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %v, <4 x i32> <i32 15, i32 15, i32 15, i32 15>)

In this case, (V)PSRLD doesn't perform a lshr by 15 but in fact attempts to shift by 64424509455 ((15 << 32) | 15) - giving a zero result.

In addition, this review also recognizes shift-by-zero from a ConstantAggregateZero type (PR23821).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244341 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineCalls.cpp
test/Transforms/InstCombine/x86-vector-shifts.ll