[ARM] Do not use vtrn for vectorshuffle if the order is reversed
authorJames Molloy <james.molloy@arm.com>
Thu, 10 Sep 2015 08:42:28 +0000 (08:42 +0000)
committerJames Molloy <james.molloy@arm.com>
Thu, 10 Sep 2015 08:42:28 +0000 (08:42 +0000)
commite403c7b00f3e141f3462a4f307e7de7c825f4e4a
treeb0fb9cf67364bc0fc14d3152eae694503905a010
parent3dba3be8e521318a6d3000baaf1ce9c458c915f6
[ARM] Do not use vtrn for vectorshuffle if the order is reversed

The tests in isVTRNMask and isVTRN_v_undef_Mask should also check that the elements of the upper and lower half of the vectorshuffle occur in the correct order when both halves are used. Without this test the code assumes that it is correct to use vector transpose (vtrn) for the masks <1, 1, 0, 0> and <1, 3, 0, 2>, among others, but the transpose actually incorrectly generates shuffles for <0, 0, 1, 1> and <0, 2, 1, 3> in this case.

Patch by Jeroen Ketema!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247254 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMISelLowering.cpp
test/CodeGen/ARM/vtrn.ll
test/CodeGen/ARM/vuzp.ll
test/CodeGen/ARM/vzip.ll