LLVM: lib/CodeGen/SelectionDAG/MatchContext.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_MATCHCONTEXT_H
14#define LLVM_LIB_CODEGEN_SELECTIONDAG_MATCHCONTEXT_H
15
18
19namespace llvm {
20
25
26public:
28 : DAG(DAG), TLI(TLI), Root(Root) {}
29
34
35
37 return DAG.getNode(std::forward(Args)...);
38 }
39
41 return TLI.isOperationLegal(Op, VT);
42 }
43
45 bool LegalOnly = false) const {
46 return TLI.isOperationLegalOrCustom(Op, VT, LegalOnly);
47 }
48
50};
51
58
59public:
61 : DAG(DAG), TLI(TLI), RootMaskOp(), RootVectorLenOp() {
62 Root = _Root;
63 assert(Root->isVPOpcode());
65 RootMaskOp = Root->getOperand(*RootMaskPos);
66 else if (Root->getOpcode() == ISD::VP_SELECT)
67 RootMaskOp = DAG.getAllOnesConstant(SDLoc(Root),
68 Root->getOperand(0).getValueType());
69
71 RootVectorLenOp = Root->getOperand(*RootVLenPos);
72 }
73
76 Root->getOpcode(), !Root->getFlags().hasNoFPExcept());
77 assert(Opcode.has_value());
78 return *Opcode;
79 }
80
81
82
86
89 if (BaseOpc != Opc)
90 return false;
91
92
93 unsigned VPOpcode = OpVal->getOpcode();
96 if (RootMaskOp != MaskOp &&
98 return false;
99 }
100
101
103 if (RootVectorLenOp != OpVal.getOperand(*VLenPos))
104 return false;
105 return true;
106 }
107
108
109
110
111
116 return DAG.getNode(VPOpcode, DL, VT,
117 {Operand, RootMaskOp, RootVectorLenOp});
118 }
119
125 return DAG.getNode(VPOpcode, DL, VT, {N1, N2, RootMaskOp, RootVectorLenOp});
126 }
127
133 return DAG.getNode(VPOpcode, DL, VT,
134 {N1, N2, N3, RootMaskOp, RootVectorLenOp});
135 }
136
142 return DAG.getNode(VPOpcode, DL, VT, {Operand, RootMaskOp, RootVectorLenOp},
143 Flags);
144 }
145
151 return DAG.getNode(VPOpcode, DL, VT, {N1, N2, RootMaskOp, RootVectorLenOp},
152 Flags);
153 }
154
160 return DAG.getNode(VPOpcode, DL, VT,
161 {N1, N2, N3, RootMaskOp, RootVectorLenOp}, Flags);
162 }
163
166 return TLI.isOperationLegal(VPOp, VT);
167 }
168
170 bool LegalOnly = false) const {
172 return TLI.isOperationLegalOrCustom(VPOp, VT, LegalOnly);
173 }
174
176 return N->isVPOpcode() ? N->getNumOperands() - 2 : N->getNumOperands();
177 }
178};
179
180}
181
182#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file describes how to lower LLVM code to machine code.
bool match(SDValue OpN, unsigned Opcode) const
Definition MatchContext.h:31
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Definition MatchContext.h:44
unsigned getNumOperands(SDValue N) const
Definition MatchContext.h:49
EmptyMatchContext(SelectionDAG &DAG, const TargetLowering &TLI, SDNode *Root)
Definition MatchContext.h:27
unsigned getRootBaseOpcode()
Definition MatchContext.h:30
bool isOperationLegal(unsigned Op, EVT VT) const
Definition MatchContext.h:40
SDValue getNode(ArgT &&...Args)
Definition MatchContext.h:36
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDNodeFlags getFlags() const
bool isVPOpcode() const
Test if this node is a vector predication operation.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
const SDValue & getOperand(unsigned i) const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, SDValue N2, SDNodeFlags Flags)
Definition MatchContext.h:146
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Definition MatchContext.h:169
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand, SDNodeFlags Flags)
Definition MatchContext.h:137
bool isOperationLegal(unsigned Op, EVT VT) const
Definition MatchContext.h:164
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, SDValue N2, SDValue N3, SDNodeFlags Flags)
Definition MatchContext.h:155
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, SDValue N2, SDValue N3)
Definition MatchContext.h:128
bool match(SDValue OpVal, unsigned Opc) const
whether OpVal is a node that is functionally compatible with the NodeType Opc
Definition MatchContext.h:83
unsigned getRootBaseOpcode()
Definition MatchContext.h:74
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand)
Definition MatchContext.h:112
VPMatchContext(SelectionDAG &DAG, const TargetLowering &TLI, SDNode *_Root)
Definition MatchContext.h:60
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, SDValue N2)
Definition MatchContext.h:120
unsigned getNumOperands(SDValue N) const
Definition MatchContext.h:175
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
This is an optimization pass for GlobalISel generic memory operations.
DWARFExpression::Operation Op
These are IR-level optimization flags that may be propagated to SDNodes.
bool hasNoFPExcept() const