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