LLVM 22.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
21#include "llvm/IR/BasicBlock.h"
22#include <memory>
23
24namespace llvm {
25class AAResults;
26class AssumptionCache;
27class TargetInstrInfo;
28class TargetMachine;
29class SSPLayoutInfo;
30class SelectionDAGBuilder;
31class SDValue;
32class MachineRegisterInfo;
33class MachineFunction;
34class OptimizationRemarkEmitter;
35class TargetLowering;
36class TargetLibraryInfo;
37class TargetTransformInfo;
38class FunctionLoweringInfo;
39class SwiftErrorValueTracking;
40class GCFunctionInfo;
41class ScheduleDAGSDNodes;
42
43/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
44/// pattern-matching instruction selectors.
46public:
49 std::unique_ptr<FunctionLoweringInfo> FuncInfo;
50 std::unique_ptr<SwiftErrorValueTracking> SwiftError;
55 std::unique_ptr<SelectionDAGBuilder> SDB;
56 mutable std::optional<BatchAAResults> BatchAA;
57 AssumptionCache *AC = nullptr;
58 GCFunctionInfo *GFI = nullptr;
59 SSPLayoutInfo *SP = nullptr;
60#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
61 TargetTransformInfo *TTI = nullptr;
62#endif
68
69 /// Current optimization remark emitter.
70 /// Used to report things like combines and FastISel failures.
71 std::unique_ptr<OptimizationRemarkEmitter> ORE;
72
73 /// True if the function currently processing is in the function printing list
74 /// (i.e. `-filter-print-funcs`).
75 /// This is primarily used by ISEL_DUMP, which spans in multiple member
76 /// functions. Storing the filter result here so that we only need to do the
77 /// filtering once.
78 bool MatchFilterFuncName = false;
80
83 virtual ~SelectionDAGISel();
84
85 /// Returns a (possibly null) pointer to the current BatchAAResults.
87 if (BatchAA.has_value())
88 return &BatchAA.value();
89 return nullptr;
90 }
91
92 const TargetLowering *getTargetLowering() const { return TLI; }
93
96
97 virtual bool runOnMachineFunction(MachineFunction &mf);
98
99 virtual void emitFunctionEntryCode() {}
100
101 /// PreprocessISelDAG - This hook allows targets to hack on the graph before
102 /// instruction selection starts.
103 virtual void PreprocessISelDAG() {}
104
105 /// PostprocessISelDAG() - This hook allows the target to hack on the graph
106 /// right after selection.
107 virtual void PostprocessISelDAG() {}
108
109 /// Main hook for targets to transform nodes into machine nodes.
110 virtual void Select(SDNode *N) = 0;
111
112 /// SelectInlineAsmMemoryOperand - Select the specified address as a target
113 /// addressing mode, according to the specified constraint. If this does
114 /// not match or is not implemented, return true. The resultant operands
115 /// (which will appear in the machine instruction) should be added to the
116 /// OutOps vector.
117 virtual bool
119 InlineAsm::ConstraintCode ConstraintID,
120 std::vector<SDValue> &OutOps) {
121 return true;
122 }
123
124 /// IsProfitableToFold - Returns true if it's profitable to fold the specific
125 /// operand node N of U during instruction selection that starts at Root.
126 virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const;
127
128 /// IsLegalToFold - Returns true if the specific operand node N of
129 /// U can be folded during instruction selection that starts at Root.
130 /// FIXME: This is a static member function because the MSP430/X86
131 /// targets, which uses it during isel. This could become a proper member.
132 static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
134 bool IgnoreChains = false);
135
136 static void InvalidateNodeId(SDNode *N);
137 static int getUninvalidatedNodeId(SDNode *N);
138
139 static void EnforceNodeIdInvariant(SDNode *N);
140
141 // Opcodes used by the DAG state machine:
202 // Space-optimized forms that implicitly encode VT.
215
224
233
257
259 // Space-optimized forms that implicitly encode integer VT.
265 // Space-optimized forms that implicitly encode integer VT.
296 // Space-optimized forms that implicitly encode number of result VTs.
300 // Space-optimized forms that implicitly encode EmitNodeInfo.
308 // Space-optimized forms that implicitly encode number of result VTs.
312 // Space-optimized forms that implicitly encode EmitNodeInfo.
326 // Contains 32-bit offset in table for pattern being selected
328 };
329
330 enum {
331 OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
332 OPFL_Chain = 1, // Node has a chain input.
333 OPFL_GlueInput = 2, // Node has a glue input.
334 OPFL_GlueOutput = 4, // Node has a glue output.
335 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
336 OPFL_Variadic0 = 1 << 4, // Node is variadic, root has 0 fixed inputs.
337 OPFL_Variadic1 = 2 << 4, // Node is variadic, root has 1 fixed inputs.
338 OPFL_Variadic2 = 3 << 4, // Node is variadic, root has 2 fixed inputs.
339 OPFL_Variadic3 = 4 << 4, // Node is variadic, root has 3 fixed inputs.
340 OPFL_Variadic4 = 5 << 4, // Node is variadic, root has 4 fixed inputs.
341 OPFL_Variadic5 = 6 << 4, // Node is variadic, root has 5 fixed inputs.
342 OPFL_Variadic6 = 7 << 4, // Node is variadic, root has 6 fixed inputs.
343 OPFL_Variadic7 = 8 << 4, // Node is variadic, root has 7 fixed inputs.
344
345 OPFL_VariadicInfo = 15 << 4 // Mask for extracting the OPFL_VariadicN bits.
346 };
347
348 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
349 /// number of fixed arity values that should be skipped when copying from the
350 /// root.
351 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
352 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
353 }
354
355
356protected:
357 /// DAGSize - Size of DAG being instruction selected.
358 ///
359 unsigned DAGSize = 0;
360
361 /// ReplaceUses - replace all uses of the old node F with the use
362 /// of the new node T.
365 EnforceNodeIdInvariant(T.getNode());
366 }
367
368 /// ReplaceUses - replace all uses of the old nodes F with the use
369 /// of the new nodes T.
370 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
372 for (unsigned i = 0; i < Num; ++i)
374 }
375
376 /// ReplaceUses - replace all uses of the old node F with the use
377 /// of the new node T.
381 }
382
383 /// Replace all uses of \c F with \c T, then remove \c F from the DAG.
388 }
389
390 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
391 /// by tblgen. Others should not call it.
392 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
393 const SDLoc &DL);
394
395 /// getPatternForIndex - Patterns selected by tablegen during ISEL
396 virtual StringRef getPatternForIndex(unsigned index) {
397 llvm_unreachable("Tblgen should generate the implementation of this!");
398 }
399
400 /// getIncludePathForIndex - get the td source location of pattern instantiation
401 virtual StringRef getIncludePathForIndex(unsigned index) {
402 llvm_unreachable("Tblgen should generate the implementation of this!");
403 }
404
406 return CurDAG->shouldOptForSize();
407 }
408
409public:
410 // Calls to these predicates are generated by tblgen.
412 int64_t DesiredMaskS) const;
414 int64_t DesiredMaskS) const;
415
416
417 /// CheckPatternPredicate - This function is generated by tblgen in the
418 /// target. It runs the specified pattern predicate and returns true if it
419 /// succeeds or false if it fails. The number is a private implementation
420 /// detail to the code tblgen produces.
421 virtual bool CheckPatternPredicate(unsigned PredNo) const {
422 llvm_unreachable("Tblgen should generate the implementation of this!");
423 }
424
425 /// CheckNodePredicate - This function is generated by tblgen in the target.
426 /// It runs node predicate number PredNo and returns true if it succeeds or
427 /// false if it fails. The number is a private implementation
428 /// detail to the code tblgen produces.
429 virtual bool CheckNodePredicate(SDValue Op, unsigned PredNo) const {
430 llvm_unreachable("Tblgen should generate the implementation of this!");
431 }
432
433 /// CheckNodePredicateWithOperands - This function is generated by tblgen in
434 /// the target.
435 /// It runs node predicate number PredNo and returns true if it succeeds or
436 /// false if it fails. The number is a private implementation detail to the
437 /// code tblgen produces.
438 virtual bool
441 llvm_unreachable("Tblgen should generate the implementation of this!");
442 }
443
444 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
445 unsigned PatternNo,
446 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
447 llvm_unreachable("Tblgen should generate the implementation of this!");
448 }
449
450 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
451 llvm_unreachable("Tblgen should generate this!");
452 }
453
454 void SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
455 unsigned TableSize);
456
457 /// Return true if complex patterns for this target can mutate the
458 /// DAG.
459 virtual bool ComplexPatternFuncMutatesDAG() const {
460 return false;
461 }
462
463 /// Return whether the node may raise an FP exception.
464 bool mayRaiseFPException(SDNode *Node) const;
465
466 bool isOrEquivalentToAdd(const SDNode *N) const;
467
468private:
469
470 // Calls to these functions are generated by tblgen.
471 void Select_INLINEASM(SDNode *N);
472 void Select_READ_REGISTER(SDNode *Op);
473 void Select_WRITE_REGISTER(SDNode *Op);
474 void Select_UNDEF(SDNode *N);
475 void Select_FAKE_USE(SDNode *N);
476 void CannotYetSelect(SDNode *N);
477
478 void Select_FREEZE(SDNode *N);
479 void Select_ARITH_FENCE(SDNode *N);
480 void Select_MEMBARRIER(SDNode *N);
481
482 void Select_CONVERGENCECTRL_ANCHOR(SDNode *N);
483 void Select_CONVERGENCECTRL_ENTRY(SDNode *N);
484 void Select_CONVERGENCECTRL_LOOP(SDNode *N);
485
486 void pushStackMapLiveVariable(SmallVectorImpl<SDValue> &Ops, SDValue Operand,
487 SDLoc DL);
488 void Select_STACKMAP(SDNode *N);
489 void Select_PATCHPOINT(SDNode *N);
490
491 void Select_JUMP_TABLE_DEBUG_INFO(SDNode *N);
492
493private:
494 void DoInstructionSelection();
495 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList,
496 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo);
497
498 /// Prepares the landing pad to take incoming values or do other EH
499 /// personality specific tasks. Returns true if the block should be
500 /// instruction selected, false if no code should be emitted for it.
501 bool PrepareEHLandingPad();
502
503 // Mark and Report IPToState for each Block under AsynchEH
504 void reportIPToStateForBlocks(MachineFunction *Fn);
505
506 /// Perform instruction selection on all basic blocks in the function.
507 void SelectAllBasicBlocks(const Function &Fn);
508
509 /// Perform instruction selection on a single basic block, for
510 /// instructions between \p Begin and \p End. \p HadTailCall will be set
511 /// to true if a call in the block was translated as a tail call.
512 void SelectBasicBlock(BasicBlock::const_iterator Begin,
514 bool &HadTailCall);
515 void FinishBasicBlock();
516
517 void CodeGenAndEmitDAG();
518
519 /// Generate instructions for lowering the incoming arguments of the
520 /// given function.
521 void LowerArguments(const Function &F);
522
523 void ComputeLiveOutVRegInfo();
524
525 /// Create the scheduler. If a specific scheduler was specified
526 /// via the SchedulerRegistry, use it, otherwise select the
527 /// one preferred by the target.
528 ///
529 ScheduleDAGSDNodes *CreateScheduler();
530
531 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
532 /// state machines that start with a OPC_SwitchOpcode node.
533 std::vector<unsigned> OpcodeOffset;
534
535 void UpdateChains(SDNode *NodeToMatch, SDValue InputChain,
536 SmallVectorImpl<SDNode *> &ChainNodesMatched,
537 bool isMorphNodeTo);
538};
539
541 std::unique_ptr<SelectionDAGISel> Selector;
542
543public:
544 SelectionDAGISelLegacy(char &ID, std::unique_ptr<SelectionDAGISel> S);
545
546 ~SelectionDAGISelLegacy() override = default;
547
548 void getAnalysisUsage(AnalysisUsage &AU) const override;
549
550 bool runOnMachineFunction(MachineFunction &MF) override;
551};
552
553class SelectionDAGISelPass : public PassInfoMixin<SelectionDAGISelPass> {
554 std::unique_ptr<SelectionDAGISel> Selector;
555
556protected:
557 SelectionDAGISelPass(std::unique_ptr<SelectionDAGISel> Selector)
558 : Selector(std::move(Selector)) {}
559
560public:
563 static bool isRequired() { return true; }
564};
565}
566
567#endif /* LLVM_CODEGEN_SELECTIONDAGISEL_H */
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
bool End
Definition: ELF_riscv.cpp:480
#define F(x, y, z)
Definition: MD5.cpp:55
mir Rename Register Operands
Value * RHS
Value * LHS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
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:171
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents an Operation in the Expression.
Garbage collection metadata for a single function.
Definition: GCMetadata.h:80
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
This class contains meta information specific to a module.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
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.
~SelectionDAGISelLegacy() override=default
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
SelectionDAGISelPass(std::unique_ptr< SelectionDAGISel > Selector)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
std::optional< BatchAAResults > BatchAA
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps)
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckOrMask - The isel is trying to match something like (or X, 255).
AssumptionCache * AC
void initializeAnalysisResults(MachineFunctionAnalysisManager &MFAM)
virtual bool CheckNodePredicate(SDValue Op, unsigned PredNo) const
CheckNodePredicate - This function is generated by tblgen in the target.
MachineModuleInfo * MMI
virtual bool CheckNodePredicateWithOperands(SDValue Op, unsigned PredNo, ArrayRef< SDValue > Operands) const
CheckNodePredicateWithOperands - This function is generated by tblgen in the target.
const TargetLowering * TLI
virtual void PostprocessISelDAG()
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
MachineFunction * MF
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
CodeGenOptLevel OptLevel
std::unique_ptr< SwiftErrorValueTracking > SwiftError
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)
bool MatchFilterFuncName
True if the function currently processing is in the function printing list (i.e.
void SelectInlineAsmMemoryOperands(std::vector< SDValue > &Ops, const SDLoc &DL)
SelectInlineAsmMemoryOperands - Calls to this are automatically generated by tblgen.
static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root, CodeGenOptLevel OptLevel, bool IgnoreChains=false)
IsLegalToFold - Returns true if the specific operand node N of U can be folded during instruction sel...
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...
BatchAAResults * getBatchAA() const
Returns a (possibly null) pointer to the current BatchAAResults.
bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckAndMask - The isel is trying to match something like (and X, 255).
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.
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 runOnMachineFunction(MachineFunction &mf)
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
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:229
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI 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:541
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
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:83
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1886
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
#define N
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:70
This represents a list of ValueType's that has been intern'd by a SelectionDAG.