LLVM 18.0.0git
RISCVISelDAGToDAG.h
Go to the documentation of this file.
1//===---- RISCVISelDAGToDAG.h - A dag to dag inst selector for RISC-V -----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines an instruction selector for the RISC-V target.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_RISCV_RISCVISELDAGTODAG_H
14#define LLVM_LIB_TARGET_RISCV_RISCVISELDAGTODAG_H
15
16#include "RISCV.h"
17#include "RISCVTargetMachine.h"
20
21// RISC-V specific code to select RISC-V machine instructions for
22// SelectionDAG operations.
23namespace llvm {
25 const RISCVSubtarget *Subtarget = nullptr;
26
27public:
28 static char ID;
29
31
35
37 Subtarget = &MF.getSubtarget<RISCVSubtarget>();
39 }
40
41 void PreprocessISelDAG() override;
42 void PostprocessISelDAG() override;
43
44 void Select(SDNode *Node) override;
45
47 InlineAsm::ConstraintCode ConstraintID,
48 std::vector<SDValue> &OutOps) override;
49
53 bool IsINX = false);
55 return SelectAddrRegImm(Addr, Base, Offset, true);
56 }
57
58 bool SelectAddrRegRegScale(SDValue Addr, unsigned MaxShiftAmount,
59 SDValue &Base, SDValue &Index, SDValue &Scale);
60
61 template <unsigned MaxShift>
63 SDValue &Scale) {
64 return SelectAddrRegRegScale(Addr, MaxShift, Base, Index, Scale);
65 }
66
67 template <unsigned MaxShift, unsigned Bits>
69 SDValue &Scale) {
70 if (SelectAddrRegRegScale(Addr, MaxShift, Base, Index, Scale)) {
71 if (Index.getOpcode() == ISD::AND) {
72 auto *C = dyn_cast<ConstantSDNode>(Index.getOperand(1));
73 if (C && C->getZExtValue() == maskTrailingOnes<uint64_t>(Bits)) {
74 Index = Index.getOperand(0);
75 return true;
76 }
77 }
78 }
79 return false;
80 }
81
85
86 bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt);
88 return selectShiftMask(N, Subtarget->getXLen(), ShAmt);
89 }
91 return selectShiftMask(N, 32, ShAmt);
92 }
93
94 bool selectSETCC(SDValue N, ISD::CondCode ExpectedCCVal, SDValue &Val);
96 return selectSETCC(N, ISD::SETNE, Val);
97 }
99 return selectSETCC(N, ISD::SETEQ, Val);
100 }
101
102 bool selectSExtBits(SDValue N, unsigned Bits, SDValue &Val);
103 template <unsigned Bits> bool selectSExtBits(SDValue N, SDValue &Val) {
104 return selectSExtBits(N, Bits, Val);
105 }
106 bool selectZExtBits(SDValue N, unsigned Bits, SDValue &Val);
107 template <unsigned Bits> bool selectZExtBits(SDValue N, SDValue &Val) {
108 return selectZExtBits(N, Bits, Val);
109 }
110
111 bool selectSHXADDOp(SDValue N, unsigned ShAmt, SDValue &Val);
112 template <unsigned ShAmt> bool selectSHXADDOp(SDValue N, SDValue &Val) {
113 return selectSHXADDOp(N, ShAmt, Val);
114 }
115
116 bool selectSHXADD_UWOp(SDValue N, unsigned ShAmt, SDValue &Val);
117 template <unsigned ShAmt> bool selectSHXADD_UWOp(SDValue N, SDValue &Val) {
118 return selectSHXADD_UWOp(N, ShAmt, Val);
119 }
120
121 bool hasAllNBitUsers(SDNode *Node, unsigned Bits,
122 const unsigned Depth = 0) const;
123 bool hasAllHUsers(SDNode *Node) const { return hasAllNBitUsers(Node, 16); }
124 bool hasAllWUsers(SDNode *Node) const { return hasAllNBitUsers(Node, 32); }
125
126 bool selectSimm5Shl2(SDValue N, SDValue &Simm5, SDValue &Shl2);
127
128 bool selectVLOp(SDValue N, SDValue &VL);
129
130 bool selectVSplat(SDValue N, SDValue &SplatVal);
131 bool selectVSplatSimm5(SDValue N, SDValue &SplatVal);
132 bool selectVSplatUimm(SDValue N, unsigned Bits, SDValue &SplatVal);
133 template <unsigned Bits> bool selectVSplatUimmBits(SDValue N, SDValue &Val) {
134 return selectVSplatUimm(N, Bits, Val);
135 }
136 bool selectVSplatSimm5Plus1(SDValue N, SDValue &SplatVal);
138 // Matches the splat of a value which can be extended or truncated, such that
139 // only the bottom 8 bits are preserved.
140 bool selectLow8BitsVSplat(SDValue N, SDValue &SplatVal);
141 bool selectFPImm(SDValue N, SDValue &Imm);
142
143 bool selectRVVSimm5(SDValue N, unsigned Width, SDValue &Imm);
144 template <unsigned Width> bool selectRVVSimm5(SDValue N, SDValue &Imm) {
145 return selectRVVSimm5(N, Width, Imm);
146 }
147
148 void addVectorLoadStoreOperands(SDNode *Node, unsigned SEWImm,
149 const SDLoc &DL, unsigned CurOp,
150 bool IsMasked, bool IsStridedOrIndexed,
152 bool IsLoad = false, MVT *IndexVT = nullptr);
153
154 void selectVLSEG(SDNode *Node, bool IsMasked, bool IsStrided);
155 void selectVLSEGFF(SDNode *Node, bool IsMasked);
156 void selectVLXSEG(SDNode *Node, bool IsMasked, bool IsOrdered);
157 void selectVSSEG(SDNode *Node, bool IsMasked, bool IsStrided);
158 void selectVSXSEG(SDNode *Node, bool IsMasked, bool IsOrdered);
159
161
162 // Return the RISC-V condition code that matches the given DAG integer
163 // condition code. The CondCode must be one of those supported by the RISC-V
164 // ISA (see translateSetCCForBranch).
166 switch (CC) {
167 default:
168 llvm_unreachable("Unsupported CondCode");
169 case ISD::SETEQ:
170 return RISCVCC::COND_EQ;
171 case ISD::SETNE:
172 return RISCVCC::COND_NE;
173 case ISD::SETLT:
174 return RISCVCC::COND_LT;
175 case ISD::SETGE:
176 return RISCVCC::COND_GE;
177 case ISD::SETULT:
178 return RISCVCC::COND_LTU;
179 case ISD::SETUGE:
180 return RISCVCC::COND_GEU;
181 }
182 }
183
184// Include the pieces autogenerated from the target description.
185#include "RISCVGenDAGISel.inc"
186
187private:
188 bool doPeepholeSExtW(SDNode *Node);
189 bool doPeepholeMaskedRVV(MachineSDNode *Node);
190 bool doPeepholeMergeVVMFold();
191 bool doPeepholeNoRegPassThru();
192 bool performVMergeToVMv(SDNode *N);
193 bool performCombineVMergeAndVOps(SDNode *N);
194};
195
196namespace RISCV {
205};
206
215};
216
224};
225
234};
235
236struct VLEPseudo {
243};
244
245struct VSEPseudo {
251};
252
260};
261
265 uint8_t MaskOpIdx;
266};
267
268#define GET_RISCVVSSEGTable_DECL
269#define GET_RISCVVLSEGTable_DECL
270#define GET_RISCVVLXSEGTable_DECL
271#define GET_RISCVVSXSEGTable_DECL
272#define GET_RISCVVLETable_DECL
273#define GET_RISCVVSETable_DECL
274#define GET_RISCVVLXTable_DECL
275#define GET_RISCVVSXTable_DECL
276#define GET_RISCVMaskedPseudosTable_DECL
277#include "RISCVGenSearchableTables.inc"
278} // namespace RISCV
279
280} // namespace llvm
281
282#endif
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU Register Bank Select
uint64_t Addr
mir Rename Register Operands
This class represents an Operation in the Expression.
Machine Value Type.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool selectSETCC(SDValue N, ISD::CondCode ExpectedCCVal, SDValue &Val)
RISC-V doesn't have general instructions for integer setne/seteq, but we can check for equality with ...
bool selectSExtBits(SDValue N, unsigned Bits, SDValue &Val)
bool selectSHXADD_UWOp(SDValue N, SDValue &Val)
bool selectZExtBits(SDValue N, unsigned Bits, SDValue &Val)
bool selectSHXADD_UWOp(SDValue N, unsigned ShAmt, SDValue &Val)
Look for various patterns that can be done with a SHL that can be folded into a SHXADD_UW.
bool hasAllNBitUsers(SDNode *Node, unsigned Bits, const unsigned Depth=0) const
bool SelectAddrRegImmINX(SDValue Addr, SDValue &Base, SDValue &Offset)
bool selectVSplatUimmBits(SDValue N, SDValue &Val)
void selectVSSEG(SDNode *Node, bool IsMasked, bool IsStrided)
bool selectShiftMaskXLen(SDValue N, SDValue &ShAmt)
bool SelectFrameAddrRegImm(SDValue Addr, SDValue &Base, SDValue &Offset)
bool selectSETEQ(SDValue N, SDValue &Val)
void selectVLSEGFF(SDNode *Node, bool IsMasked)
RISCVDAGToDAGISel(RISCVTargetMachine &TargetMachine, CodeGenOptLevel OptLevel)
bool selectFPImm(SDValue N, SDValue &Imm)
bool selectSimm5Shl2(SDValue N, SDValue &Simm5, SDValue &Shl2)
bool selectLow8BitsVSplat(SDValue N, SDValue &SplatVal)
bool hasAllHUsers(SDNode *Node) const
bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps) override
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool selectVSplatSimm5(SDValue N, SDValue &SplatVal)
bool selectRVVSimm5(SDValue N, unsigned Width, SDValue &Imm)
bool SelectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset)
bool hasAllWUsers(SDNode *Node) const
void PreprocessISelDAG() override
PreprocessISelDAG - This hook allows targets to hack on the graph before instruction selection starts...
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
bool selectSExtBits(SDValue N, SDValue &Val)
bool selectVSplat(SDValue N, SDValue &SplatVal)
void addVectorLoadStoreOperands(SDNode *Node, unsigned SEWImm, const SDLoc &DL, unsigned CurOp, bool IsMasked, bool IsStridedOrIndexed, SmallVectorImpl< SDValue > &Operands, bool IsLoad=false, MVT *IndexVT=nullptr)
void PostprocessISelDAG() override
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
void selectVLXSEG(SDNode *Node, bool IsMasked, bool IsOrdered)
bool tryShrinkShlLogicImm(SDNode *Node)
bool selectSETNE(SDValue N, SDValue &Val)
bool SelectAddrRegRegScale(SDValue Addr, SDValue &Base, SDValue &Index, SDValue &Scale)
void selectVSETVLI(SDNode *Node)
bool selectShiftMask32(SDValue N, SDValue &ShAmt)
bool selectVLOp(SDValue N, SDValue &VL)
bool trySignedBitfieldExtract(SDNode *Node)
void selectVSXSEG(SDNode *Node, bool IsMasked, bool IsOrdered)
bool selectVSplatSimm5Plus1(SDValue N, SDValue &SplatVal)
bool selectRVVSimm5(SDValue N, SDValue &Imm)
bool selectVSplatSimm5Plus1NonZero(SDValue N, SDValue &SplatVal)
bool SelectAddrRegZextRegScale(SDValue Addr, SDValue &Base, SDValue &Index, SDValue &Scale)
bool SelectAddrRegImm(SDValue Addr, SDValue &Base, SDValue &Offset, bool IsINX=false)
bool selectSHXADDOp(SDValue N, SDValue &Val)
void selectVLSEG(SDNode *Node, bool IsMasked, bool IsStrided)
bool selectZExtBits(SDValue N, SDValue &Val)
bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt)
bool selectSHXADDOp(SDValue N, unsigned ShAmt, SDValue &Val)
Look for various patterns that can be done with a SHL that can be folded into a SHXADD.
bool tryIndexedLoad(SDNode *Node)
bool SelectAddrRegRegScale(SDValue Addr, unsigned MaxShiftAmount, SDValue &Base, SDValue &Index, SDValue &Scale)
static RISCVCC::CondCode getRISCVCCForIntCC(ISD::CondCode CC)
bool selectVSplatUimm(SDValue N, unsigned Bits, SDValue &SplatVal)
unsigned getXLen() const
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
MachineFunction * MF
CodeGenOptLevel OptLevel
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:577
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:78
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:680
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1503
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:440
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
#define N