summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
authorAyman Musa <ayman.musa@intel.com>2017-09-14 12:06:38 +0000
committerAyman Musa <ayman.musa@intel.com>2017-09-14 12:06:38 +0000
commitab68449c537989b8761228c10401aa6d6f075272 (patch)
treeb0221c4352090f2d1935d83c10a2bef631e1fceb /llvm/lib/Target/X86/X86ISelLowering.cpp
parent5891060ff8f0fef1f936f20b7db16b1f0cc7bbe2 (diff)
downloadbcm5719-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.cpp13
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;
}
}
OpenPOWER on IntegriCloud