[llvm-commits] [llvm] r143177 - in /llvm/trunk: lib/CodeGen/SelectionDAG/ lib/Target/ARM/ lib/Target/X86/ lib/Target/XCore/ test/CodeGen/CellSPU/ test/CodeGen/Mips/ test/CodeGen/Thumb/ test/CodeGen/X86/
Eli Friedman
eli.friedman at gmail.com
Thu Oct 27 18:56:18 PDT 2011
On Thu, Oct 27, 2011 at 6:29 PM, Dan Gohman <gohman at apple.com> wrote:
> @@ -3628,6 +3351,35 @@
> Results.push_back(Tmp1);
> break;
> }
> + case ISD::BUILD_VECTOR:
> + Results.push_back(ExpandBUILD_VECTOR(Node));
> + break;
> + case ISD::SRA:
> + case ISD::SRL:
> + case ISD::SHL: {
> + // Scalarize vector SRA/SRL/SHL.
> + EVT VT = Node->getValueType(0);
> + assert(VT.isVector() && "Unable to legalize non-vector shift");
> + assert(TLI.isTypeLegal(VT.getScalarType())&& "Element type must be legal");
> + unsigned NumElem = VT.getVectorNumElements();
> +
> + SmallVector<SDValue, 8> Scalars;
> + for (unsigned Idx = 0; Idx < NumElem; Idx++) {
> + SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
> + VT.getScalarType(),
> + Node->getOperand(0), DAG.getIntPtrConstant(Idx));
> + SDValue Sh = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
> + VT.getScalarType(),
> + Node->getOperand(1), DAG.getIntPtrConstant(Idx));
> + Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,
> + VT.getScalarType(), Ex, Sh));
> + }
> + SDValue Result =
> + DAG.getNode(ISD::BUILD_VECTOR, dl, Node->getValueType(0),
> + &Scalars[0], Scalars.size());
> + DAG.ReplaceAllUsesWith(SDValue(Node, 0), Result, this);
> + break;
> + }
We ought to be scalarizing vector shifts in LegalizeVectorOps; is
there some case where that is not sufficient?
-Eli
More information about the llvm-commits
mailing list