From 285d5e6b8b1ecc70c25468b6c7458d2adadeddf3 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sat, 4 Jan 2020 17:03:33 -0800 Subject: [PATCH] [LegalizeVectorOps] Split most of ExpandStrictFPOp into a separate UnrollStrictFPOp method. Call that method from ExpandUINT_TO_FLOAT. ExpandStrictFPOp calls ExpandUINT_TO_FLOAT. Previously, ExpandUINT_TO_FLOAT returned SDValue() if it wasn't able to handle and needed to unroll. Then ExpandStrictFPOp would detect his SDValue() and do the unroll. After this change, ExpandUINT_TO_FLOAT will directly call UnrollStrictFPOp and return the unrolled result. --- .../SelectionDAG/LegalizeVectorOps.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index c4287b09780c..4127feda0e8f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -148,6 +148,8 @@ class VectorLegalizer { SDValue ExpandFixedPointMul(SDValue Op); SDValue ExpandStrictFPOp(SDValue Op); + SDValue UnrollStrictFPOp(SDValue Op); + /// Implements vector promotion. /// /// This is essentially just bitcasting the operands to a different type and @@ -1208,8 +1210,11 @@ SDValue VectorLegalizer::ExpandUINT_TO_FLOAT(SDValue Op) { TargetLowering::Expand) || (IsStrict && TLI.getOperationAction(ISD::STRICT_SINT_TO_FP, VT) == TargetLowering::Expand)) || - TLI.getOperationAction(ISD::SRL, VT) == TargetLowering::Expand) - return IsStrict ? SDValue() : DAG.UnrollVectorOp(Op.getNode()); + TLI.getOperationAction(ISD::SRL, VT) == TargetLowering::Expand) { + if (IsStrict) + return UnrollStrictFPOp(Op); + return DAG.UnrollVectorOp(Op.getNode()); + } unsigned BW = VT.getScalarSizeInBits(); assert((BW == 64 || BW == 32) && @@ -1386,11 +1391,13 @@ SDValue VectorLegalizer::ExpandFixedPointMul(SDValue Op) { } SDValue VectorLegalizer::ExpandStrictFPOp(SDValue Op) { - if (Op.getOpcode() == ISD::STRICT_UINT_TO_FP) { - if (SDValue Res = ExpandUINT_TO_FLOAT(Op)) - return Res; - } + if (Op.getOpcode() == ISD::STRICT_UINT_TO_FP) + return ExpandUINT_TO_FLOAT(Op); + return UnrollStrictFPOp(Op); +} + +SDValue VectorLegalizer::UnrollStrictFPOp(SDValue Op) { EVT VT = Op.getValue(0).getValueType(); EVT EltVT = VT.getVectorElementType(); unsigned NumElems = VT.getVectorNumElements();