diff options
author | Ayman Musa <ayman.musa@intel.com> | 2017-09-14 12:06:38 +0000 |
---|---|---|
committer | Ayman Musa <ayman.musa@intel.com> | 2017-09-14 12:06:38 +0000 |
commit | ab68449c537989b8761228c10401aa6d6f075272 (patch) | |
tree | b0221c4352090f2d1935d83c10a2bef631e1fceb /llvm/lib/Target/X86/X86ISelLowering.cpp | |
parent | 5891060ff8f0fef1f936f20b7db16b1f0cc7bbe2 (diff) | |
download | bcm5719-llvm-ab68449c537989b8761228c10401aa6d6f075272.tar.gz bcm5719-llvm-ab68449c537989b8761228c10401aa6d6f075272.zip |
[X86] When applying the shuffle-to-zero-extend transformation on floating point, bitcast to integer first.
Fix issue described in PR34577.
Differential Revision: https://reviews.llvm.org/D37803
llvm-svn: 313256
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ee82c80625a..3089204ba8d 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -27153,13 +27153,18 @@ static bool matchUnaryVectorShuffle(MVT MaskVT, ArrayRef<int> Mask, } if (Match) { unsigned SrcSize = std::max(128u, NumDstElts * MaskEltSize); - SrcVT = MVT::getVectorVT(MaskVT.getScalarType(), SrcSize / MaskEltSize); - if (SrcVT != MaskVT) + MVT ScalarTy = MaskVT.isInteger() ? MaskVT.getScalarType() : + MVT::getIntegerVT(MaskEltSize); + SrcVT = MVT::getVectorVT(ScalarTy, SrcSize / MaskEltSize); + + if (SrcVT.getSizeInBits() != MaskVT.getSizeInBits()) { V1 = extractSubVector(V1, 0, DAG, DL, SrcSize); + Shuffle = unsigned(X86ISD::VZEXT); + } else + Shuffle = unsigned(ISD::ZERO_EXTEND_VECTOR_INREG); + DstVT = MVT::getIntegerVT(Scale * MaskEltSize); DstVT = MVT::getVectorVT(DstVT, NumDstElts); - Shuffle = SrcVT != MaskVT ? unsigned(X86ISD::VZEXT) - : unsigned(ISD::ZERO_EXTEND_VECTOR_INREG); return true; } } |