LLVM 23.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;
31class SDValue;
33class MachineFunction;
35class TargetLowering;
40class GCFunctionInfo;
42
43/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
44/// pattern-matching instruction selectors.
46public:
50
51 std::unique_ptr<FunctionLoweringInfo> FuncInfo;
52 std::unique_ptr<SwiftErrorValueTracking> SwiftError;
57 std::unique_ptr<SelectionDAGBuilder> SDB;
58 mutable std::optional<BatchAAResults> BatchAA;
59 AssumptionCache *AC = nullptr;
60 GCFunctionInfo *GFI = nullptr;
61 SSPLayoutInfo *SP = nullptr;
62 const TargetTransformInfo *TTI = nullptr;
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
81 // HwMode to be used by getValueTypeForHwMode. This will be initialized
82 // based on the subtarget used by the MachineFunction.
83 unsigned HwMode;
84
87 virtual ~SelectionDAGISel();
88
89 /// Returns a (possibly null) pointer to the current BatchAAResults.
91 if (BatchAA.has_value())
92 return &BatchAA.value();
93 return nullptr;
94 }
95
96 const TargetLowering *getTargetLowering() const { return TLI; }
97
100
101 virtual bool runOnMachineFunction(MachineFunction &mf);
102
103 virtual void emitFunctionEntryCode() {}
104
105 /// PreprocessISelDAG - This hook allows targets to hack on the graph before
106 /// instruction selection starts.
107 virtual void PreprocessISelDAG() {}
108
109 /// PostprocessISelDAG() - This hook allows the target to hack on the graph
110 /// right after selection.
111 virtual void PostprocessISelDAG() {}
112
113 /// Main hook for targets to transform nodes into machine nodes.
114 virtual void Select(SDNode *N) = 0;
115
116 /// SelectInlineAsmMemoryOperand - Select the specified address as a target
117 /// addressing mode, according to the specified constraint. If this does
118 /// not match or is not implemented, return true. The resultant operands
119 /// (which will appear in the machine instruction) should be added to the
120 /// OutOps vector.
121 virtual bool
123 InlineAsm::ConstraintCode ConstraintID,
124 std::vector<SDValue> &OutOps) {
125 return true;
126 }
127
128 /// IsProfitableToFold - Returns true if it's profitable to fold the specific
129 /// operand node N of U during instruction selection that starts at Root.
130 virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const;
131
132 /// IsLegalToFold - Returns true if the specific operand node N of
133 /// U can be folded during instruction selection that starts at Root.
134 /// FIXME: This is a static member function because the MSP430/X86
135 /// targets, which uses it during isel. This could become a proper member.
136 static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
138 bool IgnoreChains = false);
139
140 static void InvalidateNodeId(SDNode *N);
141 static int getUninvalidatedNodeId(SDNode *N);
142
143 static void EnforceNodeIdInvariant(SDNode *N);
144
145 // Opcodes used by the DAG state machine:
207 // Space-optimized forms that implicitly encode VT.
222
231
240
249
273
275 // Space-optimized forms that implicitly encode integer VT.
313 // Space-optimized forms that implicitly encode number of result VTs.
317 // Space-optimized forms that implicitly encode EmitNodeInfo.
325 // Space-optimized forms that implicitly encode number of result VTs.
329 // Space-optimized forms that implicitly encode EmitNodeInfo.
340 // Contains 32-bit offset in table for pattern being selected
342 };
343
344 enum {
345 OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
346 OPFL_Chain = 1, // Node has a chain input.
347 OPFL_GlueInput = 2, // Node has a glue input.
348 OPFL_GlueOutput = 4, // Node has a glue output.
349 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
350 OPFL_Variadic0 = 1 << 4, // Node is variadic, root has 0 fixed inputs.
351 OPFL_Variadic1 = 2 << 4, // Node is variadic, root has 1 fixed inputs.
352 OPFL_Variadic2 = 3 << 4, // Node is variadic, root has 2 fixed inputs.
353 OPFL_Variadic3 = 4 << 4, // Node is variadic, root has 3 fixed inputs.
354 OPFL_Variadic4 = 5 << 4, // Node is variadic, root has 4 fixed inputs.
355 OPFL_Variadic5 = 6 << 4, // Node is variadic, root has 5 fixed inputs.
356 OPFL_Variadic6 = 7 << 4, // Node is variadic, root has 6 fixed inputs.
357 OPFL_Variadic7 = 8 << 4, // Node is variadic, root has 7 fixed inputs.
358
359 OPFL_VariadicInfo = 15 << 4 // Mask for extracting the OPFL_VariadicN bits.
360 };
361
362 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
363 /// number of fixed arity values that should be skipped when copying from the
364 /// root.
365 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
366 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
367 }
368
369
370protected:
371 /// DAGSize - Size of DAG being instruction selected.
372 ///
373 unsigned DAGSize = 0;
374
375 /// ReplaceUses - replace all uses of the old node F with the use
376 /// of the new node T.
378 CurDAG->ReplaceAllUsesOfValueWith(F, T);
379 EnforceNodeIdInvariant(T.getNode());
380 }
381
382 /// ReplaceUses - replace all uses of the old nodes F with the use
383 /// of the new nodes T.
384 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
385 CurDAG->ReplaceAllUsesOfValuesWith(F, T, Num);
386 for (unsigned i = 0; i < Num; ++i)
388 }
389
390 /// ReplaceUses - replace all uses of the old node F with the use
391 /// of the new node T.
393 CurDAG->ReplaceAllUsesWith(F, T);
395 }
396
397 /// Replace all uses of \c F with \c T, then remove \c F from the DAG.
399 CurDAG->ReplaceAllUsesWith(F, T);
401 CurDAG->RemoveDeadNode(F);
402 }
403
404 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
405 /// by tblgen. Others should not call it.
406 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
407 const SDLoc &DL);
408
409 /// getPatternForIndex - Patterns selected by tablegen during ISEL
410 virtual StringRef getPatternForIndex(unsigned index) {
411 llvm_unreachable("Tblgen should generate the implementation of this!");
412 }
413
414 /// getIncludePathForIndex - get the td source location of pattern instantiation
415 virtual StringRef getIncludePathForIndex(unsigned index) {
416 llvm_unreachable("Tblgen should generate the implementation of this!");
417 }
418
420 return CurDAG->shouldOptForSize();
421 }
422
423public:
424 // Calls to these predicates are generated by tblgen.
426 int64_t DesiredMaskS) const;
428 int64_t DesiredMaskS) const;
429
430
431 /// CheckPatternPredicate - This function is generated by tblgen in the
432 /// target. It runs the specified pattern predicate and returns true if it
433 /// succeeds or false if it fails. The number is a private implementation
434 /// detail to the code tblgen produces.
435 virtual bool CheckPatternPredicate(unsigned PredNo) const {
436 llvm_unreachable("Tblgen should generate the implementation of this!");
437 }
438
439 /// CheckNodePredicate - This function is generated by tblgen in the target.
440 /// It runs node predicate number PredNo and returns true if it succeeds or
441 /// false if it fails. The number is a private implementation
442 /// detail to the code tblgen produces.
443 virtual bool CheckNodePredicate(SDValue Op, unsigned PredNo) const {
444 llvm_unreachable("Tblgen should generate the implementation of this!");
445 }
446
447 /// CheckNodePredicateWithOperands - This function is generated by tblgen in
448 /// the target.
449 /// It runs node predicate number PredNo and returns true if it succeeds or
450 /// false if it fails. The number is a private implementation detail to the
451 /// code tblgen produces.
452 virtual bool
454 ArrayRef<SDValue> Operands) const {
455 llvm_unreachable("Tblgen should generate the implementation of this!");
456 }
457
458 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
459 unsigned PatternNo,
460 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
461 llvm_unreachable("Tblgen should generate the implementation of this!");
462 }
463
464 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
465 llvm_unreachable("Tblgen should generate this!");
466 }
467
468 virtual MVT getValueTypeForHwMode(unsigned Index) const {
469 llvm_unreachable("Tblgen should generate the implementation of this!");
470 }
471
472 void SelectCodeCommon(SDNode *NodeToMatch, const uint8_t *MatcherTable,
473 unsigned TableSize);
474
475 /// Return true if complex patterns for this target can mutate the
476 /// DAG.
477 virtual bool ComplexPatternFuncMutatesDAG() const {
478 return false;
479 }
480
481 /// Return whether the node may raise an FP exception.
482 bool mayRaiseFPException(SDNode *Node) const;
483
484 bool isOrEquivalentToAdd(const SDNode *N) const;
485
486private:
487
488 // Calls to these functions are generated by tblgen.
489 void Select_INLINEASM(SDNode *N);
490 void Select_READ_REGISTER(SDNode *Op);
491 void Select_WRITE_REGISTER(SDNode *Op);
492 void Select_UNDEF(SDNode *N);
493 void Select_FAKE_USE(SDNode *N);
494 void Select_RELOC_NONE(SDNode *N);
495 void CannotYetSelect(SDNode *N);
496
497 void Select_FREEZE(SDNode *N);
498 void Select_ARITH_FENCE(SDNode *N);
499 void Select_MEMBARRIER(SDNode *N);
500
501 void Select_CONVERGENCECTRL_ANCHOR(SDNode *N);
502 void Select_CONVERGENCECTRL_ENTRY(SDNode *N);
503 void Select_CONVERGENCECTRL_LOOP(SDNode *N);
504
505 void pushStackMapLiveVariable(SmallVectorImpl<SDValue> &Ops, SDValue Operand,
506 SDLoc DL);
507 void Select_STACKMAP(SDNode *N);
508 void Select_PATCHPOINT(SDNode *N);
509
510 void Select_JUMP_TABLE_DEBUG_INFO(SDNode *N);
511
512private:
513 void DoInstructionSelection();
514 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList,
515 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo);
516
517 /// Prepares the landing pad to take incoming values or do other EH
518 /// personality specific tasks. Returns true if the block should be
519 /// instruction selected, false if no code should be emitted for it.
520 bool PrepareEHLandingPad();
521
522 // Mark and Report IPToState for each Block under AsynchEH
523 void reportIPToStateForBlocks(MachineFunction *Fn);
524
525 /// Perform instruction selection on all basic blocks in the function.
526 void SelectAllBasicBlocks(const Function &Fn);
527
528 /// Perform instruction selection on a single basic block, for
529 /// instructions between \p Begin and \p End. \p HadTailCall will be set
530 /// to true if a call in the block was translated as a tail call.
531 void SelectBasicBlock(BasicBlock::const_iterator Begin,
533 bool &HadTailCall);
534 void FinishBasicBlock();
535
536 void CodeGenAndEmitDAG();
537
538 /// Generate instructions for lowering the incoming arguments of the
539 /// given function.
540 void LowerArguments(const Function &F);
541
542 void ComputeLiveOutVRegInfo();
543
544 /// Create the scheduler. If a specific scheduler was specified
545 /// via the SchedulerRegistry, use it, otherwise select the
546 /// one preferred by the target.
547 ///
548 ScheduleDAGSDNodes *CreateScheduler();
549
550 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
551 /// state machines that start with a OPC_SwitchOpcode node.
552 std::vector<unsigned> OpcodeOffset;
553
554 void UpdateChains(SDNode *NodeToMatch, SDValue InputChain,
555 SmallVectorImpl<SDNode *> &ChainNodesMatched,
556 bool isMorphNodeTo);
557};
558
560 std::unique_ptr<SelectionDAGISel> Selector;
561
562public:
563 SelectionDAGISelLegacy(char &ID, std::unique_ptr<SelectionDAGISel> S);
564
565 ~SelectionDAGISelLegacy() override = default;
566
567 void getAnalysisUsage(AnalysisUsage &AU) const override;
568
569 bool runOnMachineFunction(MachineFunction &MF) override;
570};
571
572class SelectionDAGISelPass : public PassInfoMixin<SelectionDAGISelPass> {
573 std::unique_ptr<SelectionDAGISel> Selector;
574
575protected:
576 SelectionDAGISelPass(std::unique_ptr<SelectionDAGISel> Selector)
577 : Selector(std::move(Selector)) {}
578
579public:
582 static bool isRequired() { return true; }
583};
584}
585
586#endif /* LLVM_CODEGEN_SELECTIONDAGISEL_H */
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define T
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:40
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...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
Tracks which library functions to use for a particular subtarget.
Machine Value Type.
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,...
The optimization diagnostic interface.
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.
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
~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.
SelectionDAGISelLegacy(char &ID, std::unique_ptr< SelectionDAGISel > S)
SelectionDAGISelPass(std::unique_ptr< SelectionDAGISel > Selector)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
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).
void initializeAnalysisResults(MachineFunctionAnalysisManager &MFAM)
const TargetTransformInfo * TTI
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.
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
std::unique_ptr< SwiftErrorValueTracking > SwiftError
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)
void SelectCodeCommon(SDNode *NodeToMatch, const uint8_t *MatcherTable, unsigned TableSize)
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)
virtual MVT getValueTypeForHwMode(unsigned Index) const
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.
const LibcallLoweringInfo * LibcallLowering
SelectionDAGISel(TargetMachine &tm, CodeGenOptLevel OL=CodeGenOptLevel::Default)
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...
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:85
DWARFExpression::Operation Op
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:1915
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#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.