summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFilipe Cabecinhas <me@filcab.net>2014-05-11 08:12:56 +0000
committerFilipe Cabecinhas <me@filcab.net>2014-05-11 08:12:56 +0000
commit4ccf0ebb19ffcd22ee730d3c90112dea31d619f4 (patch)
tree3e148a1c800a0c30b61d26943eca7a1995cdb1ae /lib
parente283f741337bd1ceb9a00c598ee6f6453d3f0129 (diff)
downloadllvm-4ccf0ebb19ffcd22ee730d3c90112dea31d619f4.tar.gz
llvm-4ccf0ebb19ffcd22ee730d3c90112dea31d619f4.tar.bz2
llvm-4ccf0ebb19ffcd22ee730d3c90112dea31d619f4.tar.xz
Fixed a bug when lowering build_vector (PR19694)
When lowering build_vector to an insertps, we would still lower it, even if the source vectors weren't v4x32. This would break on avx if the source was a v8x32. We now check the type of the source vectors. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208487 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 4ed3690629..616171b2b6 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -5458,7 +5458,12 @@ static SDValue LowerBuildVectorv4x32(SDValue Op, unsigned NumElems,
return SDValue();
SDValue V = FirstNonZero.getOperand(0);
- unsigned FirstNonZeroDst = cast<ConstantSDNode>(FirstNonZero.getOperand(1))->getZExtValue();
+ MVT VVT = V.getSimpleValueType();
+ if (VVT != MVT::v4f32 && VVT != MVT::v4i32)
+ return SDValue();
+
+ unsigned FirstNonZeroDst =
+ cast<ConstantSDNode>(FirstNonZero.getOperand(1))->getZExtValue();
unsigned CorrectIdx = FirstNonZeroDst == FirstNonZeroIdx;
unsigned IncorrectIdx = CorrectIdx ? -1U : FirstNonZeroIdx;
unsigned IncorrectDst = CorrectIdx ? -1U : FirstNonZeroDst;
@@ -5498,8 +5503,8 @@ static SDValue LowerBuildVectorv4x32(SDValue Op, unsigned NumElems,
else
ElementMoveMask = IncorrectDst << 6 | IncorrectIdx << 4;
- SDValue InsertpsMask = DAG.getIntPtrConstant(
- ElementMoveMask | (~NonZeros & 0xf));
+ SDValue InsertpsMask =
+ DAG.getIntPtrConstant(ElementMoveMask | (~NonZeros & 0xf));
return DAG.getNode(X86ISD::INSERTPS, dl, VT, V, V, InsertpsMask);
}