diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:03:47 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:04:23 +0000 |
| commit | 7fa27ce4a07f19b07799a767fc29416f3b625afb (patch) | |
| tree | 27825c83636c4de341eb09a74f49f5d38a15d165 /llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp | |
| parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) | |
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp | 93 |
1 files changed, 71 insertions, 22 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index e245b3cb4c6d..3862fd241897 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -29,6 +29,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/ISDOpcodes.h" +#include "llvm/CodeGen/MachineValueType.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/SelectionDAGNodes.h" #include "llvm/CodeGen/TargetLowering.h" @@ -38,7 +39,6 @@ #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/MachineValueType.h" #include <cassert> #include <cstdint> #include <iterator> @@ -296,7 +296,16 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { if (Op.getOpcode() == ISD::STRICT_SINT_TO_FP || Op.getOpcode() == ISD::STRICT_UINT_TO_FP) ValVT = Node->getOperand(1).getValueType(); - Action = TLI.getOperationAction(Node->getOpcode(), ValVT); + if (Op.getOpcode() == ISD::STRICT_FSETCC || + Op.getOpcode() == ISD::STRICT_FSETCCS) { + MVT OpVT = Node->getOperand(1).getSimpleValueType(); + ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(3))->get(); + Action = TLI.getCondCodeAction(CCCode, OpVT); + if (Action == TargetLowering::Legal) + Action = TLI.getOperationAction(Node->getOpcode(), OpVT); + } else { + Action = TLI.getOperationAction(Node->getOpcode(), ValVT); + } // If we're asked to expand a strict vector floating-point operation, // by default we're going to simply unroll it. That is usually the // best approach, except in the case where the resulting strict (scalar) @@ -368,6 +377,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { case ISD::FSQRT: case ISD::FSIN: case ISD::FCOS: + case ISD::FLDEXP: case ISD::FPOWI: case ISD::FPOW: case ISD::FLOG: @@ -402,6 +412,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { case ISD::SMULO: case ISD::UMULO: case ISD::FCANONICALIZE: + case ISD::FFREXP: case ISD::SADDSAT: case ISD::UADDSAT: case ISD::SSUBSAT: @@ -441,6 +452,8 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { case ISD::VECREDUCE_FMUL: case ISD::VECREDUCE_FMAX: case ISD::VECREDUCE_FMIN: + case ISD::VECREDUCE_FMAXIMUM: + case ISD::VECREDUCE_FMINIMUM: Action = TLI.getOperationAction(Node->getOpcode(), Node->getOperand(0).getValueType()); break; @@ -454,7 +467,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(2))->get(); Action = TLI.getCondCodeAction(CCCode, OpVT); if (Action == TargetLowering::Legal) - Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); + Action = TLI.getOperationAction(Node->getOpcode(), OpVT); break; } @@ -785,6 +798,13 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) { return; } break; + case ISD::ABDS: + case ISD::ABDU: + if (SDValue Expanded = TLI.expandABD(Node, DAG)) { + Results.push_back(Expanded); + return; + } + break; case ISD::BITREVERSE: ExpandBITREVERSE(Node, Results); return; @@ -943,6 +963,8 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) { case ISD::VECREDUCE_FMUL: case ISD::VECREDUCE_FMAX: case ISD::VECREDUCE_FMIN: + case ISD::VECREDUCE_FMAXIMUM: + case ISD::VECREDUCE_FMINIMUM: Results.push_back(TLI.expandVecReduce(Node, DAG)); return; case ISD::VECREDUCE_SEQ_FADD: @@ -958,7 +980,9 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) { return; } - Results.push_back(DAG.UnrollVectorOp(Node)); + SDValue Unrolled = DAG.UnrollVectorOp(Node); + for (unsigned I = 0, E = Unrolled->getNumValues(); I != E; ++I) + Results.push_back(Unrolled.getValue(I)); } SDValue VectorLegalizer::ExpandSELECT(SDNode *Node) { @@ -1304,11 +1328,11 @@ SDValue VectorLegalizer::ExpandVP_SELECT(SDNode *Node) { return DAG.UnrollVectorOp(Node); SDValue Ones = DAG.getAllOnesConstant(DL, VT); - SDValue NotMask = DAG.getNode(ISD::VP_XOR, DL, VT, Mask, Ones, Mask, EVL); + SDValue NotMask = DAG.getNode(ISD::VP_XOR, DL, VT, Mask, Ones, Ones, EVL); - Op1 = DAG.getNode(ISD::VP_AND, DL, VT, Op1, Mask, Mask, EVL); - Op2 = DAG.getNode(ISD::VP_AND, DL, VT, Op2, NotMask, Mask, EVL); - return DAG.getNode(ISD::VP_OR, DL, VT, Op1, Op2, Mask, EVL); + Op1 = DAG.getNode(ISD::VP_AND, DL, VT, Op1, Mask, Ones, EVL); + Op2 = DAG.getNode(ISD::VP_AND, DL, VT, Op2, NotMask, Ones, EVL); + return DAG.getNode(ISD::VP_OR, DL, VT, Op1, Op2, Ones, EVL); } SDValue VectorLegalizer::ExpandVP_MERGE(SDNode *Node) { @@ -1516,39 +1540,54 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node, SmallVectorImpl<SDValue> &Results) { bool NeedInvert = false; bool IsVP = Node->getOpcode() == ISD::VP_SETCC; - SDLoc dl(Node); - MVT OpVT = Node->getOperand(0).getSimpleValueType(); - ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(2))->get(); + bool IsStrict = Node->getOpcode() == ISD::STRICT_FSETCC || + Node->getOpcode() == ISD::STRICT_FSETCCS; + bool IsSignaling = Node->getOpcode() == ISD::STRICT_FSETCCS; + unsigned Offset = IsStrict ? 1 : 0; + + SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue(); + SDValue LHS = Node->getOperand(0 + Offset); + SDValue RHS = Node->getOperand(1 + Offset); + SDValue CC = Node->getOperand(2 + Offset); + + MVT OpVT = LHS.getSimpleValueType(); + ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get(); if (TLI.getCondCodeAction(CCCode, OpVT) != TargetLowering::Expand) { + if (IsStrict) { + UnrollStrictFPOp(Node, Results); + return; + } Results.push_back(UnrollVSETCC(Node)); return; } - SDValue Chain; - SDValue LHS = Node->getOperand(0); - SDValue RHS = Node->getOperand(1); - SDValue CC = Node->getOperand(2); SDValue Mask, EVL; if (IsVP) { - Mask = Node->getOperand(3); - EVL = Node->getOperand(4); + Mask = Node->getOperand(3 + Offset); + EVL = Node->getOperand(4 + Offset); } + SDLoc dl(Node); bool Legalized = TLI.LegalizeSetCCCondCode(DAG, Node->getValueType(0), LHS, RHS, CC, Mask, - EVL, NeedInvert, dl, Chain); + EVL, NeedInvert, dl, Chain, IsSignaling); if (Legalized) { // If we expanded the SETCC by swapping LHS and RHS, or by inverting the // condition code, create a new SETCC node. if (CC.getNode()) { - if (!IsVP) - LHS = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), LHS, RHS, CC, - Node->getFlags()); - else + if (IsStrict) { + LHS = DAG.getNode(Node->getOpcode(), dl, Node->getVTList(), + {Chain, LHS, RHS, CC}, Node->getFlags()); + Chain = LHS.getValue(1); + } else if (IsVP) { LHS = DAG.getNode(ISD::VP_SETCC, dl, Node->getValueType(0), {LHS, RHS, CC, Mask, EVL}, Node->getFlags()); + } else { + LHS = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), LHS, RHS, CC, + Node->getFlags()); + } } // If we expanded the SETCC by inverting the condition code, then wrap @@ -1560,6 +1599,8 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node, LHS = DAG.getVPLogicalNOT(dl, LHS, Mask, EVL, LHS->getValueType(0)); } } else { + assert(!IsStrict && "Don't know how to expand for strict nodes."); + // Otherwise, SETCC for the given comparison type must be completely // illegal; expand it into a SELECT_CC. EVT VT = Node->getValueType(0); @@ -1571,6 +1612,8 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node, } Results.push_back(LHS); + if (IsStrict) + Results.push_back(Chain); } void VectorLegalizer::ExpandUADDSUBO(SDNode *Node, @@ -1618,6 +1661,12 @@ void VectorLegalizer::ExpandStrictFPOp(SDNode *Node, return; } + if (Node->getOpcode() == ISD::STRICT_FSETCC || + Node->getOpcode() == ISD::STRICT_FSETCCS) { + ExpandSETCC(Node, Results); + return; + } + UnrollStrictFPOp(Node, Results); } |
