diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-06-27 18:25:23 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-06-27 18:25:23 +0000 |
commit | 75504d45ec5b1c3c19b3db9ab7efe29d3d1ac1e9 (patch) | |
tree | 875c5e3cbf7485ca422e8f712e501502d6ddff8f /lib | |
parent | c8a1169c935ad9d3dfbdd4f72d80abf8f5acb03c (diff) | |
download | llvm-75504d45ec5b1c3c19b3db9ab7efe29d3d1ac1e9.tar.gz llvm-75504d45ec5b1c3c19b3db9ab7efe29d3d1ac1e9.tar.bz2 llvm-75504d45ec5b1c3c19b3db9ab7efe29d3d1ac1e9.tar.xz |
[x86] Fix a miscompile in the new shuffle lowering uncovered by
a bootstrap.
I managed to mis-remember how PACKUS worked on x86, and was using undef
for the high bytes instead of zero. The fix is fairly obvious.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211922 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c50f44daae..fa80717f99 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -7712,19 +7712,19 @@ static SDValue lowerV16I8VectorShuffle(SDValue Op, SDValue V1, SDValue V2, return DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i8, Evens, Odds); } - - SDValue LoV1 = DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, - DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i8, V1, - DAG.getUNDEF(MVT::v8i16))); - SDValue HiV1 = DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, - DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16i8, V1, - DAG.getUNDEF(MVT::v8i16))); - SDValue LoV2 = DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, - DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i8, V2, - DAG.getUNDEF(MVT::v8i16))); - SDValue HiV2 = DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, - DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16i8, V2, - DAG.getUNDEF(MVT::v8i16))); + SDValue Zero = getZeroVector(MVT::v8i16, Subtarget, DAG, DL); + SDValue LoV1 = + DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, + DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i8, V1, Zero)); + SDValue HiV1 = + DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, + DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16i8, V1, Zero)); + SDValue LoV2 = + DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, + DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i8, V2, Zero)); + SDValue HiV2 = + DAG.getNode(ISD::BITCAST, DL, MVT::v8i16, + DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16i8, V2, Zero)); int V1LoBlendMask[8] = {-1, -1, -1, -1, -1, -1, -1, -1}; int V1HiBlendMask[8] = {-1, -1, -1, -1, -1, -1, -1, -1}; |