[PATCH] Fix vselect when getSetCCResultType returns a different type from the operands
Nadav Rotem
nrotem at apple.com
Fri May 3 20:57:51 PDT 2013
Hi Matt,
Thanks for working on this. The change LGTM. Is there an in-tree target that you can test it with ?
Thanks,
Nadav
On May 3, 2013, at 8:42 PM, Matt Arsenault <Matthew.Arsenault at amd.com> wrote:
> Hi nadav,
>
> http://llvm-reviews.chandlerc.com/D743
>
> Files:
> lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
>
> Index: lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
> +++ lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
> @@ -652,13 +652,14 @@
> SDValue VectorLegalizer::ExpandVSELECT(SDValue Op) {
> // Implement VSELECT in terms of XOR, AND, OR
> // on platforms which do not support blend natively.
> - EVT VT = Op.getOperand(0).getValueType();
> DebugLoc DL = Op.getDebugLoc();
>
> SDValue Mask = Op.getOperand(0);
> SDValue Op1 = Op.getOperand(1);
> SDValue Op2 = Op.getOperand(2);
>
> + EVT VT = Mask.getValueType();
> +
> // If we can't even use the basic vector operations of
> // AND,OR,XOR, we will have to scalarize the op.
> // Notice that the operation may be 'promoted' which means that it is
> @@ -673,8 +674,22 @@
> TargetLowering::ZeroOrNegativeOneBooleanContent)
> return DAG.UnrollVectorOp(Op.getNode());
>
> - assert(VT.getSizeInBits() == Op1.getValueType().getSizeInBits()
> - && "Invalid mask size");
> + // If the mask and the type do not match and Select is legal,
> + // go ahead and unroll the vector op.
> + // This occurs when getSetCCResultType returns something that
> + // is different than the operand types. For example,
> + // v4i8 = select v4i32, v4i8, v4i8.
> + if (Op1.getValueType() != VT &&
> + TLI.getTypeAction(*DAG.getContext(), VT.getScalarType())
> + == TargetLowering::TypeLegal &&
> + TLI.getOperationAction(ISD::SELECT, VT.getScalarType())
> + == TargetLowering::Legal) {
> + return DAG.UnrollVectorOp(Op.getNode());
> + }
> +
> + assert(VT.getSizeInBits() == Op.getOperand(1).getValueType().getSizeInBits()
> + && "Invalid mask size and ISD::SELECT is not Legal!");
> +
> // Bitcast the operands to be the same type as the mask.
> // This is needed when we select between FP types because
> // the mask is a vector of integers.
> <D743.1.patch>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130503/e973ae14/attachment.html>
More information about the llvm-commits
mailing list