[llvm] r318894 - [X86] Turn an if condition that should always be true into an assert. NFCI
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 22 19:24:02 PST 2017
Author: ctopper
Date: Wed Nov 22 19:24:01 2017
New Revision: 318894
URL: http://llvm.org/viewvc/llvm-project?rev=318894&view=rev
Log:
[X86] Turn an if condition that should always be true into an assert. NFCI
If Values.size() == 0, we should have returned 0 or undef earlier. If it was 1, it's a splat and we already handled that too.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=318894&r1=318893&r2=318894&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Nov 22 19:24:01 2017
@@ -8140,57 +8140,56 @@ X86TargetLowering::LowerBUILD_VECTOR(SDV
return DAG.getVectorShuffle(VT, dl, Ops[0], Ops[1], MaskVec);
}
- if (Values.size() > 1) {
- // Check for a build vector from mostly shuffle plus few inserting.
- if (SDValue Sh = buildFromShuffleMostly(Op, DAG))
- return Sh;
-
- // For SSE 4.1, use insertps to put the high elements into the low element.
- if (Subtarget.hasSSE41()) {
- SDValue Result;
- if (!Op.getOperand(0).isUndef())
- Result = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(0));
- else
- Result = DAG.getUNDEF(VT);
-
- for (unsigned i = 1; i < NumElems; ++i) {
- if (Op.getOperand(i).isUndef()) continue;
- Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, Result,
- Op.getOperand(i), DAG.getIntPtrConstant(i, dl));
- }
- return Result;
- }
+ assert(Values.size() > 1 && "Expected non-undef and non-splat vector");
- // Otherwise, expand into a number of unpckl*, start by extending each of
- // our (non-undef) elements to the full vector width with the element in the
- // bottom slot of the vector (which generates no code for SSE).
- SmallVector<SDValue, 8> Ops(NumElems);
- for (unsigned i = 0; i < NumElems; ++i) {
- if (!Op.getOperand(i).isUndef())
- Ops[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
- else
- Ops[i] = DAG.getUNDEF(VT);
+ // Check for a build vector from mostly shuffle plus few inserting.
+ if (SDValue Sh = buildFromShuffleMostly(Op, DAG))
+ return Sh;
+
+ // For SSE 4.1, use insertps to put the high elements into the low element.
+ if (Subtarget.hasSSE41()) {
+ SDValue Result;
+ if (!Op.getOperand(0).isUndef())
+ Result = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(0));
+ else
+ Result = DAG.getUNDEF(VT);
+
+ for (unsigned i = 1; i < NumElems; ++i) {
+ if (Op.getOperand(i).isUndef()) continue;
+ Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, Result,
+ Op.getOperand(i), DAG.getIntPtrConstant(i, dl));
}
+ return Result;
+ }
- // Next, we iteratively mix elements, e.g. for v4f32:
- // Step 1: unpcklps 0, 1 ==> X: <?, ?, 1, 0>
- // : unpcklps 2, 3 ==> Y: <?, ?, 3, 2>
- // Step 2: unpcklpd X, Y ==> <3, 2, 1, 0>
- for (unsigned Scale = 1; Scale < NumElems; Scale *= 2) {
- // Generate scaled UNPCKL shuffle mask.
- SmallVector<int, 16> Mask;
- for(unsigned i = 0; i != Scale; ++i)
- Mask.push_back(i);
- for (unsigned i = 0; i != Scale; ++i)
- Mask.push_back(NumElems+i);
- Mask.append(NumElems - Mask.size(), SM_SentinelUndef);
+ // Otherwise, expand into a number of unpckl*, start by extending each of
+ // our (non-undef) elements to the full vector width with the element in the
+ // bottom slot of the vector (which generates no code for SSE).
+ SmallVector<SDValue, 8> Ops(NumElems);
+ for (unsigned i = 0; i < NumElems; ++i) {
+ if (!Op.getOperand(i).isUndef())
+ Ops[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
+ else
+ Ops[i] = DAG.getUNDEF(VT);
+ }
- for (unsigned i = 0, e = NumElems / (2 * Scale); i != e; ++i)
- Ops[i] = DAG.getVectorShuffle(VT, dl, Ops[2*i], Ops[(2*i)+1], Mask);
- }
- return Ops[0];
+ // Next, we iteratively mix elements, e.g. for v4f32:
+ // Step 1: unpcklps 0, 1 ==> X: <?, ?, 1, 0>
+ // : unpcklps 2, 3 ==> Y: <?, ?, 3, 2>
+ // Step 2: unpcklpd X, Y ==> <3, 2, 1, 0>
+ for (unsigned Scale = 1; Scale < NumElems; Scale *= 2) {
+ // Generate scaled UNPCKL shuffle mask.
+ SmallVector<int, 16> Mask;
+ for(unsigned i = 0; i != Scale; ++i)
+ Mask.push_back(i);
+ for (unsigned i = 0; i != Scale; ++i)
+ Mask.push_back(NumElems+i);
+ Mask.append(NumElems - Mask.size(), SM_SentinelUndef);
+
+ for (unsigned i = 0, e = NumElems / (2 * Scale); i != e; ++i)
+ Ops[i] = DAG.getVectorShuffle(VT, dl, Ops[2*i], Ops[(2*i)+1], Mask);
}
- return SDValue();
+ return Ops[0];
}
// 256-bit AVX can use the vinsertf128 instruction
More information about the llvm-commits
mailing list