LLVM 17.0.0git
SelectionDAGISel.h
Go to the documentation of this file.
1//===-- llvm/CodeGen/SelectionDAGISel.h - Common Base Class------*- C++ -*-===//
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 implements the SelectionDAGISel class, which is used as the common
10// base class for SelectionDAG-based instruction selectors.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_SELECTIONDAGISEL_H
15#define LLVM_CODEGEN_SELECTIONDAGISEL_H
16
19#include "llvm/IR/BasicBlock.h"
20#include <memory>
21
22namespace llvm {
23class AAResults;
24class AssumptionCache;
25class TargetInstrInfo;
26class TargetMachine;
27class SelectionDAGBuilder;
28class SDValue;
29class MachineRegisterInfo;
30class MachineFunction;
31class OptimizationRemarkEmitter;
32class TargetLowering;
33class TargetLibraryInfo;
34class FunctionLoweringInfo;
35class SwiftErrorValueTracking;
36class GCFunctionInfo;
37class ScheduleDAGSDNodes;
38
39/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
40/// pattern-matching instruction selectors.
42public:
45 std::unique_ptr<FunctionLoweringInfo> FuncInfo;
50 std::unique_ptr<SelectionDAGBuilder> SDB;
51 AAResults *AA = nullptr;
52 AssumptionCache *AC = nullptr;
53 GCFunctionInfo *GFI = nullptr;
59
60 /// Current optimization remark emitter.
61 /// Used to report things like combines and FastISel failures.
62 std::unique_ptr<OptimizationRemarkEmitter> ORE;
63
64 explicit SelectionDAGISel(char &ID, TargetMachine &tm,
66 ~SelectionDAGISel() override;
67
68 const TargetLowering *getTargetLowering() const { return TLI; }
69
70 void getAnalysisUsage(AnalysisUsage &AU) const override;
71
73
74 virtual void emitFunctionEntryCode() {}
75
76 /// PreprocessISelDAG - This hook allows targets to hack on the graph before
77 /// instruction selection starts.
78 virtual void PreprocessISelDAG() {}
79
80 /// PostprocessISelDAG() - This hook allows the target to hack on the graph
81 /// right after selection.
82 virtual void PostprocessISelDAG() {}
83
84 /// Main hook for targets to transform nodes into machine nodes.
85 virtual void Select(SDNode *N) = 0;
86
87 /// SelectInlineAsmMemoryOperand - Select the specified address as a target
88 /// addressing mode, according to the specified constraint. If this does
89 /// not match or is not implemented, return true. The resultant operands
90 /// (which will appear in the machine instruction) should be added to the
91 /// OutOps vector.
92 virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
93 unsigned ConstraintID,
94 std::vector<SDValue> &OutOps) {
95 return true;
96 }
97
98 /// IsProfitableToFold - Returns true if it's profitable to fold the specific
99 /// operand node N of U during instruction selection that starts at Root.
100 virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const;
101
102 /// IsLegalToFold - Returns true if the specific operand node N of
103 /// U can be folded during instruction selection that starts at Root.
104 /// FIXME: This is a static member function because the MSP430/X86
105 /// targets, which uses it during isel. This could become a proper member.
106 static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
108 bool IgnoreChains = false);
109
110 static void InvalidateNodeId(SDNode *N);
111 static int getUninvalidatedNodeId(SDNode *N);
112
113 static void EnforceNodeIdInvariant(SDNode *N);
114
115 // Opcodes used by the DAG state machine:
151
165 // Space-optimized forms that implicitly encode number of result VTs.
168 // Space-optimized forms that implicitly encode number of result VTs.
171 // Contains offset in table for pattern being selected
173 };
174
175 enum {
176 OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
177 OPFL_Chain = 1, // Node has a chain input.
178 OPFL_GlueInput = 2, // Node has a glue input.
179 OPFL_GlueOutput = 4, // Node has a glue output.
180 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
181 OPFL_Variadic0 = 1<<4, // Node is variadic, root has 0 fixed inputs.
182 OPFL_Variadic1 = 2<<4, // Node is variadic, root has 1 fixed inputs.
183 OPFL_Variadic2 = 3<<4, // Node is variadic, root has 2 fixed inputs.
184 OPFL_Variadic3 = 4<<4, // Node is variadic, root has 3 fixed inputs.
185 OPFL_Variadic4 = 5<<4, // Node is variadic, root has 4 fixed inputs.
186 OPFL_Variadic5 = 6<<4, // Node is variadic, root has 5 fixed inputs.
187 OPFL_Variadic6 = 7<<4, // Node is variadic, root has 6 fixed inputs.
188
190 };
191
192 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
193 /// number of fixed arity values that should be skipped when copying from the
194 /// root.
195 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
196 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
197 }
198
199
200protected:
201 /// DAGSize - Size of DAG being instruction selected.
202 ///
203 unsigned DAGSize = 0;
204
205 /// ReplaceUses - replace all uses of the old node F with the use
206 /// of the new node T.
209 EnforceNodeIdInvariant(T.getNode());
210 }
211
212 /// ReplaceUses - replace all uses of the old nodes F with the use
213 /// of the new nodes T.
214 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
216 for (unsigned i = 0; i < Num; ++i)
217 EnforceNodeIdInvariant(T[i].getNode());
218 }
219
220 /// ReplaceUses - replace all uses of the old node F with the use
221 /// of the new node T.
225 }
226
227 /// Replace all uses of \c F with \c T, then remove \c F from the DAG.
232 }
233
234 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
235 /// by tblgen. Others should not call it.
236 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
237 const SDLoc &DL);
238
239 /// getPatternForIndex - Patterns selected by tablegen during ISEL
240 virtual StringRef getPatternForIndex(unsigned index) {
241 llvm_unreachable("Tblgen should generate the implementation of this!");
242 }
243
244 /// getIncludePathForIndex - get the td source location of pattern instantiation
245 virtual StringRef getIncludePathForIndex(unsigned index) {
246 llvm_unreachable("Tblgen should generate the implementation of this!");
247 }
248
250 return CurDAG->shouldOptForSize();
251 }
252
253public:
254 // Calls to these predicates are generated by tblgen.
256 int64_t DesiredMaskS) const;
258 int64_t DesiredMaskS) const;
259
260
261 /// CheckPatternPredicate - This function is generated by tblgen in the
262 /// target. It runs the specified pattern predicate and returns true if it
263 /// succeeds or false if it fails. The number is a private implementation
264 /// detail to the code tblgen produces.
265 virtual bool CheckPatternPredicate(unsigned PredNo) const {
266 llvm_unreachable("Tblgen should generate the implementation of this!");
267 }
268
269 /// CheckNodePredicate - This function is generated by tblgen in the target.
270 /// It runs node predicate number PredNo and returns true if it succeeds or
271 /// false if it fails. The number is a private implementation
272 /// detail to the code tblgen produces.
273 virtual bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {
274 llvm_unreachable("Tblgen should generate the implementation of this!");
275 }
276
277 /// CheckNodePredicateWithOperands - This function is generated by tblgen in
278 /// the target.
279 /// It runs node predicate number PredNo and returns true if it succeeds or
280 /// false if it fails. The number is a private implementation detail to the
281 /// code tblgen produces.
283 SDNode *N, unsigned PredNo,
284 const SmallVectorImpl<SDValue> &Operands) const {
285 llvm_unreachable("Tblgen should generate the implementation of this!");
286 }
287
288 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
289 unsigned PatternNo,
290 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
291 llvm_unreachable("Tblgen should generate the implementation of this!");
292 }
293
294 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
295 llvm_unreachable("Tblgen should generate this!");
296 }
297
298 void SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
299 unsigned TableSize);
300
301 /// Return true if complex patterns for this target can mutate the
302 /// DAG.
303 virtual bool ComplexPatternFuncMutatesDAG() const {
304 return false;
305 }
306
307 /// Return whether the node may raise an FP exception.
308 bool mayRaiseFPException(SDNode *Node) const;
309
310 bool isOrEquivalentToAdd(const SDNode *N) const;
311
312private:
313
314 // Calls to these functions are generated by tblgen.
315 void Select_INLINEASM(SDNode *N);
316 void Select_READ_REGISTER(SDNode *Op);
317 void Select_WRITE_REGISTER(SDNode *Op);
318 void Select_UNDEF(SDNode *N);
319 void CannotYetSelect(SDNode *N);
320
321 void Select_FREEZE(SDNode *N);
322 void Select_ARITH_FENCE(SDNode *N);
323 void Select_MEMBARRIER(SDNode *N);
324
325 void pushStackMapLiveVariable(SmallVectorImpl<SDValue> &Ops, SDValue Operand,
326 SDLoc DL);
327 void Select_STACKMAP(SDNode *N);
328 void Select_PATCHPOINT(SDNode *N);
329
330private:
331 void DoInstructionSelection();
332 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList,
333 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo);
334
335 /// Prepares the landing pad to take incoming values or do other EH
336 /// personality specific tasks. Returns true if the block should be
337 /// instruction selected, false if no code should be emitted for it.
338 bool PrepareEHLandingPad();
339
340 // Mark and Report IPToState for each Block under AsynchEH
341 void reportIPToStateForBlocks(MachineFunction *Fn);
342
343 /// Perform instruction selection on all basic blocks in the function.
344 void SelectAllBasicBlocks(const Function &Fn);
345
346 /// Perform instruction selection on a single basic block, for
347 /// instructions between \p Begin and \p End. \p HadTailCall will be set
348 /// to true if a call in the block was translated as a tail call.
349 void SelectBasicBlock(BasicBlock::const_iterator Begin,
351 bool &HadTailCall);
352 void FinishBasicBlock();
353
354 void CodeGenAndEmitDAG();
355
356 /// Generate instructions for lowering the incoming arguments of the
357 /// given function.
358 void LowerArguments(const Function &F);
359
360 void ComputeLiveOutVRegInfo();
361
362 /// Create the scheduler. If a specific scheduler was specified
363 /// via the SchedulerRegistry, use it, otherwise select the
364 /// one preferred by the target.
365 ///
366 ScheduleDAGSDNodes *CreateScheduler();
367
368 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
369 /// state machines that start with a OPC_SwitchOpcode node.
370 std::vector<unsigned> OpcodeOffset;
371
372 void UpdateChains(SDNode *NodeToMatch, SDValue InputChain,
373 SmallVectorImpl<SDNode *> &ChainNodesMatched,
374 bool isMorphNodeTo);
375};
376
377}
378
379#endif /* LLVM_CODEGEN_SELECTIONDAGISEL_H */
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
bool End
Definition: ELF_riscv.cpp:464
#define F(x, y, z)
Definition: MD5.cpp:55
mir Rename Register Operands
@ Flags
Definition: TextStubV5.cpp:93
Value * RHS
Value * LHS
Represent the analysis usage information of a pass.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A cache of @llvm.assume calls within a function.
InstListType::const_iterator const_iterator
Definition: BasicBlock.h:88
Garbage collection metadata for a single function.
Definition: GCMetadata.h:77
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
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.
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckOrMask - The isel is trying to match something like (or X, 255).
AssumptionCache * AC
CodeGenOpt::Level OptLevel
const TargetLowering * TLI
virtual void PostprocessISelDAG()
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
MachineFunction * MF
virtual bool CheckNodePredicate(SDNode *N, unsigned PredNo) const
CheckNodePredicate - This function is generated by tblgen in the target.
std::unique_ptr< OptimizationRemarkEmitter > ORE
Current optimization remark emitter.
MachineRegisterInfo * RegInfo
unsigned DAGSize
DAGSize - Size of DAG being instruction selected.
bool isOrEquivalentToAdd(const SDNode *N) const
virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N, unsigned PatternNo, SmallVectorImpl< std::pair< SDValue, SDNode * > > &Result)
virtual bool CheckPatternPredicate(unsigned PredNo) const
CheckPatternPredicate - This function is generated by tblgen in the target.
static int getNumFixedFromVariadicInfo(unsigned Flags)
getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the number of fixed arity values ...
const TargetLibraryInfo * LibInfo
static int getUninvalidatedNodeId(SDNode *N)
const TargetInstrInfo * TII
virtual bool CheckNodePredicateWithOperands(SDNode *N, unsigned PredNo, const SmallVectorImpl< SDValue > &Operands) const
CheckNodePredicateWithOperands - This function is generated by tblgen in the target.
GCFunctionInfo * GFI
void SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, unsigned TableSize)
virtual void Select(SDNode *N)=0
Main hook for targets to transform nodes into machine nodes.
void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num)
ReplaceUses - replace all uses of the old nodes F with the use of the new nodes T.
static void EnforceNodeIdInvariant(SDNode *N)
virtual void emitFunctionEntryCode()
void ReplaceUses(SDValue F, SDValue T)
ReplaceUses - replace all uses of the old node F with the use of the new node T.
virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const
IsProfitableToFold - Returns true if it's profitable to fold the specific operand node N of U during ...
virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo)
void SelectInlineAsmMemoryOperands(std::vector< SDValue > &Ops, const SDLoc &DL)
SelectInlineAsmMemoryOperands - Calls to this are automatically generated by tblgen.
virtual bool ComplexPatternFuncMutatesDAG() const
Return true if complex patterns for this target can mutate the DAG.
void ReplaceUses(SDNode *F, SDNode *T)
ReplaceUses - replace all uses of the old node F with the use of the new node T.
virtual void PreprocessISelDAG()
PreprocessISelDAG - This hook allows targets to hack on the graph before instruction selection starts...
bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckAndMask - The isel is trying to match something like (and X, 255).
SwiftErrorValueTracking * SwiftError
virtual StringRef getPatternForIndex(unsigned index)
getPatternForIndex - Patterns selected by tablegen during ISEL
bool mayRaiseFPException(SDNode *Node) const
Return whether the node may raise an FP exception.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
std::unique_ptr< SelectionDAGBuilder > SDB
void ReplaceNode(SDNode *F, SDNode *T)
Replace all uses of F with T, then remove F from the DAG.
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID, std::vector< SDValue > &OutOps)
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
static void InvalidateNodeId(SDNode *N)
const TargetLowering * getTargetLowering() const
bool shouldOptForSize(const MachineFunction *MF) const
virtual StringRef getIncludePathForIndex(unsigned index)
getIncludePathForIndex - get the td source location of pattern instantiation
static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root, CodeGenOpt::Level OptLevel, bool IgnoreChains=false)
IsLegalToFold - Returns true if the specific operand node N of U can be folded during instruction sel...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:225
void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
bool shouldOptForSize() const
void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:450
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:577
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
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.
Level
Code generation optimization level.
Definition: CodeGen.h:57
@ Default
-O2, -Os
Definition: CodeGen.h:60
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
#define N
This represents a list of ValueType's that has been intern'd by a SelectionDAG.