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.
211 // Space-optimized form that implicitly encodes index 0.
224
233
242
251
260
284
286 // Space-optimized forms that implicitly encode integer VT.
325 // Space-optimized forms that implicitly encode number of result VTs.
329 // Space-optimized forms that implicitly encode EmitNodeInfo.
337 // Space-optimized forms that implicitly encode number of result VTs.
341 // Space-optimized forms that implicitly encode EmitNodeInfo.
352 // Contains 32-bit offset in table for pattern being selected
354 };
355
356 enum {
357 OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
358 OPFL_Chain = 1, // Node has a chain input.
359 OPFL_GlueInput = 2, // Node has a glue input.
360 OPFL_GlueOutput = 4, // Node has a glue output.
361 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
362 OPFL_Variadic0 = 1 << 4, // Node is variadic, root has 0 fixed inputs.
363 OPFL_Variadic1 = 2 << 4, // Node is variadic, root has 1 fixed inputs.
364 OPFL_Variadic2 = 3 << 4, // Node is variadic, root has 2 fixed inputs.
365 OPFL_Variadic3 = 4 << 4, // Node is variadic, root has 3 fixed inputs.
366 OPFL_Variadic4 = 5 << 4, // Node is variadic, root has 4 fixed inputs.
367 OPFL_Variadic5 = 6 << 4, // Node is variadic, root has 5 fixed inputs.
368 OPFL_Variadic6 = 7 << 4, // Node is variadic, root has 6 fixed inputs.
369 OPFL_Variadic7 = 8 << 4, // Node is variadic, root has 7 fixed inputs.
370
371 OPFL_VariadicInfo = 15 << 4 // Mask for extracting the OPFL_VariadicN bits.
372 };
373
374 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
375 /// number of fixed arity values that should be skipped when copying from the
376 /// root.
377 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
378 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
379 }
380
381
382protected:
383 /// DAGSize - Size of DAG being instruction selected.
384 ///
385 unsigned DAGSize = 0;
386
387 /// ReplaceUses - replace all uses of the old node F with the use
388 /// of the new node T.
390 CurDAG->ReplaceAllUsesOfValueWith(F, T);
391 EnforceNodeIdInvariant(T.getNode());
392 }
393
394 /// ReplaceUses - replace all uses of the old nodes F with the use
395 /// of the new nodes T.
396 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
397 CurDAG->ReplaceAllUsesOfValuesWith(F, T, Num);
398 for (unsigned i = 0; i < Num; ++i)
400 }
401
402 /// ReplaceUses - replace all uses of the old node F with the use
403 /// of the new node T.
405 CurDAG->ReplaceAllUsesWith(F, T);
407 }
408
409 /// Replace all uses of \c F with \c T, then remove \c F from the DAG.
411 CurDAG->ReplaceAllUsesWith(F, T);
413 CurDAG->RemoveDeadNode(F);
414 }
415
416 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
417 /// by tblgen. Others should not call it.
418 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
419 const SDLoc &DL);
420
421 /// getPatternForIndex - Patterns selected by tablegen during ISEL
422 virtual StringRef getPatternForIndex(unsigned index) {
423 llvm_unreachable("Tblgen should generate the implementation of this!");
424 }
425
426 /// getIncludePathForIndex - get the td source location of pattern instantiation
427 virtual StringRef getIncludePathForIndex(unsigned index) {
428 llvm_unreachable("Tblgen should generate the implementation of this!");
429 }
430
432 return CurDAG->shouldOptForSize();
433 }
434
435public:
436 // Calls to these predicates are generated by tblgen.
438 int64_t DesiredMaskS) const;
440 int64_t DesiredMaskS) const;
441
442
443 /// CheckPatternPredicate - This function is generated by tblgen in the
444 /// target. It runs the specified pattern predicate and returns true if it
445 /// succeeds or false if it fails. The number is a private implementation
446 /// detail to the code tblgen produces.
447 virtual bool CheckPatternPredicate(unsigned PredNo) const {
448 llvm_unreachable("Tblgen should generate the implementation of this!");
449 }
450
451 /// CheckNodePredicate - This function is generated by tblgen in the target.
452 /// It runs node predicate number PredNo and returns true if it succeeds or
453 /// false if it fails. The number is a private implementation
454 /// detail to the code tblgen produces.
455 virtual bool CheckNodePredicate(SDValue Op, unsigned PredNo) const {
456 llvm_unreachable("Tblgen should generate the implementation of this!");
457 }
458
459 /// CheckNodePredicateWithOperands - This function is generated by tblgen in
460 /// the target.
461 /// It runs node predicate number PredNo and returns true if it succeeds or
462 /// false if it fails. The number is a private implementation detail to the
463 /// code tblgen produces.
464 virtual bool
466 ArrayRef<SDValue> Operands) const {
467 llvm_unreachable("Tblgen should generate the implementation of this!");
468 }
469
470 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
471 unsigned PatternNo,
472 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
473 llvm_unreachable("Tblgen should generate the implementation of this!");
474 }
475
476 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
477 llvm_unreachable("Tblgen should generate this!");
478 }
479
480 virtual MVT getValueTypeForHwMode(unsigned Index) const {
481 llvm_unreachable("Tblgen should generate the implementation of this!");
482 }
483
484 void SelectCodeCommon(SDNode *NodeToMatch, const uint8_t *MatcherTable,
485 unsigned TableSize, const uint8_t *OperandLists);
486
487 /// Return true if complex patterns for this target can mutate the
488 /// DAG.
489 virtual bool ComplexPatternFuncMutatesDAG() const {
490 return false;
491 }
492
493 /// Return whether the node may raise an FP exception.
494 bool mayRaiseFPException(SDNode *Node) const;
495
496 bool isOrEquivalentToAdd(const SDNode *N) const;
497
498private:
499
500 // Calls to these functions are generated by tblgen.
501 void Select_INLINEASM(SDNode *N);
502 void Select_READ_REGISTER(SDNode *Op);
503 void Select_WRITE_REGISTER(SDNode *Op);
504 void Select_UNDEF(SDNode *N);
505 void Select_FAKE_USE(SDNode *N);
506 void Select_RELOC_NONE(SDNode *N);
507 void CannotYetSelect(SDNode *N);
508
509 void Select_FREEZE(SDNode *N);
510 void Select_ARITH_FENCE(SDNode *N);
511 void Select_MEMBARRIER(SDNode *N);
512
513 void Select_CONVERGENCECTRL_ANCHOR(SDNode *N);
514 void Select_CONVERGENCECTRL_ENTRY(SDNode *N);
515 void Select_CONVERGENCECTRL_LOOP(SDNode *N);
516
517 void pushStackMapLiveVariable(SmallVectorImpl<SDValue> &Ops, SDValue Operand,
518 SDLoc DL);
519 void Select_STACKMAP(SDNode *N);
520 void Select_PATCHPOINT(SDNode *N);
521
522 void Select_JUMP_TABLE_DEBUG_INFO(SDNode *N);
523
524private:
525 void DoInstructionSelection();
526 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList,
527 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo);
528
529 /// Prepares the landing pad to take incoming values or do other EH
530 /// personality specific tasks. Returns true if the block should be
531 /// instruction selected, false if no code should be emitted for it.
532 bool PrepareEHLandingPad();
533
534 // Mark and Report IPToState for each Block under AsynchEH
535 void reportIPToStateForBlocks(MachineFunction *Fn);
536
537 /// Perform instruction selection on all basic blocks in the function.
538 void SelectAllBasicBlocks(const Function &Fn);
539
540 /// Perform instruction selection on a single basic block, for
541 /// instructions between \p Begin and \p End. \p HadTailCall will be set
542 /// to true if a call in the block was translated as a tail call.
543 void SelectBasicBlock(BasicBlock::const_iterator Begin,
545 bool &HadTailCall);
546 void FinishBasicBlock();
547
548 void CodeGenAndEmitDAG();
549
550 /// Generate instructions for lowering the incoming arguments of the
551 /// given function.
552 void LowerArguments(const Function &F);
553
554 void ComputeLiveOutVRegInfo();
555
556 /// Create the scheduler. If a specific scheduler was specified
557 /// via the SchedulerRegistry, use it, otherwise select the
558 /// one preferred by the target.
559 ///
560 ScheduleDAGSDNodes *CreateScheduler();
561
562 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
563 /// state machines that start with a OPC_SwitchOpcode node.
564 std::vector<unsigned> OpcodeOffset;
565
566 void UpdateChains(SDNode *NodeToMatch, SDValue InputChain,
567 SmallVectorImpl<SDNode *> &ChainNodesMatched,
568 bool isMorphNodeTo);
569};
570
572 std::unique_ptr<SelectionDAGISel> Selector;
573
574public:
575 SelectionDAGISelLegacy(char &ID, std::unique_ptr<SelectionDAGISel> S);
576
577 ~SelectionDAGISelLegacy() override = default;
578
579 void getAnalysisUsage(AnalysisUsage &AU) const override;
580
581 bool runOnMachineFunction(MachineFunction &MF) override;
582};
583
584class SelectionDAGISelPass : public PassInfoMixin<SelectionDAGISelPass> {
585 std::unique_ptr<SelectionDAGISel> Selector;
586
587protected:
588 SelectionDAGISelPass(std::unique_ptr<SelectionDAGISel> Selector)
589 : Selector(std::move(Selector)) {}
590
591public:
594 static bool isRequired() { return true; }
595};
596}
597
598#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)
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.
void SelectCodeCommon(SDNode *NodeToMatch, const uint8_t *MatcherTable, unsigned TableSize, const uint8_t *OperandLists)
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:1917
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.