LLVM 19.0.0git
SelectionDAGNodes.h
Go to the documentation of this file.
1//===- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ----*- 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 declares the SDNode class and derived classes, which are used to
10// represent the nodes and operations present in a SelectionDAG. These nodes
11// and operations are machine code level operations, with some similarities to
12// the GCC RTL representation.
13//
14// Clients should include the SelectionDAG.h file instead of this file directly.
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H
19#define LLVM_CODEGEN_SELECTIONDAGNODES_H
20
21#include "llvm/ADT/APFloat.h"
22#include "llvm/ADT/ArrayRef.h"
23#include "llvm/ADT/BitVector.h"
24#include "llvm/ADT/FoldingSet.h"
28#include "llvm/ADT/ilist_node.h"
29#include "llvm/ADT/iterator.h"
36#include "llvm/IR/Constants.h"
37#include "llvm/IR/DebugLoc.h"
38#include "llvm/IR/Instruction.h"
40#include "llvm/IR/Metadata.h"
41#include "llvm/IR/Operator.h"
47#include <algorithm>
48#include <cassert>
49#include <climits>
50#include <cstddef>
51#include <cstdint>
52#include <cstring>
53#include <iterator>
54#include <string>
55#include <tuple>
56#include <utility>
57
58namespace llvm {
59
60class APInt;
61class Constant;
62class GlobalValue;
63class MachineBasicBlock;
64class MachineConstantPoolValue;
65class MCSymbol;
66class raw_ostream;
67class SDNode;
68class SelectionDAG;
69class Type;
70class Value;
71
72void checkForCycles(const SDNode *N, const SelectionDAG *DAG = nullptr,
73 bool force = false);
74
75/// This represents a list of ValueType's that has been intern'd by
76/// a SelectionDAG. Instances of this simple value class are returned by
77/// SelectionDAG::getVTList(...).
78///
79struct SDVTList {
80 const EVT *VTs;
81 unsigned int NumVTs;
82};
83
84namespace ISD {
85
86 /// Node predicates
87
88/// If N is a BUILD_VECTOR or SPLAT_VECTOR node whose elements are all the
89/// same constant or undefined, return true and return the constant value in
90/// \p SplatValue.
91bool isConstantSplatVector(const SDNode *N, APInt &SplatValue);
92
93/// Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where
94/// all of the elements are ~0 or undef. If \p BuildVectorOnly is set to
95/// true, it only checks BUILD_VECTOR.
97 bool BuildVectorOnly = false);
98
99/// Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where
100/// all of the elements are 0 or undef. If \p BuildVectorOnly is set to true, it
101/// only checks BUILD_VECTOR.
103 bool BuildVectorOnly = false);
104
105/// Return true if the specified node is a BUILD_VECTOR where all of the
106/// elements are ~0 or undef.
107bool isBuildVectorAllOnes(const SDNode *N);
108
109/// Return true if the specified node is a BUILD_VECTOR where all of the
110/// elements are 0 or undef.
111bool isBuildVectorAllZeros(const SDNode *N);
112
113/// Return true if the specified node is a BUILD_VECTOR node of all
114/// ConstantSDNode or undef.
116
117/// Return true if the specified node is a BUILD_VECTOR node of all
118/// ConstantFPSDNode or undef.
120
121/// Returns true if the specified node is a vector where all elements can
122/// be truncated to the specified element size without a loss in meaning.
123bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed);
124
125/// Return true if the node has at least one operand and all operands of the
126/// specified node are ISD::UNDEF.
127bool allOperandsUndef(const SDNode *N);
128
129/// Return true if the specified node is FREEZE(UNDEF).
130bool isFreezeUndef(const SDNode *N);
131
132} // end namespace ISD
133
134//===----------------------------------------------------------------------===//
135/// Unlike LLVM values, Selection DAG nodes may return multiple
136/// values as the result of a computation. Many nodes return multiple values,
137/// from loads (which define a token and a return value) to ADDC (which returns
138/// a result and a carry value), to calls (which may return an arbitrary number
139/// of values).
140///
141/// As such, each use of a SelectionDAG computation must indicate the node that
142/// computes it as well as which return value to use from that node. This pair
143/// of information is represented with the SDValue value type.
144///
145class SDValue {
146 friend struct DenseMapInfo<SDValue>;
147
148 SDNode *Node = nullptr; // The node defining the value we are using.
149 unsigned ResNo = 0; // Which return value of the node we are using.
150
151public:
152 SDValue() = default;
153 SDValue(SDNode *node, unsigned resno);
154
155 /// get the index which selects a specific result in the SDNode
156 unsigned getResNo() const { return ResNo; }
157
158 /// get the SDNode which holds the desired result
159 SDNode *getNode() const { return Node; }
160
161 /// set the SDNode
162 void setNode(SDNode *N) { Node = N; }
163
164 inline SDNode *operator->() const { return Node; }
165
166 bool operator==(const SDValue &O) const {
167 return Node == O.Node && ResNo == O.ResNo;
168 }
169 bool operator!=(const SDValue &O) const {
170 return !operator==(O);
171 }
172 bool operator<(const SDValue &O) const {
173 return std::tie(Node, ResNo) < std::tie(O.Node, O.ResNo);
174 }
175 explicit operator bool() const {
176 return Node != nullptr;
177 }
178
179 SDValue getValue(unsigned R) const {
180 return SDValue(Node, R);
181 }
182
183 /// Return true if this node is an operand of N.
184 bool isOperandOf(const SDNode *N) const;
185
186 /// Return the ValueType of the referenced return value.
187 inline EVT getValueType() const;
188
189 /// Return the simple ValueType of the referenced return value.
191 return getValueType().getSimpleVT();
192 }
193
194 /// Returns the size of the value in bits.
195 ///
196 /// If the value type is a scalable vector type, the scalable property will
197 /// be set and the runtime size will be a positive integer multiple of the
198 /// base size.
200 return getValueType().getSizeInBits();
201 }
202
205 }
206
207 // Forwarding methods - These forward to the corresponding methods in SDNode.
208 inline unsigned getOpcode() const;
209 inline unsigned getNumOperands() const;
210 inline const SDValue &getOperand(unsigned i) const;
211 inline uint64_t getConstantOperandVal(unsigned i) const;
212 inline const APInt &getConstantOperandAPInt(unsigned i) const;
213 inline bool isTargetMemoryOpcode() const;
214 inline bool isTargetOpcode() const;
215 inline bool isMachineOpcode() const;
216 inline bool isUndef() const;
217 inline unsigned getMachineOpcode() const;
218 inline const DebugLoc &getDebugLoc() const;
219 inline void dump() const;
220 inline void dump(const SelectionDAG *G) const;
221 inline void dumpr() const;
222 inline void dumpr(const SelectionDAG *G) const;
223
224 /// Return true if this operand (which must be a chain) reaches the
225 /// specified operand without crossing any side-effecting instructions.
226 /// In practice, this looks through token factors and non-volatile loads.
227 /// In order to remain efficient, this only
228 /// looks a couple of nodes in, it does not do an exhaustive search.
230 unsigned Depth = 2) const;
231
232 /// Return true if there are no nodes using value ResNo of Node.
233 inline bool use_empty() const;
234
235 /// Return true if there is exactly one node using value ResNo of Node.
236 inline bool hasOneUse() const;
237};
238
239template<> struct DenseMapInfo<SDValue> {
240 static inline SDValue getEmptyKey() {
241 SDValue V;
242 V.ResNo = -1U;
243 return V;
244 }
245
246 static inline SDValue getTombstoneKey() {
247 SDValue V;
248 V.ResNo = -2U;
249 return V;
250 }
251
252 static unsigned getHashValue(const SDValue &Val) {
253 return ((unsigned)((uintptr_t)Val.getNode() >> 4) ^
254 (unsigned)((uintptr_t)Val.getNode() >> 9)) + Val.getResNo();
255 }
256
257 static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
258 return LHS == RHS;
259 }
260};
261
262/// Allow casting operators to work directly on
263/// SDValues as if they were SDNode*'s.
264template<> struct simplify_type<SDValue> {
266
268 return Val.getNode();
269 }
270};
271template<> struct simplify_type<const SDValue> {
272 using SimpleType = /*const*/ SDNode *;
273
275 return Val.getNode();
276 }
277};
278
279/// Represents a use of a SDNode. This class holds an SDValue,
280/// which records the SDNode being used and the result number, a
281/// pointer to the SDNode using the value, and Next and Prev pointers,
282/// which link together all the uses of an SDNode.
283///
284class SDUse {
285 /// Val - The value being used.
286 SDValue Val;
287 /// User - The user of this value.
288 SDNode *User = nullptr;
289 /// Prev, Next - Pointers to the uses list of the SDNode referred by
290 /// this operand.
291 SDUse **Prev = nullptr;
292 SDUse *Next = nullptr;
293
294public:
295 SDUse() = default;
296 SDUse(const SDUse &U) = delete;
297 SDUse &operator=(const SDUse &) = delete;
298
299 /// Normally SDUse will just implicitly convert to an SDValue that it holds.
300 operator const SDValue&() const { return Val; }
301
302 /// If implicit conversion to SDValue doesn't work, the get() method returns
303 /// the SDValue.
304 const SDValue &get() const { return Val; }
305
306 /// This returns the SDNode that contains this Use.
307 SDNode *getUser() { return User; }
308 const SDNode *getUser() const { return User; }
309
310 /// Get the next SDUse in the use list.
311 SDUse *getNext() const { return Next; }
312
313 /// Convenience function for get().getNode().
314 SDNode *getNode() const { return Val.getNode(); }
315 /// Convenience function for get().getResNo().
316 unsigned getResNo() const { return Val.getResNo(); }
317 /// Convenience function for get().getValueType().
318 EVT getValueType() const { return Val.getValueType(); }
319
320 /// Convenience function for get().operator==
321 bool operator==(const SDValue &V) const {
322 return Val == V;
323 }
324
325 /// Convenience function for get().operator!=
326 bool operator!=(const SDValue &V) const {
327 return Val != V;
328 }
329
330 /// Convenience function for get().operator<
331 bool operator<(const SDValue &V) const {
332 return Val < V;
333 }
334
335private:
336 friend class SelectionDAG;
337 friend class SDNode;
338 // TODO: unfriend HandleSDNode once we fix its operand handling.
339 friend class HandleSDNode;
340
341 void setUser(SDNode *p) { User = p; }
342
343 /// Remove this use from its existing use list, assign it the
344 /// given value, and add it to the new value's node's use list.
345 inline void set(const SDValue &V);
346 /// Like set, but only supports initializing a newly-allocated
347 /// SDUse with a non-null value.
348 inline void setInitial(const SDValue &V);
349 /// Like set, but only sets the Node portion of the value,
350 /// leaving the ResNo portion unmodified.
351 inline void setNode(SDNode *N);
352
353 void addToList(SDUse **List) {
354 Next = *List;
355 if (Next) Next->Prev = &Next;
356 Prev = List;
357 *List = this;
358 }
359
360 void removeFromList() {
361 *Prev = Next;
362 if (Next) Next->Prev = Prev;
363 }
364};
365
366/// simplify_type specializations - Allow casting operators to work directly on
367/// SDValues as if they were SDNode*'s.
368template<> struct simplify_type<SDUse> {
370
372 return Val.getNode();
373 }
374};
375
376/// These are IR-level optimization flags that may be propagated to SDNodes.
377/// TODO: This data structure should be shared by the IR optimizer and the
378/// the backend.
380private:
381 bool NoUnsignedWrap : 1;
382 bool NoSignedWrap : 1;
383 bool Exact : 1;
384 bool Disjoint : 1;
385 bool NonNeg : 1;
386 bool NoNaNs : 1;
387 bool NoInfs : 1;
388 bool NoSignedZeros : 1;
389 bool AllowReciprocal : 1;
390 bool AllowContract : 1;
391 bool ApproximateFuncs : 1;
392 bool AllowReassociation : 1;
393
394 // We assume instructions do not raise floating-point exceptions by default,
395 // and only those marked explicitly may do so. We could choose to represent
396 // this via a positive "FPExcept" flags like on the MI level, but having a
397 // negative "NoFPExcept" flag here makes the flag intersection logic more
398 // straightforward.
399 bool NoFPExcept : 1;
400 // Instructions with attached 'unpredictable' metadata on IR level.
401 bool Unpredictable : 1;
402
403public:
404 /// Default constructor turns off all optimization flags.
406 : NoUnsignedWrap(false), NoSignedWrap(false), Exact(false),
407 Disjoint(false), NonNeg(false), NoNaNs(false), NoInfs(false),
408 NoSignedZeros(false), AllowReciprocal(false), AllowContract(false),
409 ApproximateFuncs(false), AllowReassociation(false), NoFPExcept(false),
410 Unpredictable(false) {}
411
412 /// Propagate the fast-math-flags from an IR FPMathOperator.
413 void copyFMF(const FPMathOperator &FPMO) {
414 setNoNaNs(FPMO.hasNoNaNs());
415 setNoInfs(FPMO.hasNoInfs());
421 }
422
423 // These are mutators for each flag.
424 void setNoUnsignedWrap(bool b) { NoUnsignedWrap = b; }
425 void setNoSignedWrap(bool b) { NoSignedWrap = b; }
426 void setExact(bool b) { Exact = b; }
427 void setDisjoint(bool b) { Disjoint = b; }
428 void setNonNeg(bool b) { NonNeg = b; }
429 void setNoNaNs(bool b) { NoNaNs = b; }
430 void setNoInfs(bool b) { NoInfs = b; }
431 void setNoSignedZeros(bool b) { NoSignedZeros = b; }
432 void setAllowReciprocal(bool b) { AllowReciprocal = b; }
433 void setAllowContract(bool b) { AllowContract = b; }
434 void setApproximateFuncs(bool b) { ApproximateFuncs = b; }
435 void setAllowReassociation(bool b) { AllowReassociation = b; }
436 void setNoFPExcept(bool b) { NoFPExcept = b; }
437 void setUnpredictable(bool b) { Unpredictable = b; }
438
439 // These are accessors for each flag.
440 bool hasNoUnsignedWrap() const { return NoUnsignedWrap; }
441 bool hasNoSignedWrap() const { return NoSignedWrap; }
442 bool hasExact() const { return Exact; }
443 bool hasDisjoint() const { return Disjoint; }
444 bool hasNonNeg() const { return NonNeg; }
445 bool hasNoNaNs() const { return NoNaNs; }
446 bool hasNoInfs() const { return NoInfs; }
447 bool hasNoSignedZeros() const { return NoSignedZeros; }
448 bool hasAllowReciprocal() const { return AllowReciprocal; }
449 bool hasAllowContract() const { return AllowContract; }
450 bool hasApproximateFuncs() const { return ApproximateFuncs; }
451 bool hasAllowReassociation() const { return AllowReassociation; }
452 bool hasNoFPExcept() const { return NoFPExcept; }
453 bool hasUnpredictable() const { return Unpredictable; }
454
455 /// Clear any flags in this flag set that aren't also set in Flags. All
456 /// flags will be cleared if Flags are undefined.
457 void intersectWith(const SDNodeFlags Flags) {
458 NoUnsignedWrap &= Flags.NoUnsignedWrap;
459 NoSignedWrap &= Flags.NoSignedWrap;
460 Exact &= Flags.Exact;
461 Disjoint &= Flags.Disjoint;
462 NonNeg &= Flags.NonNeg;
463 NoNaNs &= Flags.NoNaNs;
464 NoInfs &= Flags.NoInfs;
465 NoSignedZeros &= Flags.NoSignedZeros;
466 AllowReciprocal &= Flags.AllowReciprocal;
467 AllowContract &= Flags.AllowContract;
468 ApproximateFuncs &= Flags.ApproximateFuncs;
469 AllowReassociation &= Flags.AllowReassociation;
470 NoFPExcept &= Flags.NoFPExcept;
471 Unpredictable &= Flags.Unpredictable;
472 }
473};
474
475/// Represents one node in the SelectionDAG.
476///
477class SDNode : public FoldingSetNode, public ilist_node<SDNode> {
478private:
479 /// The operation that this node performs.
480 int32_t NodeType;
481
482public:
483 /// Unique and persistent id per SDNode in the DAG. Used for debug printing.
484 /// We do not place that under `#if LLVM_ENABLE_ABI_BREAKING_CHECKS`
485 /// intentionally because it adds unneeded complexity without noticeable
486 /// benefits (see discussion with @thakis in D120714).
488
489protected:
490 // We define a set of mini-helper classes to help us interpret the bits in our
491 // SubclassData. These are designed to fit within a uint16_t so they pack
492 // with PersistentId.
493
494#if defined(_AIX) && (!defined(__GNUC__) || defined(__clang__))
495// Except for GCC; by default, AIX compilers store bit-fields in 4-byte words
496// and give the `pack` pragma push semantics.
497#define BEGIN_TWO_BYTE_PACK() _Pragma("pack(2)")
498#define END_TWO_BYTE_PACK() _Pragma("pack(pop)")
499#else
500#define BEGIN_TWO_BYTE_PACK()
501#define END_TWO_BYTE_PACK()
502#endif
503
506 friend class SDNode;
507 friend class MemIntrinsicSDNode;
508 friend class MemSDNode;
509 friend class SelectionDAG;
510
511 uint16_t HasDebugValue : 1;
512 uint16_t IsMemIntrinsic : 1;
513 uint16_t IsDivergent : 1;
514 };
515 enum { NumSDNodeBits = 3 };
516
518 friend class ConstantSDNode;
519
521
522 uint16_t IsOpaque : 1;
523 };
524
526 friend class MemSDNode;
527 friend class MemIntrinsicSDNode;
528 friend class AtomicSDNode;
529
531
532 uint16_t IsVolatile : 1;
533 uint16_t IsNonTemporal : 1;
534 uint16_t IsDereferenceable : 1;
535 uint16_t IsInvariant : 1;
536 };
538
540 friend class LSBaseSDNode;
546
548
549 // This storage is shared between disparate class hierarchies to hold an
550 // enumeration specific to the class hierarchy in use.
551 // LSBaseSDNode => enum ISD::MemIndexedMode
552 // VPLoadStoreBaseSDNode => enum ISD::MemIndexedMode
553 // MaskedLoadStoreBaseSDNode => enum ISD::MemIndexedMode
554 // VPGatherScatterSDNode => enum ISD::MemIndexType
555 // MaskedGatherScatterSDNode => enum ISD::MemIndexType
556 // MaskedHistogramSDNode => enum ISD::MemIndexType
558 };
560
562 friend class LoadSDNode;
563 friend class AtomicSDNode;
564 friend class VPLoadSDNode;
566 friend class MaskedLoadSDNode;
567 friend class MaskedGatherSDNode;
568 friend class VPGatherSDNode;
570
572
573 uint16_t ExtTy : 2; // enum ISD::LoadExtType
574 uint16_t IsExpanding : 1;
575 };
576
578 friend class StoreSDNode;
579 friend class VPStoreSDNode;
581 friend class MaskedStoreSDNode;
583 friend class VPScatterSDNode;
584
586
587 uint16_t IsTruncating : 1;
588 uint16_t IsCompressing : 1;
589 };
590
591 union {
592 char RawSDNodeBits[sizeof(uint16_t)];
599 };
601#undef BEGIN_TWO_BYTE_PACK
602#undef END_TWO_BYTE_PACK
603
604 // RawSDNodeBits must cover the entirety of the union. This means that all of
605 // the union's members must have size <= RawSDNodeBits. We write the RHS as
606 // "2" instead of sizeof(RawSDNodeBits) because MSVC can't handle the latter.
607 static_assert(sizeof(SDNodeBitfields) <= 2, "field too wide");
608 static_assert(sizeof(ConstantSDNodeBitfields) <= 2, "field too wide");
609 static_assert(sizeof(MemSDNodeBitfields) <= 2, "field too wide");
610 static_assert(sizeof(LSBaseSDNodeBitfields) <= 2, "field too wide");
611 static_assert(sizeof(LoadSDNodeBitfields) <= 2, "field too wide");
612 static_assert(sizeof(StoreSDNodeBitfields) <= 2, "field too wide");
613
614private:
615 friend class SelectionDAG;
616 // TODO: unfriend HandleSDNode once we fix its operand handling.
617 friend class HandleSDNode;
618
619 /// Unique id per SDNode in the DAG.
620 int NodeId = -1;
621
622 /// The values that are used by this operation.
623 SDUse *OperandList = nullptr;
624
625 /// The types of the values this node defines. SDNode's may
626 /// define multiple values simultaneously.
627 const EVT *ValueList;
628
629 /// List of uses for this SDNode.
630 SDUse *UseList = nullptr;
631
632 /// The number of entries in the Operand/Value list.
633 unsigned short NumOperands = 0;
634 unsigned short NumValues;
635
636 // The ordering of the SDNodes. It roughly corresponds to the ordering of the
637 // original LLVM instructions.
638 // This is used for turning off scheduling, because we'll forgo
639 // the normal scheduling algorithms and output the instructions according to
640 // this ordering.
641 unsigned IROrder;
642
643 /// Source line information.
644 DebugLoc debugLoc;
645
646 /// Return a pointer to the specified value type.
647 static const EVT *getValueTypeList(EVT VT);
648
649 SDNodeFlags Flags;
650
651 uint32_t CFIType = 0;
652
653public:
654 //===--------------------------------------------------------------------===//
655 // Accessors
656 //
657
658 /// Return the SelectionDAG opcode value for this node. For
659 /// pre-isel nodes (those for which isMachineOpcode returns false), these
660 /// are the opcode values in the ISD and <target>ISD namespaces. For
661 /// post-isel opcodes, see getMachineOpcode.
662 unsigned getOpcode() const { return (unsigned)NodeType; }
663
664 /// Test if this node has a target-specific opcode (in the
665 /// <target>ISD namespace).
666 bool isTargetOpcode() const { return NodeType >= ISD::BUILTIN_OP_END; }
667
668 /// Test if this node has a target-specific opcode that may raise
669 /// FP exceptions (in the <target>ISD namespace and greater than
670 /// FIRST_TARGET_STRICTFP_OPCODE). Note that all target memory
671 /// opcode are currently automatically considered to possibly raise
672 /// FP exceptions as well.
674 return NodeType >= ISD::FIRST_TARGET_STRICTFP_OPCODE;
675 }
676
677 /// Test if this node has a target-specific
678 /// memory-referencing opcode (in the <target>ISD namespace and
679 /// greater than FIRST_TARGET_MEMORY_OPCODE).
680 bool isTargetMemoryOpcode() const {
681 return NodeType >= ISD::FIRST_TARGET_MEMORY_OPCODE;
682 }
683
684 /// Return true if the type of the node type undefined.
685 bool isUndef() const { return NodeType == ISD::UNDEF; }
686
687 /// Test if this node is a memory intrinsic (with valid pointer information).
688 /// INTRINSIC_W_CHAIN and INTRINSIC_VOID nodes are sometimes created for
689 /// non-memory intrinsics (with chains) that are not really instances of
690 /// MemSDNode. For such nodes, we need some extra state to determine the
691 /// proper classof relationship.
692 bool isMemIntrinsic() const {
693 return (NodeType == ISD::INTRINSIC_W_CHAIN ||
694 NodeType == ISD::INTRINSIC_VOID) &&
695 SDNodeBits.IsMemIntrinsic;
696 }
697
698 /// Test if this node is a strict floating point pseudo-op.
700 switch (NodeType) {
701 default:
702 return false;
707#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
708 case ISD::STRICT_##DAGN:
709#include "llvm/IR/ConstrainedOps.def"
710 return true;
711 }
712 }
713
714 /// Test if this node is a vector predication operation.
715 bool isVPOpcode() const { return ISD::isVPOpcode(getOpcode()); }
716
717 /// Test if this node has a post-isel opcode, directly
718 /// corresponding to a MachineInstr opcode.
719 bool isMachineOpcode() const { return NodeType < 0; }
720
721 /// This may only be called if isMachineOpcode returns
722 /// true. It returns the MachineInstr opcode value that the node's opcode
723 /// corresponds to.
724 unsigned getMachineOpcode() const {
725 assert(isMachineOpcode() && "Not a MachineInstr opcode!");
726 return ~NodeType;
727 }
728
729 bool getHasDebugValue() const { return SDNodeBits.HasDebugValue; }
730 void setHasDebugValue(bool b) { SDNodeBits.HasDebugValue = b; }
731
732 bool isDivergent() const { return SDNodeBits.IsDivergent; }
733
734 /// Return true if there are no uses of this node.
735 bool use_empty() const { return UseList == nullptr; }
736
737 /// Return true if there is exactly one use of this node.
738 bool hasOneUse() const { return hasSingleElement(uses()); }
739
740 /// Return the number of uses of this node. This method takes
741 /// time proportional to the number of uses.
742 size_t use_size() const { return std::distance(use_begin(), use_end()); }
743
744 /// Return the unique node id.
745 int getNodeId() const { return NodeId; }
746
747 /// Set unique node id.
748 void setNodeId(int Id) { NodeId = Id; }
749
750 /// Return the node ordering.
751 unsigned getIROrder() const { return IROrder; }
752
753 /// Set the node ordering.
754 void setIROrder(unsigned Order) { IROrder = Order; }
755
756 /// Return the source location info.
757 const DebugLoc &getDebugLoc() const { return debugLoc; }
758
759 /// Set source location info. Try to avoid this, putting
760 /// it in the constructor is preferable.
761 void setDebugLoc(DebugLoc dl) { debugLoc = std::move(dl); }
762
763 /// This class provides iterator support for SDUse
764 /// operands that use a specific SDNode.
766 friend class SDNode;
767
768 SDUse *Op = nullptr;
769
770 explicit use_iterator(SDUse *op) : Op(op) {}
771
772 public:
773 using iterator_category = std::forward_iterator_tag;
775 using difference_type = std::ptrdiff_t;
778
779 use_iterator() = default;
780 use_iterator(const use_iterator &I) = default;
782
783 bool operator==(const use_iterator &x) const { return Op == x.Op; }
784 bool operator!=(const use_iterator &x) const {
785 return !operator==(x);
786 }
787
788 /// Return true if this iterator is at the end of uses list.
789 bool atEnd() const { return Op == nullptr; }
790
791 // Iterator traversal: forward iteration only.
792 use_iterator &operator++() { // Preincrement
793 assert(Op && "Cannot increment end iterator!");
794 Op = Op->getNext();
795 return *this;
796 }
797
798 use_iterator operator++(int) { // Postincrement
799 use_iterator tmp = *this; ++*this; return tmp;
800 }
801
802 /// Retrieve a pointer to the current user node.
803 SDNode *operator*() const {
804 assert(Op && "Cannot dereference end iterator!");
805 return Op->getUser();
806 }
807
808 SDNode *operator->() const { return operator*(); }
809
810 SDUse &getUse() const { return *Op; }
811
812 /// Retrieve the operand # of this use in its user.
813 unsigned getOperandNo() const {
814 assert(Op && "Cannot dereference end iterator!");
815 return (unsigned)(Op - Op->getUser()->OperandList);
816 }
817 };
818
819 /// Provide iteration support to walk over all uses of an SDNode.
821 return use_iterator(UseList);
822 }
823
824 static use_iterator use_end() { return use_iterator(nullptr); }
825
827 return make_range(use_begin(), use_end());
828 }
830 return make_range(use_begin(), use_end());
831 }
832
833 /// Return true if there are exactly NUSES uses of the indicated value.
834 /// This method ignores uses of other values defined by this operation.
835 bool hasNUsesOfValue(unsigned NUses, unsigned Value) const;
836
837 /// Return true if there are any use of the indicated value.
838 /// This method ignores uses of other values defined by this operation.
839 bool hasAnyUseOfValue(unsigned Value) const;
840
841 /// Return true if this node is the only use of N.
842 bool isOnlyUserOf(const SDNode *N) const;
843
844 /// Return true if this node is an operand of N.
845 bool isOperandOf(const SDNode *N) const;
846
847 /// Return true if this node is a predecessor of N.
848 /// NOTE: Implemented on top of hasPredecessor and every bit as
849 /// expensive. Use carefully.
850 bool isPredecessorOf(const SDNode *N) const {
851 return N->hasPredecessor(this);
852 }
853
854 /// Return true if N is a predecessor of this node.
855 /// N is either an operand of this node, or can be reached by recursively
856 /// traversing up the operands.
857 /// NOTE: This is an expensive method. Use it carefully.
858 bool hasPredecessor(const SDNode *N) const;
859
860 /// Returns true if N is a predecessor of any node in Worklist. This
861 /// helper keeps Visited and Worklist sets externally to allow unions
862 /// searches to be performed in parallel, caching of results across
863 /// queries and incremental addition to Worklist. Stops early if N is
864 /// found but will resume. Remember to clear Visited and Worklists
865 /// if DAG changes. MaxSteps gives a maximum number of nodes to visit before
866 /// giving up. The TopologicalPrune flag signals that positive NodeIds are
867 /// topologically ordered (Operands have strictly smaller node id) and search
868 /// can be pruned leveraging this.
869 static bool hasPredecessorHelper(const SDNode *N,
872 unsigned int MaxSteps = 0,
873 bool TopologicalPrune = false) {
874 SmallVector<const SDNode *, 8> DeferredNodes;
875 if (Visited.count(N))
876 return true;
877
878 // Node Id's are assigned in three places: As a topological
879 // ordering (> 0), during legalization (results in values set to
880 // 0), new nodes (set to -1). If N has a topolgical id then we
881 // know that all nodes with ids smaller than it cannot be
882 // successors and we need not check them. Filter out all node
883 // that can't be matches. We add them to the worklist before exit
884 // in case of multiple calls. Note that during selection the topological id
885 // may be violated if a node's predecessor is selected before it. We mark
886 // this at selection negating the id of unselected successors and
887 // restricting topological pruning to positive ids.
888
889 int NId = N->getNodeId();
890 // If we Invalidated the Id, reconstruct original NId.
891 if (NId < -1)
892 NId = -(NId + 1);
893
894 bool Found = false;
895 while (!Worklist.empty()) {
896 const SDNode *M = Worklist.pop_back_val();
897 int MId = M->getNodeId();
898 if (TopologicalPrune && M->getOpcode() != ISD::TokenFactor && (NId > 0) &&
899 (MId > 0) && (MId < NId)) {
900 DeferredNodes.push_back(M);
901 continue;
902 }
903 for (const SDValue &OpV : M->op_values()) {
904 SDNode *Op = OpV.getNode();
905 if (Visited.insert(Op).second)
906 Worklist.push_back(Op);
907 if (Op == N)
908 Found = true;
909 }
910 if (Found)
911 break;
912 if (MaxSteps != 0 && Visited.size() >= MaxSteps)
913 break;
914 }
915 // Push deferred nodes back on worklist.
916 Worklist.append(DeferredNodes.begin(), DeferredNodes.end());
917 // If we bailed early, conservatively return found.
918 if (MaxSteps != 0 && Visited.size() >= MaxSteps)
919 return true;
920 return Found;
921 }
922
923 /// Return true if all the users of N are contained in Nodes.
924 /// NOTE: Requires at least one match, but doesn't require them all.
925 static bool areOnlyUsersOf(ArrayRef<const SDNode *> Nodes, const SDNode *N);
926
927 /// Return the number of values used by this operation.
928 unsigned getNumOperands() const { return NumOperands; }
929
930 /// Return the maximum number of operands that a SDNode can hold.
931 static constexpr size_t getMaxNumOperands() {
932 return std::numeric_limits<decltype(SDNode::NumOperands)>::max();
933 }
934
935 /// Helper method returns the integer value of a ConstantSDNode operand.
936 inline uint64_t getConstantOperandVal(unsigned Num) const;
937
938 /// Helper method returns the zero-extended integer value of a ConstantSDNode.
939 inline uint64_t getAsZExtVal() const;
940
941 /// Helper method returns the APInt of a ConstantSDNode operand.
942 inline const APInt &getConstantOperandAPInt(unsigned Num) const;
943
944 /// Helper method returns the APInt value of a ConstantSDNode.
945 inline const APInt &getAsAPIntVal() const;
946
947 const SDValue &getOperand(unsigned Num) const {
948 assert(Num < NumOperands && "Invalid child # of SDNode!");
949 return OperandList[Num];
950 }
951
953
954 op_iterator op_begin() const { return OperandList; }
955 op_iterator op_end() const { return OperandList+NumOperands; }
956 ArrayRef<SDUse> ops() const { return ArrayRef(op_begin(), op_end()); }
957
958 /// Iterator for directly iterating over the operand SDValue's.
960 : iterator_adaptor_base<value_op_iterator, op_iterator,
961 std::random_access_iterator_tag, SDValue,
962 ptrdiff_t, value_op_iterator *,
963 value_op_iterator *> {
964 explicit value_op_iterator(SDUse *U = nullptr)
966
967 const SDValue &operator*() const { return I->get(); }
968 };
969
973 }
974
976 SDVTList X = { ValueList, NumValues };
977 return X;
978 }
979
980 /// If this node has a glue operand, return the node
981 /// to which the glue operand points. Otherwise return NULL.
983 if (getNumOperands() != 0 &&
984 getOperand(getNumOperands()-1).getValueType() == MVT::Glue)
985 return getOperand(getNumOperands()-1).getNode();
986 return nullptr;
987 }
988
989 /// If this node has a glue value with a user, return
990 /// the user (there is at most one). Otherwise return NULL.
992 for (use_iterator UI = use_begin(), UE = use_end(); UI != UE; ++UI)
993 if (UI.getUse().get().getValueType() == MVT::Glue)
994 return *UI;
995 return nullptr;
996 }
997
998 SDNodeFlags getFlags() const { return Flags; }
999 void setFlags(SDNodeFlags NewFlags) { Flags = NewFlags; }
1000
1001 /// Clear any flags in this node that aren't also set in Flags.
1002 /// If Flags is not in a defined state then this has no effect.
1003 void intersectFlagsWith(const SDNodeFlags Flags);
1004
1006 SDNodeFlags Flags = getFlags();
1007 return Flags.hasNoUnsignedWrap() || Flags.hasNoSignedWrap() ||
1008 Flags.hasExact() || Flags.hasDisjoint() || Flags.hasNonNeg() ||
1009 Flags.hasNoNaNs() || Flags.hasNoInfs();
1010 }
1011
1012 void setCFIType(uint32_t Type) { CFIType = Type; }
1013 uint32_t getCFIType() const { return CFIType; }
1014
1015 /// Return the number of values defined/returned by this operator.
1016 unsigned getNumValues() const { return NumValues; }
1017
1018 /// Return the type of a specified result.
1019 EVT getValueType(unsigned ResNo) const {
1020 assert(ResNo < NumValues && "Illegal result number!");
1021 return ValueList[ResNo];
1022 }
1023
1024 /// Return the type of a specified result as a simple type.
1025 MVT getSimpleValueType(unsigned ResNo) const {
1026 return getValueType(ResNo).getSimpleVT();
1027 }
1028
1029 /// Returns MVT::getSizeInBits(getValueType(ResNo)).
1030 ///
1031 /// If the value type is a scalable vector type, the scalable property will
1032 /// be set and the runtime size will be a positive integer multiple of the
1033 /// base size.
1034 TypeSize getValueSizeInBits(unsigned ResNo) const {
1035 return getValueType(ResNo).getSizeInBits();
1036 }
1037
1038 using value_iterator = const EVT *;
1039
1040 value_iterator value_begin() const { return ValueList; }
1041 value_iterator value_end() const { return ValueList+NumValues; }
1044 }
1045
1046 /// Return the opcode of this operation for printing.
1047 std::string getOperationName(const SelectionDAG *G = nullptr) const;
1048 static const char* getIndexedModeName(ISD::MemIndexedMode AM);
1049 void print_types(raw_ostream &OS, const SelectionDAG *G) const;
1050 void print_details(raw_ostream &OS, const SelectionDAG *G) const;
1051 void print(raw_ostream &OS, const SelectionDAG *G = nullptr) const;
1052 void printr(raw_ostream &OS, const SelectionDAG *G = nullptr) const;
1053
1054 /// Print a SelectionDAG node and all children down to
1055 /// the leaves. The given SelectionDAG allows target-specific nodes
1056 /// to be printed in human-readable form. Unlike printr, this will
1057 /// print the whole DAG, including children that appear multiple
1058 /// times.
1059 ///
1060 void printrFull(raw_ostream &O, const SelectionDAG *G = nullptr) const;
1061
1062 /// Print a SelectionDAG node and children up to
1063 /// depth "depth." The given SelectionDAG allows target-specific
1064 /// nodes to be printed in human-readable form. Unlike printr, this
1065 /// will print children that appear multiple times wherever they are
1066 /// used.
1067 ///
1068 void printrWithDepth(raw_ostream &O, const SelectionDAG *G = nullptr,
1069 unsigned depth = 100) const;
1070
1071 /// Dump this node, for debugging.
1072 void dump() const;
1073
1074 /// Dump (recursively) this node and its use-def subgraph.
1075 void dumpr() const;
1076
1077 /// Dump this node, for debugging.
1078 /// The given SelectionDAG allows target-specific nodes to be printed
1079 /// in human-readable form.
1080 void dump(const SelectionDAG *G) const;
1081
1082 /// Dump (recursively) this node and its use-def subgraph.
1083 /// The given SelectionDAG allows target-specific nodes to be printed
1084 /// in human-readable form.
1085 void dumpr(const SelectionDAG *G) const;
1086
1087 /// printrFull to dbgs(). The given SelectionDAG allows
1088 /// target-specific nodes to be printed in human-readable form.
1089 /// Unlike dumpr, this will print the whole DAG, including children
1090 /// that appear multiple times.
1091 void dumprFull(const SelectionDAG *G = nullptr) const;
1092
1093 /// printrWithDepth to dbgs(). The given
1094 /// SelectionDAG allows target-specific nodes to be printed in
1095 /// human-readable form. Unlike dumpr, this will print children
1096 /// that appear multiple times wherever they are used.
1097 ///
1098 void dumprWithDepth(const SelectionDAG *G = nullptr,
1099 unsigned depth = 100) const;
1100
1101 /// Gather unique data for the node.
1102 void Profile(FoldingSetNodeID &ID) const;
1103
1104 /// This method should only be used by the SDUse class.
1105 void addUse(SDUse &U) { U.addToList(&UseList); }
1106
1107protected:
1109 SDVTList Ret = { getValueTypeList(VT), 1 };
1110 return Ret;
1111 }
1112
1113 /// Create an SDNode.
1114 ///
1115 /// SDNodes are created without any operands, and never own the operand
1116 /// storage. To add operands, see SelectionDAG::createOperands.
1117 SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
1118 : NodeType(Opc), ValueList(VTs.VTs), NumValues(VTs.NumVTs),
1119 IROrder(Order), debugLoc(std::move(dl)) {
1120 memset(&RawSDNodeBits, 0, sizeof(RawSDNodeBits));
1121 assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");
1122 assert(NumValues == VTs.NumVTs &&
1123 "NumValues wasn't wide enough for its operands!");
1124 }
1125
1126 /// Release the operands and set this node to have zero operands.
1127 void DropOperands();
1128};
1129
1130/// Wrapper class for IR location info (IR ordering and DebugLoc) to be passed
1131/// into SDNode creation functions.
1132/// When an SDNode is created from the DAGBuilder, the DebugLoc is extracted
1133/// from the original Instruction, and IROrder is the ordinal position of
1134/// the instruction.
1135/// When an SDNode is created after the DAG is being built, both DebugLoc and
1136/// the IROrder are propagated from the original SDNode.
1137/// So SDLoc class provides two constructors besides the default one, one to
1138/// be used by the DAGBuilder, the other to be used by others.
1139class SDLoc {
1140private:
1141 DebugLoc DL;
1142 int IROrder = 0;
1143
1144public:
1145 SDLoc() = default;
1146 SDLoc(const SDNode *N) : DL(N->getDebugLoc()), IROrder(N->getIROrder()) {}
1147 SDLoc(const SDValue V) : SDLoc(V.getNode()) {}
1148 SDLoc(const Instruction *I, int Order) : IROrder(Order) {
1149 assert(Order >= 0 && "bad IROrder");
1150 if (I)
1151 DL = I->getDebugLoc();
1152 }
1153
1154 unsigned getIROrder() const { return IROrder; }
1155 const DebugLoc &getDebugLoc() const { return DL; }
1156};
1157
1158// Define inline functions from the SDValue class.
1159
1160inline SDValue::SDValue(SDNode *node, unsigned resno)
1161 : Node(node), ResNo(resno) {
1162 // Explicitly check for !ResNo to avoid use-after-free, because there are
1163 // callers that use SDValue(N, 0) with a deleted N to indicate successful
1164 // combines.
1165 assert((!Node || !ResNo || ResNo < Node->getNumValues()) &&
1166 "Invalid result number for the given node!");
1167 assert(ResNo < -2U && "Cannot use result numbers reserved for DenseMaps.");
1168}
1169
1170inline unsigned SDValue::getOpcode() const {
1171 return Node->getOpcode();
1172}
1173
1175 return Node->getValueType(ResNo);
1176}
1177
1178inline unsigned SDValue::getNumOperands() const {
1179 return Node->getNumOperands();
1180}
1181
1182inline const SDValue &SDValue::getOperand(unsigned i) const {
1183 return Node->getOperand(i);
1184}
1185
1187 return Node->getConstantOperandVal(i);
1188}
1189
1190inline const APInt &SDValue::getConstantOperandAPInt(unsigned i) const {
1191 return Node->getConstantOperandAPInt(i);
1192}
1193
1194inline bool SDValue::isTargetOpcode() const {
1195 return Node->isTargetOpcode();
1196}
1197
1199 return Node->isTargetMemoryOpcode();
1200}
1201
1202inline bool SDValue::isMachineOpcode() const {
1203 return Node->isMachineOpcode();
1204}
1205
1206inline unsigned SDValue::getMachineOpcode() const {
1207 return Node->getMachineOpcode();
1208}
1209
1210inline bool SDValue::isUndef() const {
1211 return Node->isUndef();
1212}
1213
1214inline bool SDValue::use_empty() const {
1215 return !Node->hasAnyUseOfValue(ResNo);
1216}
1217
1218inline bool SDValue::hasOneUse() const {
1219 return Node->hasNUsesOfValue(1, ResNo);
1220}
1221
1222inline const DebugLoc &SDValue::getDebugLoc() const {
1223 return Node->getDebugLoc();
1224}
1225
1226inline void SDValue::dump() const {
1227 return Node->dump();
1228}
1229
1230inline void SDValue::dump(const SelectionDAG *G) const {
1231 return Node->dump(G);
1232}
1233
1234inline void SDValue::dumpr() const {
1235 return Node->dumpr();
1236}
1237
1238inline void SDValue::dumpr(const SelectionDAG *G) const {
1239 return Node->dumpr(G);
1240}
1241
1242// Define inline functions from the SDUse class.
1243
1244inline void SDUse::set(const SDValue &V) {
1245 if (Val.getNode()) removeFromList();
1246 Val = V;
1247 if (V.getNode())
1248 V->addUse(*this);
1249}
1250
1251inline void SDUse::setInitial(const SDValue &V) {
1252 Val = V;
1253 V->addUse(*this);
1254}
1255
1256inline void SDUse::setNode(SDNode *N) {
1257 if (Val.getNode()) removeFromList();
1258 Val.setNode(N);
1259 if (N) N->addUse(*this);
1260}
1261
1262/// This class is used to form a handle around another node that
1263/// is persistent and is updated across invocations of replaceAllUsesWith on its
1264/// operand. This node should be directly created by end-users and not added to
1265/// the AllNodes list.
1266class HandleSDNode : public SDNode {
1267 SDUse Op;
1268
1269public:
1271 : SDNode(ISD::HANDLENODE, 0, DebugLoc(), getSDVTList(MVT::Other)) {
1272 // HandleSDNodes are never inserted into the DAG, so they won't be
1273 // auto-numbered. Use ID 65535 as a sentinel.
1274 PersistentId = 0xffff;
1275
1276 // Manually set up the operand list. This node type is special in that it's
1277 // always stack allocated and SelectionDAG does not manage its operands.
1278 // TODO: This should either (a) not be in the SDNode hierarchy, or (b) not
1279 // be so special.
1280 Op.setUser(this);
1281 Op.setInitial(X);
1282 NumOperands = 1;
1283 OperandList = &Op;
1284 }
1285 ~HandleSDNode();
1286
1287 const SDValue &getValue() const { return Op; }
1288};
1289
1291private:
1292 unsigned SrcAddrSpace;
1293 unsigned DestAddrSpace;
1294
1295public:
1296 AddrSpaceCastSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
1297 unsigned SrcAS, unsigned DestAS)
1298 : SDNode(ISD::ADDRSPACECAST, Order, dl, VTs), SrcAddrSpace(SrcAS),
1299 DestAddrSpace(DestAS) {}
1300
1301 unsigned getSrcAddressSpace() const { return SrcAddrSpace; }
1302 unsigned getDestAddressSpace() const { return DestAddrSpace; }
1303
1304 static bool classof(const SDNode *N) {
1305 return N->getOpcode() == ISD::ADDRSPACECAST;
1306 }
1307};
1308
1309/// This is an abstract virtual class for memory operations.
1310class MemSDNode : public SDNode {
1311private:
1312 // VT of in-memory value.
1313 EVT MemoryVT;
1314
1315protected:
1316 /// Memory reference information.
1318
1319public:
1320 MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs,
1321 EVT memvt, MachineMemOperand *MMO);
1322
1323 bool readMem() const { return MMO->isLoad(); }
1324 bool writeMem() const { return MMO->isStore(); }
1325
1326 /// Returns alignment and volatility of the memory access
1328 Align getAlign() const { return MMO->getAlign(); }
1329
1330 /// Return the SubclassData value, without HasDebugValue. This contains an
1331 /// encoding of the volatile flag, as well as bits used by subclasses. This
1332 /// function should only be used to compute a FoldingSetNodeID value.
1333 /// The HasDebugValue bit is masked out because CSE map needs to match
1334 /// nodes with debug info with nodes without debug info. Same is about
1335 /// isDivergent bit.
1336 unsigned getRawSubclassData() const {
1337 uint16_t Data;
1338 union {
1339 char RawSDNodeBits[sizeof(uint16_t)];
1341 };
1342 memcpy(&RawSDNodeBits, &this->RawSDNodeBits, sizeof(this->RawSDNodeBits));
1343 SDNodeBits.HasDebugValue = 0;
1344 SDNodeBits.IsDivergent = false;
1345 memcpy(&Data, &RawSDNodeBits, sizeof(RawSDNodeBits));
1346 return Data;
1347 }
1348
1349 bool isVolatile() const { return MemSDNodeBits.IsVolatile; }
1350 bool isNonTemporal() const { return MemSDNodeBits.IsNonTemporal; }
1351 bool isDereferenceable() const { return MemSDNodeBits.IsDereferenceable; }
1352 bool isInvariant() const { return MemSDNodeBits.IsInvariant; }
1353
1354 // Returns the offset from the location of the access.
1355 int64_t getSrcValueOffset() const { return MMO->getOffset(); }
1356
1357 /// Returns the AA info that describes the dereference.
1358 AAMDNodes getAAInfo() const { return MMO->getAAInfo(); }
1359
1360 /// Returns the Ranges that describes the dereference.
1361 const MDNode *getRanges() const { return MMO->getRanges(); }
1362
1363 /// Returns the synchronization scope ID for this memory operation.
1365
1366 /// Return the atomic ordering requirements for this memory operation. For
1367 /// cmpxchg atomic operations, return the atomic ordering requirements when
1368 /// store occurs.
1370 return MMO->getSuccessOrdering();
1371 }
1372
1373 /// Return a single atomic ordering that is at least as strong as both the
1374 /// success and failure orderings for an atomic operation. (For operations
1375 /// other than cmpxchg, this is equivalent to getSuccessOrdering().)
1377
1378 /// Return true if the memory operation ordering is Unordered or higher.
1379 bool isAtomic() const { return MMO->isAtomic(); }
1380
1381 /// Returns true if the memory operation doesn't imply any ordering
1382 /// constraints on surrounding memory operations beyond the normal memory
1383 /// aliasing rules.
1384 bool isUnordered() const { return MMO->isUnordered(); }
1385
1386 /// Returns true if the memory operation is neither atomic or volatile.
1387 bool isSimple() const { return !isAtomic() && !isVolatile(); }
1388
1389 /// Return the type of the in-memory value.
1390 EVT getMemoryVT() const { return MemoryVT; }
1391
1392 /// Return a MachineMemOperand object describing the memory
1393 /// reference performed by operation.
1395
1397 return MMO->getPointerInfo();
1398 }
1399
1400 /// Return the address space for the associated pointer
1401 unsigned getAddressSpace() const {
1402 return getPointerInfo().getAddrSpace();
1403 }
1404
1405 /// Update this MemSDNode's MachineMemOperand information
1406 /// to reflect the alignment of NewMMO, if it has a greater alignment.
1407 /// This must only be used when the new alignment applies to all users of
1408 /// this MachineMemOperand.
1410 MMO->refineAlignment(NewMMO);
1411 }
1412
1413 const SDValue &getChain() const { return getOperand(0); }
1414
1415 const SDValue &getBasePtr() const {
1416 switch (getOpcode()) {
1417 case ISD::STORE:
1418 case ISD::ATOMIC_STORE:
1419 case ISD::VP_STORE:
1420 case ISD::MSTORE:
1421 case ISD::VP_SCATTER:
1422 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
1423 return getOperand(2);
1424 case ISD::MGATHER:
1425 case ISD::MSCATTER:
1427 return getOperand(3);
1428 default:
1429 return getOperand(1);
1430 }
1431 }
1432
1433 // Methods to support isa and dyn_cast
1434 static bool classof(const SDNode *N) {
1435 // For some targets, we lower some target intrinsics to a MemIntrinsicNode
1436 // with either an intrinsic or a target opcode.
1437 switch (N->getOpcode()) {
1438 case ISD::LOAD:
1439 case ISD::STORE:
1440 case ISD::PREFETCH:
1443 case ISD::ATOMIC_SWAP:
1461 case ISD::ATOMIC_LOAD:
1462 case ISD::ATOMIC_STORE:
1463 case ISD::MLOAD:
1464 case ISD::MSTORE:
1465 case ISD::MGATHER:
1466 case ISD::MSCATTER:
1467 case ISD::VP_LOAD:
1468 case ISD::VP_STORE:
1469 case ISD::VP_GATHER:
1470 case ISD::VP_SCATTER:
1471 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
1472 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
1473 case ISD::GET_FPENV_MEM:
1474 case ISD::SET_FPENV_MEM:
1476 return true;
1477 default:
1478 return N->isMemIntrinsic() || N->isTargetMemoryOpcode();
1479 }
1480 }
1481};
1482
1483/// This is an SDNode representing atomic operations.
1484class AtomicSDNode : public MemSDNode {
1485public:
1486 AtomicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTL,
1487 EVT MemVT, MachineMemOperand *MMO)
1488 : MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) {
1489 assert(((Opc != ISD::ATOMIC_LOAD && Opc != ISD::ATOMIC_STORE) ||
1490 MMO->isAtomic()) && "then why are we using an AtomicSDNode?");
1491 }
1492
1494 assert(getOpcode() == ISD::ATOMIC_LOAD && "Only used for atomic loads.");
1495 LoadSDNodeBits.ExtTy = ETy;
1496 }
1497
1499 assert(getOpcode() == ISD::ATOMIC_LOAD && "Only used for atomic loads.");
1500 return static_cast<ISD::LoadExtType>(LoadSDNodeBits.ExtTy);
1501 }
1502
1503 const SDValue &getBasePtr() const {
1504 return getOpcode() == ISD::ATOMIC_STORE ? getOperand(2) : getOperand(1);
1505 }
1506 const SDValue &getVal() const {
1507 return getOpcode() == ISD::ATOMIC_STORE ? getOperand(1) : getOperand(2);
1508 }
1509
1510 /// Returns true if this SDNode represents cmpxchg atomic operation, false
1511 /// otherwise.
1512 bool isCompareAndSwap() const {
1513 unsigned Op = getOpcode();
1514 return Op == ISD::ATOMIC_CMP_SWAP ||
1516 }
1517
1518 /// For cmpxchg atomic operations, return the atomic ordering requirements
1519 /// when store does not occur.
1521 assert(isCompareAndSwap() && "Must be cmpxchg operation");
1522 return MMO->getFailureOrdering();
1523 }
1524
1525 // Methods to support isa and dyn_cast
1526 static bool classof(const SDNode *N) {
1527 return N->getOpcode() == ISD::ATOMIC_CMP_SWAP ||
1528 N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS ||
1529 N->getOpcode() == ISD::ATOMIC_SWAP ||
1530 N->getOpcode() == ISD::ATOMIC_LOAD_ADD ||
1531 N->getOpcode() == ISD::ATOMIC_LOAD_SUB ||
1532 N->getOpcode() == ISD::ATOMIC_LOAD_AND ||
1533 N->getOpcode() == ISD::ATOMIC_LOAD_CLR ||
1534 N->getOpcode() == ISD::ATOMIC_LOAD_OR ||
1535 N->getOpcode() == ISD::ATOMIC_LOAD_XOR ||
1536 N->getOpcode() == ISD::ATOMIC_LOAD_NAND ||
1537 N->getOpcode() == ISD::ATOMIC_LOAD_MIN ||
1538 N->getOpcode() == ISD::ATOMIC_LOAD_MAX ||
1539 N->getOpcode() == ISD::ATOMIC_LOAD_UMIN ||
1540 N->getOpcode() == ISD::ATOMIC_LOAD_UMAX ||
1541 N->getOpcode() == ISD::ATOMIC_LOAD_FADD ||
1542 N->getOpcode() == ISD::ATOMIC_LOAD_FSUB ||
1543 N->getOpcode() == ISD::ATOMIC_LOAD_FMAX ||
1544 N->getOpcode() == ISD::ATOMIC_LOAD_FMIN ||
1545 N->getOpcode() == ISD::ATOMIC_LOAD_UINC_WRAP ||
1546 N->getOpcode() == ISD::ATOMIC_LOAD_UDEC_WRAP ||
1547 N->getOpcode() == ISD::ATOMIC_LOAD ||
1548 N->getOpcode() == ISD::ATOMIC_STORE;
1549 }
1550};
1551
1552/// This SDNode is used for target intrinsics that touch
1553/// memory and need an associated MachineMemOperand. Its opcode may be
1554/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, PREFETCH, or a target-specific opcode
1555/// with a value not less than FIRST_TARGET_MEMORY_OPCODE.
1557public:
1558 MemIntrinsicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl,
1559 SDVTList VTs, EVT MemoryVT, MachineMemOperand *MMO)
1560 : MemSDNode(Opc, Order, dl, VTs, MemoryVT, MMO) {
1561 SDNodeBits.IsMemIntrinsic = true;
1562 }
1563
1564 // Methods to support isa and dyn_cast
1565 static bool classof(const SDNode *N) {
1566 // We lower some target intrinsics to their target opcode
1567 // early a node with a target opcode can be of this class
1568 return N->isMemIntrinsic() ||
1569 N->getOpcode() == ISD::PREFETCH ||
1570 N->isTargetMemoryOpcode();
1571 }
1572};
1573
1574/// This SDNode is used to implement the code generator
1575/// support for the llvm IR shufflevector instruction. It combines elements
1576/// from two input vectors into a new input vector, with the selection and
1577/// ordering of elements determined by an array of integers, referred to as
1578/// the shuffle mask. For input vectors of width N, mask indices of 0..N-1
1579/// refer to elements from the LHS input, and indices from N to 2N-1 the RHS.
1580/// An index of -1 is treated as undef, such that the code generator may put
1581/// any value in the corresponding element of the result.
1583 // The memory for Mask is owned by the SelectionDAG's OperandAllocator, and
1584 // is freed when the SelectionDAG object is destroyed.
1585 const int *Mask;
1586
1587protected:
1588 friend class SelectionDAG;
1589
1590 ShuffleVectorSDNode(SDVTList VTs, unsigned Order, const DebugLoc &dl,
1591 const int *M)
1592 : SDNode(ISD::VECTOR_SHUFFLE, Order, dl, VTs), Mask(M) {}
1593
1594public:
1596 EVT VT = getValueType(0);
1597 return ArrayRef(Mask, VT.getVectorNumElements());
1598 }
1599
1600 int getMaskElt(unsigned Idx) const {
1601 assert(Idx < getValueType(0).getVectorNumElements() && "Idx out of range!");
1602 return Mask[Idx];
1603 }
1604
1605 bool isSplat() const { return isSplatMask(Mask, getValueType(0)); }
1606
1607 int getSplatIndex() const {
1608 assert(isSplat() && "Cannot get splat index for non-splat!");
1609 EVT VT = getValueType(0);
1610 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1611 if (Mask[i] >= 0)
1612 return Mask[i];
1613
1614 // We can choose any index value here and be correct because all elements
1615 // are undefined. Return 0 for better potential for callers to simplify.
1616 return 0;
1617 }
1618
1619 static bool isSplatMask(const int *Mask, EVT VT);
1620
1621 /// Change values in a shuffle permute mask assuming
1622 /// the two vector operands have swapped position.
1624 unsigned NumElems = Mask.size();
1625 for (unsigned i = 0; i != NumElems; ++i) {
1626 int idx = Mask[i];
1627 if (idx < 0)
1628 continue;
1629 else if (idx < (int)NumElems)
1630 Mask[i] = idx + NumElems;
1631 else
1632 Mask[i] = idx - NumElems;
1633 }
1634 }
1635
1636 static bool classof(const SDNode *N) {
1637 return N->getOpcode() == ISD::VECTOR_SHUFFLE;
1638 }
1639};
1640
1641class ConstantSDNode : public SDNode {
1642 friend class SelectionDAG;
1643
1644 const ConstantInt *Value;
1645
1646 ConstantSDNode(bool isTarget, bool isOpaque, const ConstantInt *val,
1647 SDVTList VTs)
1648 : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, 0, DebugLoc(),
1649 VTs),
1650 Value(val) {
1651 ConstantSDNodeBits.IsOpaque = isOpaque;
1652 }
1653
1654public:
1655 const ConstantInt *getConstantIntValue() const { return Value; }
1656 const APInt &getAPIntValue() const { return Value->getValue(); }
1657 uint64_t getZExtValue() const { return Value->getZExtValue(); }
1658 int64_t getSExtValue() const { return Value->getSExtValue(); }
1660 return Value->getLimitedValue(Limit);
1661 }
1662 MaybeAlign getMaybeAlignValue() const { return Value->getMaybeAlignValue(); }
1663 Align getAlignValue() const { return Value->getAlignValue(); }
1664
1665 bool isOne() const { return Value->isOne(); }
1666 bool isZero() const { return Value->isZero(); }
1667 bool isAllOnes() const { return Value->isMinusOne(); }
1668 bool isMaxSignedValue() const { return Value->isMaxValue(true); }
1669 bool isMinSignedValue() const { return Value->isMinValue(true); }
1670
1671 bool isOpaque() const { return ConstantSDNodeBits.IsOpaque; }
1672
1673 static bool classof(const SDNode *N) {
1674 return N->getOpcode() == ISD::Constant ||
1675 N->getOpcode() == ISD::TargetConstant;
1676 }
1677};
1678
1680 return cast<ConstantSDNode>(getOperand(Num))->getZExtValue();
1681}
1682
1684 return cast<ConstantSDNode>(this)->getZExtValue();
1685}
1686
1687const APInt &SDNode::getConstantOperandAPInt(unsigned Num) const {
1688 return cast<ConstantSDNode>(getOperand(Num))->getAPIntValue();
1689}
1690
1692 return cast<ConstantSDNode>(this)->getAPIntValue();
1693}
1694
1695class ConstantFPSDNode : public SDNode {
1696 friend class SelectionDAG;
1697
1698 const ConstantFP *Value;
1699
1700 ConstantFPSDNode(bool isTarget, const ConstantFP *val, SDVTList VTs)
1701 : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP, 0,
1702 DebugLoc(), VTs),
1703 Value(val) {}
1704
1705public:
1706 const APFloat& getValueAPF() const { return Value->getValueAPF(); }
1707 const ConstantFP *getConstantFPValue() const { return Value; }
1708
1709 /// Return true if the value is positive or negative zero.
1710 bool isZero() const { return Value->isZero(); }
1711
1712 /// Return true if the value is a NaN.
1713 bool isNaN() const { return Value->isNaN(); }
1714
1715 /// Return true if the value is an infinity
1716 bool isInfinity() const { return Value->isInfinity(); }
1717
1718 /// Return true if the value is negative.
1719 bool isNegative() const { return Value->isNegative(); }
1720
1721 /// We don't rely on operator== working on double values, as
1722 /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
1723 /// As such, this method can be used to do an exact bit-for-bit comparison of
1724 /// two floating point values.
1725
1726 /// We leave the version with the double argument here because it's just so
1727 /// convenient to write "2.0" and the like. Without this function we'd
1728 /// have to duplicate its logic everywhere it's called.
1729 bool isExactlyValue(double V) const {
1730 return Value->getValueAPF().isExactlyValue(V);
1731 }
1732 bool isExactlyValue(const APFloat& V) const;
1733
1734 static bool isValueValidForType(EVT VT, const APFloat& Val);
1735
1736 static bool classof(const SDNode *N) {
1737 return N->getOpcode() == ISD::ConstantFP ||
1738 N->getOpcode() == ISD::TargetConstantFP;
1739 }
1740};
1741
1742/// Returns true if \p V is a constant integer zero.
1743bool isNullConstant(SDValue V);
1744
1745/// Returns true if \p V is an FP constant with a value of positive zero.
1746bool isNullFPConstant(SDValue V);
1747
1748/// Returns true if \p V is an integer constant with all bits set.
1749bool isAllOnesConstant(SDValue V);
1750
1751/// Returns true if \p V is a constant integer one.
1752bool isOneConstant(SDValue V);
1753
1754/// Returns true if \p V is a constant min signed integer value.
1755bool isMinSignedConstant(SDValue V);
1756
1757/// Returns true if \p V is a neutral element of Opc with Flags.
1758/// When OperandNo is 0, it checks that V is a left identity. Otherwise, it
1759/// checks that V is a right identity.
1760bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V,
1761 unsigned OperandNo);
1762
1763/// Return the non-bitcasted source operand of \p V if it exists.
1764/// If \p V is not a bitcasted value, it is returned as-is.
1765SDValue peekThroughBitcasts(SDValue V);
1766
1767/// Return the non-bitcasted and one-use source operand of \p V if it exists.
1768/// If \p V is not a bitcasted one-use value, it is returned as-is.
1769SDValue peekThroughOneUseBitcasts(SDValue V);
1770
1771/// Return the non-extracted vector source operand of \p V if it exists.
1772/// If \p V is not an extracted subvector, it is returned as-is.
1773SDValue peekThroughExtractSubvectors(SDValue V);
1774
1775/// Return the non-truncated source operand of \p V if it exists.
1776/// If \p V is not a truncation, it is returned as-is.
1777SDValue peekThroughTruncates(SDValue V);
1778
1779/// Returns true if \p V is a bitwise not operation. Assumes that an all ones
1780/// constant is canonicalized to be operand 1.
1781bool isBitwiseNot(SDValue V, bool AllowUndefs = false);
1782
1783/// If \p V is a bitwise not, returns the inverted operand. Otherwise returns
1784/// an empty SDValue. Only bits set in \p Mask are required to be inverted,
1785/// other bits may be arbitrary.
1786SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs);
1787
1788/// Returns the SDNode if it is a constant splat BuildVector or constant int.
1789ConstantSDNode *isConstOrConstSplat(SDValue N, bool AllowUndefs = false,
1790 bool AllowTruncation = false);
1791
1792/// Returns the SDNode if it is a demanded constant splat BuildVector or
1793/// constant int.
1794ConstantSDNode *isConstOrConstSplat(SDValue N, const APInt &DemandedElts,
1795 bool AllowUndefs = false,
1796 bool AllowTruncation = false);
1797
1798/// Returns the SDNode if it is a constant splat BuildVector or constant float.
1799ConstantFPSDNode *isConstOrConstSplatFP(SDValue N, bool AllowUndefs = false);
1800
1801/// Returns the SDNode if it is a demanded constant splat BuildVector or
1802/// constant float.
1803ConstantFPSDNode *isConstOrConstSplatFP(SDValue N, const APInt &DemandedElts,
1804 bool AllowUndefs = false);
1805
1806/// Return true if the value is a constant 0 integer or a splatted vector of
1807/// a constant 0 integer (with no undefs by default).
1808/// Build vector implicit truncation is not an issue for null values.
1809bool isNullOrNullSplat(SDValue V, bool AllowUndefs = false);
1810
1811/// Return true if the value is a constant 1 integer or a splatted vector of a
1812/// constant 1 integer (with no undefs).
1813/// Build vector implicit truncation is allowed, but the truncated bits need to
1814/// be zero.
1815bool isOneOrOneSplat(SDValue V, bool AllowUndefs = false);
1816
1817/// Return true if the value is a constant -1 integer or a splatted vector of a
1818/// constant -1 integer (with no undefs).
1819/// Does not permit build vector implicit truncation.
1820bool isAllOnesOrAllOnesSplat(SDValue V, bool AllowUndefs = false);
1821
1822/// Return true if \p V is either a integer or FP constant.
1824 return isa<ConstantSDNode>(V) || isa<ConstantFPSDNode>(V);
1825}
1826
1828 friend class SelectionDAG;
1829
1830 const GlobalValue *TheGlobal;
1831 int64_t Offset;
1832 unsigned TargetFlags;
1833
1834 GlobalAddressSDNode(unsigned Opc, unsigned Order, const DebugLoc &DL,
1835 const GlobalValue *GA, SDVTList VTs, int64_t o,
1836 unsigned TF)
1837 : SDNode(Opc, Order, DL, VTs), TheGlobal(GA), Offset(o), TargetFlags(TF) {
1838 }
1839
1840public:
1841 const GlobalValue *getGlobal() const { return TheGlobal; }
1842 int64_t getOffset() const { return Offset; }
1843 unsigned getTargetFlags() const { return TargetFlags; }
1844 // Return the address space this GlobalAddress belongs to.
1845 unsigned getAddressSpace() const;
1846
1847 static bool classof(const SDNode *N) {
1848 return N->getOpcode() == ISD::GlobalAddress ||
1849 N->getOpcode() == ISD::TargetGlobalAddress ||
1850 N->getOpcode() == ISD::GlobalTLSAddress ||
1851 N->getOpcode() == ISD::TargetGlobalTLSAddress;
1852 }
1853};
1854
1855class FrameIndexSDNode : public SDNode {
1856 friend class SelectionDAG;
1857
1858 int FI;
1859
1860 FrameIndexSDNode(int fi, SDVTList VTs, bool isTarg)
1861 : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex, 0, DebugLoc(),
1862 VTs),
1863 FI(fi) {}
1864
1865public:
1866 int getIndex() const { return FI; }
1867
1868 static bool classof(const SDNode *N) {
1869 return N->getOpcode() == ISD::FrameIndex ||
1870 N->getOpcode() == ISD::TargetFrameIndex;
1871 }
1872};
1873
1874/// This SDNode is used for LIFETIME_START/LIFETIME_END values, which indicate
1875/// the offet and size that are started/ended in the underlying FrameIndex.
1876class LifetimeSDNode : public SDNode {
1877 friend class SelectionDAG;
1878 int64_t Size;
1879 int64_t Offset; // -1 if offset is unknown.
1880
1881 LifetimeSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl,
1882 SDVTList VTs, int64_t Size, int64_t Offset)
1883 : SDNode(Opcode, Order, dl, VTs), Size(Size), Offset(Offset) {}
1884public:
1885 int64_t getFrameIndex() const {
1886 return cast<FrameIndexSDNode>(getOperand(1))->getIndex();
1887 }
1888
1889 bool hasOffset() const { return Offset >= 0; }
1890 int64_t getOffset() const {
1891 assert(hasOffset() && "offset is unknown");
1892 return Offset;
1893 }
1894 int64_t getSize() const {
1895 assert(hasOffset() && "offset is unknown");
1896 return Size;
1897 }
1898
1899 // Methods to support isa and dyn_cast
1900 static bool classof(const SDNode *N) {
1901 return N->getOpcode() == ISD::LIFETIME_START ||
1902 N->getOpcode() == ISD::LIFETIME_END;
1903 }
1904};
1905
1906/// This SDNode is used for PSEUDO_PROBE values, which are the function guid and
1907/// the index of the basic block being probed. A pseudo probe serves as a place
1908/// holder and will be removed at the end of compilation. It does not have any
1909/// operand because we do not want the instruction selection to deal with any.
1911 friend class SelectionDAG;
1912 uint64_t Guid;
1914 uint32_t Attributes;
1915
1916 PseudoProbeSDNode(unsigned Opcode, unsigned Order, const DebugLoc &Dl,
1917 SDVTList VTs, uint64_t Guid, uint64_t Index, uint32_t Attr)
1918 : SDNode(Opcode, Order, Dl, VTs), Guid(Guid), Index(Index),
1919 Attributes(Attr) {}
1920
1921public:
1922 uint64_t getGuid() const { return Guid; }
1923 uint64_t getIndex() const { return Index; }
1925
1926 // Methods to support isa and dyn_cast
1927 static bool classof(const SDNode *N) {
1928 return N->getOpcode() == ISD::PSEUDO_PROBE;
1929 }
1930};
1931
1932class JumpTableSDNode : public SDNode {
1933 friend class SelectionDAG;
1934
1935 int JTI;
1936 unsigned TargetFlags;
1937
1938 JumpTableSDNode(int jti, SDVTList VTs, bool isTarg, unsigned TF)
1939 : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, 0, DebugLoc(),
1940 VTs),
1941 JTI(jti), TargetFlags(TF) {}
1942
1943public:
1944 int getIndex() const { return JTI; }
1945 unsigned getTargetFlags() const { return TargetFlags; }
1946
1947 static bool classof(const SDNode *N) {
1948 return N->getOpcode() == ISD::JumpTable ||
1949 N->getOpcode() == ISD::TargetJumpTable;
1950 }
1951};
1952
1954 friend class SelectionDAG;
1955
1956 union {
1959 } Val;
1960 int Offset; // It's a MachineConstantPoolValue if top bit is set.
1961 Align Alignment; // Minimum alignment requirement of CP.
1962 unsigned TargetFlags;
1963
1964 ConstantPoolSDNode(bool isTarget, const Constant *c, SDVTList VTs, int o,
1965 Align Alignment, unsigned TF)
1966 : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0,
1967 DebugLoc(), VTs),
1968 Offset(o), Alignment(Alignment), TargetFlags(TF) {
1969 assert(Offset >= 0 && "Offset is too large");
1970 Val.ConstVal = c;
1971 }
1972
1973 ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v, SDVTList VTs,
1974 int o, Align Alignment, unsigned TF)
1975 : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0,
1976 DebugLoc(), VTs),
1977 Offset(o), Alignment(Alignment), TargetFlags(TF) {
1978 assert(Offset >= 0 && "Offset is too large");
1979 Val.MachineCPVal = v;
1980 Offset |= 1 << (sizeof(unsigned)*CHAR_BIT-1);
1981 }
1982
1983public:
1985 return Offset < 0;
1986 }
1987
1988 const Constant *getConstVal() const {
1989 assert(!isMachineConstantPoolEntry() && "Wrong constantpool type");
1990 return Val.ConstVal;
1991 }
1992
1994 assert(isMachineConstantPoolEntry() && "Wrong constantpool type");
1995 return Val.MachineCPVal;
1996 }
1997
1998 int getOffset() const {
1999 return Offset & ~(1 << (sizeof(unsigned)*CHAR_BIT-1));
2000 }
2001
2002 // Return the alignment of this constant pool object, which is either 0 (for
2003 // default alignment) or the desired value.
2004 Align getAlign() const { return Alignment; }
2005 unsigned getTargetFlags() const { return TargetFlags; }
2006
2007 Type *getType() const;
2008
2009 static bool classof(const SDNode *N) {
2010 return N->getOpcode() == ISD::ConstantPool ||
2011 N->getOpcode() == ISD::TargetConstantPool;
2012 }
2013};
2014
2015/// Completely target-dependent object reference.
2017 friend class SelectionDAG;
2018
2019 unsigned TargetFlags;
2020 int Index;
2021 int64_t Offset;
2022
2023public:
2024 TargetIndexSDNode(int Idx, SDVTList VTs, int64_t Ofs, unsigned TF)
2025 : SDNode(ISD::TargetIndex, 0, DebugLoc(), VTs), TargetFlags(TF),
2026 Index(Idx), Offset(Ofs) {}
2027
2028 unsigned getTargetFlags() const { return TargetFlags; }
2029 int getIndex() const { return Index; }
2030 int64_t getOffset() const { return Offset; }
2031
2032 static bool classof(const SDNode *N) {
2033 return N->getOpcode() == ISD::TargetIndex;
2034 }
2035};
2036
2037class BasicBlockSDNode : public SDNode {
2038 friend class SelectionDAG;
2039
2041
2042 /// Debug info is meaningful and potentially useful here, but we create
2043 /// blocks out of order when they're jumped to, which makes it a bit
2044 /// harder. Let's see if we need it first.
2045 explicit BasicBlockSDNode(MachineBasicBlock *mbb)
2046 : SDNode(ISD::BasicBlock, 0, DebugLoc(), getSDVTList(MVT::Other)), MBB(mbb)
2047 {}
2048
2049public:
2051
2052 static bool classof(const SDNode *N) {
2053 return N->getOpcode() == ISD::BasicBlock;
2054 }
2055};
2056
2057/// A "pseudo-class" with methods for operating on BUILD_VECTORs.
2059public:
2060 // These are constructed as SDNodes and then cast to BuildVectorSDNodes.
2061 explicit BuildVectorSDNode() = delete;
2062
2063 /// Check if this is a constant splat, and if so, find the
2064 /// smallest element size that splats the vector. If MinSplatBits is
2065 /// nonzero, the element size must be at least that large. Note that the
2066 /// splat element may be the entire vector (i.e., a one element vector).
2067 /// Returns the splat element value in SplatValue. Any undefined bits in
2068 /// that value are zero, and the corresponding bits in the SplatUndef mask
2069 /// are set. The SplatBitSize value is set to the splat element size in
2070 /// bits. HasAnyUndefs is set to true if any bits in the vector are
2071 /// undefined. isBigEndian describes the endianness of the target.
2072 bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
2073 unsigned &SplatBitSize, bool &HasAnyUndefs,
2074 unsigned MinSplatBits = 0,
2075 bool isBigEndian = false) const;
2076
2077 /// Returns the demanded splatted value or a null value if this is not a
2078 /// splat.
2079 ///
2080 /// The DemandedElts mask indicates the elements that must be in the splat.
2081 /// If passed a non-null UndefElements bitvector, it will resize it to match
2082 /// the vector width and set the bits where elements are undef.
2083 SDValue getSplatValue(const APInt &DemandedElts,
2084 BitVector *UndefElements = nullptr) const;
2085
2086 /// Returns the splatted value or a null value if this is not a splat.
2087 ///
2088 /// If passed a non-null UndefElements bitvector, it will resize it to match
2089 /// the vector width and set the bits where elements are undef.
2090 SDValue getSplatValue(BitVector *UndefElements = nullptr) const;
2091
2092 /// Find the shortest repeating sequence of values in the build vector.
2093 ///
2094 /// e.g. { u, X, u, X, u, u, X, u } -> { X }
2095 /// { X, Y, u, Y, u, u, X, u } -> { X, Y }
2096 ///
2097 /// Currently this must be a power-of-2 build vector.
2098 /// The DemandedElts mask indicates the elements that must be present,
2099 /// undemanded elements in Sequence may be null (SDValue()). If passed a
2100 /// non-null UndefElements bitvector, it will resize it to match the original
2101 /// vector width and set the bits where elements are undef. If result is
2102 /// false, Sequence will be empty.
2103 bool getRepeatedSequence(const APInt &DemandedElts,
2104 SmallVectorImpl<SDValue> &Sequence,
2105 BitVector *UndefElements = nullptr) const;
2106
2107 /// Find the shortest repeating sequence of values in the build vector.
2108 ///
2109 /// e.g. { u, X, u, X, u, u, X, u } -> { X }
2110 /// { X, Y, u, Y, u, u, X, u } -> { X, Y }
2111 ///
2112 /// Currently this must be a power-of-2 build vector.
2113 /// If passed a non-null UndefElements bitvector, it will resize it to match
2114 /// the original vector width and set the bits where elements are undef.
2115 /// If result is false, Sequence will be empty.
2117 BitVector *UndefElements = nullptr) const;
2118
2119 /// Returns the demanded splatted constant or null if this is not a constant
2120 /// splat.
2121 ///
2122 /// The DemandedElts mask indicates the elements that must be in the splat.
2123 /// If passed a non-null UndefElements bitvector, it will resize it to match
2124 /// the vector width and set the bits where elements are undef.
2126 getConstantSplatNode(const APInt &DemandedElts,
2127 BitVector *UndefElements = nullptr) const;
2128
2129 /// Returns the splatted constant or null if this is not a constant
2130 /// splat.
2131 ///
2132 /// If passed a non-null UndefElements bitvector, it will resize it to match
2133 /// the vector width and set the bits where elements are undef.
2135 getConstantSplatNode(BitVector *UndefElements = nullptr) const;
2136
2137 /// Returns the demanded splatted constant FP or null if this is not a
2138 /// constant FP splat.
2139 ///
2140 /// The DemandedElts mask indicates the elements that must be in the splat.
2141 /// If passed a non-null UndefElements bitvector, it will resize it to match
2142 /// the vector width and set the bits where elements are undef.
2144 getConstantFPSplatNode(const APInt &DemandedElts,
2145 BitVector *UndefElements = nullptr) const;
2146
2147 /// Returns the splatted constant FP or null if this is not a constant
2148 /// FP splat.
2149 ///
2150 /// If passed a non-null UndefElements bitvector, it will resize it to match
2151 /// the vector width and set the bits where elements are undef.
2153 getConstantFPSplatNode(BitVector *UndefElements = nullptr) const;
2154
2155 /// If this is a constant FP splat and the splatted constant FP is an
2156 /// exact power or 2, return the log base 2 integer value. Otherwise,
2157 /// return -1.
2158 ///
2159 /// The BitWidth specifies the necessary bit precision.
2160 int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements,
2161 uint32_t BitWidth) const;
2162
2163 /// Extract the raw bit data from a build vector of Undef, Constant or
2164 /// ConstantFP node elements. Each raw bit element will be \p
2165 /// DstEltSizeInBits wide, undef elements are treated as zero, and entirely
2166 /// undefined elements are flagged in \p UndefElements.
2167 bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits,
2168 SmallVectorImpl<APInt> &RawBitElements,
2169 BitVector &UndefElements) const;
2170
2171 bool isConstant() const;
2172
2173 /// If this BuildVector is constant and represents the numerical series
2174 /// "<a, a+n, a+2n, a+3n, ...>" where a is integer and n is a non-zero integer,
2175 /// the value "<a,n>" is returned.
2176 std::optional<std::pair<APInt, APInt>> isConstantSequence() const;
2177
2178 /// Recast bit data \p SrcBitElements to \p DstEltSizeInBits wide elements.
2179 /// Undef elements are treated as zero, and entirely undefined elements are
2180 /// flagged in \p DstUndefElements.
2181 static void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits,
2182 SmallVectorImpl<APInt> &DstBitElements,
2183 ArrayRef<APInt> SrcBitElements,
2184 BitVector &DstUndefElements,
2185 const BitVector &SrcUndefElements);
2186
2187 static bool classof(const SDNode *N) {
2188 return N->getOpcode() == ISD::BUILD_VECTOR;
2189 }
2190};
2191
2192/// An SDNode that holds an arbitrary LLVM IR Value. This is
2193/// used when the SelectionDAG needs to make a simple reference to something
2194/// in the LLVM IR representation.
2195///
2196class SrcValueSDNode : public SDNode {
2197 friend class SelectionDAG;
2198
2199 const Value *V;
2200
2201 /// Create a SrcValue for a general value.
2202 explicit SrcValueSDNode(const Value *v)
2203 : SDNode(ISD::SRCVALUE, 0, DebugLoc(), getSDVTList(MVT::Other)), V(v) {}
2204
2205public:
2206 /// Return the contained Value.
2207 const Value *getValue() const { return V; }
2208
2209 static bool classof(const SDNode *N) {
2210 return N->getOpcode() == ISD::SRCVALUE;
2211 }
2212};
2213
2214class MDNodeSDNode : public SDNode {
2215 friend class SelectionDAG;
2216
2217 const MDNode *MD;
2218
2219 explicit MDNodeSDNode(const MDNode *md)
2220 : SDNode(ISD::MDNODE_SDNODE, 0, DebugLoc(), getSDVTList(MVT::Other)), MD(md)
2221 {}
2222
2223public:
2224 const MDNode *getMD() const { return MD; }
2225
2226 static bool classof(const SDNode *N) {
2227 return N->getOpcode() == ISD::MDNODE_SDNODE;
2228 }
2229};
2230
2231class RegisterSDNode : public SDNode {
2232 friend class SelectionDAG;
2233
2234 Register Reg;
2235
2237 : SDNode(ISD::Register, 0, DebugLoc(), VTs), Reg(reg) {}
2238
2239public:
2240 Register getReg() const { return Reg; }
2241
2242 static bool classof(const SDNode *N) {
2243 return N->getOpcode() == ISD::Register;
2244 }
2245};
2246
2248 friend class SelectionDAG;
2249
2250 // The memory for RegMask is not owned by the node.
2251 const uint32_t *RegMask;
2252
2253 RegisterMaskSDNode(const uint32_t *mask)
2254 : SDNode(ISD::RegisterMask, 0, DebugLoc(), getSDVTList(MVT::Untyped)),
2255 RegMask(mask) {}
2256
2257public:
2258 const uint32_t *getRegMask() const { return RegMask; }
2259
2260 static bool classof(const SDNode *N) {
2261 return N->getOpcode() == ISD::RegisterMask;
2262 }
2263};
2264
2266 friend class SelectionDAG;
2267
2268 const BlockAddress *BA;
2269 int64_t Offset;
2270 unsigned TargetFlags;
2271
2272 BlockAddressSDNode(unsigned NodeTy, SDVTList VTs, const BlockAddress *ba,
2273 int64_t o, unsigned Flags)
2274 : SDNode(NodeTy, 0, DebugLoc(), VTs), BA(ba), Offset(o),
2275 TargetFlags(Flags) {}
2276
2277public:
2278 const BlockAddress *getBlockAddress() const { return BA; }
2279 int64_t getOffset() const { return Offset; }
2280 unsigned getTargetFlags() const { return TargetFlags; }
2281
2282 static bool classof(const SDNode *N) {
2283 return N->getOpcode() == ISD::BlockAddress ||
2284 N->getOpcode() == ISD::TargetBlockAddress;
2285 }
2286};
2287
2288class LabelSDNode : public SDNode {
2289 friend class SelectionDAG;
2290
2291 MCSymbol *Label;
2292
2293 LabelSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl, MCSymbol *L)
2294 : SDNode(Opcode, Order, dl, getSDVTList(MVT::Other)), Label(L) {
2295 assert(LabelSDNode::classof(this) && "not a label opcode");
2296 }
2297
2298public:
2299 MCSymbol *getLabel() const { return Label; }
2300
2301 static bool classof(const SDNode *N) {
2302 return N->getOpcode() == ISD::EH_LABEL ||
2303 N->getOpcode() == ISD::ANNOTATION_LABEL;
2304 }
2305};
2306
2308 friend class SelectionDAG;
2309
2310 const char *Symbol;
2311 unsigned TargetFlags;
2312
2313 ExternalSymbolSDNode(bool isTarget, const char *Sym, unsigned TF,
2314 SDVTList VTs)
2315 : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol, 0,
2316 DebugLoc(), VTs),
2317 Symbol(Sym), TargetFlags(TF) {}
2318
2319public:
2320 const char *getSymbol() const { return Symbol; }
2321 unsigned getTargetFlags() const { return TargetFlags; }
2322
2323 static bool classof(const SDNode *N) {
2324 return N->getOpcode() == ISD::ExternalSymbol ||
2325 N->getOpcode() == ISD::TargetExternalSymbol;
2326 }
2327};
2328
2329class MCSymbolSDNode : public SDNode {
2330 friend class SelectionDAG;
2331
2332 MCSymbol *Symbol;
2333
2334 MCSymbolSDNode(MCSymbol *Symbol, SDVTList VTs)
2335 : SDNode(ISD::MCSymbol, 0, DebugLoc(), VTs), Symbol(Symbol) {}
2336
2337public:
2338 MCSymbol *getMCSymbol() const { return Symbol; }
2339
2340 static bool classof(const SDNode *N) {
2341 return N->getOpcode() == ISD::MCSymbol;
2342 }
2343};
2344
2345class CondCodeSDNode : public SDNode {
2346 friend class SelectionDAG;
2347
2348 ISD::CondCode Condition;
2349
2351 : SDNode(ISD::CONDCODE, 0, DebugLoc(), getSDVTList(MVT::Other)),
2352 Condition(Cond) {}
2353
2354public:
2355 ISD::CondCode get() const { return Condition; }
2356
2357 static bool classof(const SDNode *N) {
2358 return N->getOpcode() == ISD::CONDCODE;
2359 }
2360};
2361
2362/// This class is used to represent EVT's, which are used
2363/// to parameterize some operations.
2364class VTSDNode : public SDNode {
2365 friend class SelectionDAG;
2366
2367 EVT ValueType;
2368
2369 explicit VTSDNode(EVT VT)
2370 : SDNode(ISD::VALUETYPE, 0, DebugLoc(), getSDVTList(MVT::Other)),
2371 ValueType(VT) {}
2372
2373public:
2374 EVT getVT() const { return ValueType; }
2375
2376 static bool classof(const SDNode *N) {
2377 return N->getOpcode() == ISD::VALUETYPE;
2378 }
2379};
2380
2381/// Base class for LoadSDNode and StoreSDNode
2382class LSBaseSDNode : public MemSDNode {
2383public:
2384 LSBaseSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &dl,
2385 SDVTList VTs, ISD::MemIndexedMode AM, EVT MemVT,
2387 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) {
2388 LSBaseSDNodeBits.AddressingMode = AM;
2389 assert(getAddressingMode() == AM && "Value truncated");
2390 }
2391
2392 const SDValue &getOffset() const {
2393 return getOperand(getOpcode() == ISD::LOAD ? 2 : 3);
2394 }
2395
2396 /// Return the addressing mode for this load or store:
2397 /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
2399 return static_cast<ISD::MemIndexedMode>(LSBaseSDNodeBits.AddressingMode);
2400 }
2401
2402 /// Return true if this is a pre/post inc/dec load/store.
2403 bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
2404
2405 /// Return true if this is NOT a pre/post inc/dec load/store.
2406 bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
2407
2408 static bool classof(const SDNode *N) {
2409 return N->getOpcode() == ISD::LOAD ||
2410 N->getOpcode() == ISD::STORE;
2411 }
2412};
2413
2414/// This class is used to represent ISD::LOAD nodes.
2415class LoadSDNode : public LSBaseSDNode {
2416 friend class SelectionDAG;
2417
2418 LoadSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2421 : LSBaseSDNode(ISD::LOAD, Order, dl, VTs, AM, MemVT, MMO) {
2422 LoadSDNodeBits.ExtTy = ETy;
2423 assert(readMem() && "Load MachineMemOperand is not a load!");
2424 assert(!writeMem() && "Load MachineMemOperand is a store!");
2425 }
2426
2427public:
2428 /// Return whether this is a plain node,
2429 /// or one of the varieties of value-extending loads.
2431 return static_cast<ISD::LoadExtType>(LoadSDNodeBits.ExtTy);
2432 }
2433
2434 const SDValue &getBasePtr() const { return getOperand(1); }
2435 const SDValue &getOffset() const { return getOperand(2); }
2436
2437 static bool classof(const SDNode *N) {
2438 return N->getOpcode() == ISD::LOAD;
2439 }
2440};
2441
2442/// This class is used to represent ISD::STORE nodes.
2444 friend class SelectionDAG;
2445
2446 StoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2447 ISD::MemIndexedMode AM, bool isTrunc, EVT MemVT,
2449 : LSBaseSDNode(ISD::STORE, Order, dl, VTs, AM, MemVT, MMO) {
2450 StoreSDNodeBits.IsTruncating = isTrunc;
2451 assert(!readMem() && "Store MachineMemOperand is a load!");
2452 assert(writeMem() && "Store MachineMemOperand is not a store!");
2453 }
2454
2455public:
2456 /// Return true if the op does a truncation before store.
2457 /// For integers this is the same as doing a TRUNCATE and storing the result.
2458 /// For floats, it is the same as doing an FP_ROUND and storing the result.
2459 bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
2460 void setTruncatingStore(bool Truncating) {
2461 StoreSDNodeBits.IsTruncating = Truncating;
2462 }
2463
2464 const SDValue &getValue() const { return getOperand(1); }
2465 const SDValue &getBasePtr() const { return getOperand(2); }
2466 const SDValue &getOffset() const { return getOperand(3); }
2467
2468 static bool classof(const SDNode *N) {
2469 return N->getOpcode() == ISD::STORE;
2470 }
2471};
2472
2473/// This base class is used to represent VP_LOAD, VP_STORE,
2474/// EXPERIMENTAL_VP_STRIDED_LOAD and EXPERIMENTAL_VP_STRIDED_STORE nodes
2476public:
2477 friend class SelectionDAG;
2478
2479 VPBaseLoadStoreSDNode(ISD::NodeType NodeTy, unsigned Order,
2480 const DebugLoc &DL, SDVTList VTs,
2481 ISD::MemIndexedMode AM, EVT MemVT,
2483 : MemSDNode(NodeTy, Order, DL, VTs, MemVT, MMO) {
2484 LSBaseSDNodeBits.AddressingMode = AM;
2485 assert(getAddressingMode() == AM && "Value truncated");
2486 }
2487
2488 // VPStridedStoreSDNode (Chain, Data, Ptr, Offset, Stride, Mask, EVL)
2489 // VPStoreSDNode (Chain, Data, Ptr, Offset, Mask, EVL)
2490 // VPStridedLoadSDNode (Chain, Ptr, Offset, Stride, Mask, EVL)
2491 // VPLoadSDNode (Chain, Ptr, Offset, Mask, EVL)
2492 // Mask is a vector of i1 elements;
2493 // the type of EVL is TLI.getVPExplicitVectorLengthTy().
2494 const SDValue &getOffset() const {
2495 return getOperand((getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD ||
2496 getOpcode() == ISD::VP_LOAD)
2497 ? 2
2498 : 3);
2499 }
2500 const SDValue &getBasePtr() const {
2501 return getOperand((getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD ||
2502 getOpcode() == ISD::VP_LOAD)
2503 ? 1
2504 : 2);
2505 }
2506 const SDValue &getMask() const {
2507 switch (getOpcode()) {
2508 default:
2509 llvm_unreachable("Invalid opcode");
2510 case ISD::VP_LOAD:
2511 return getOperand(3);
2512 case ISD::VP_STORE:
2513 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2514 return getOperand(4);
2515 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2516 return getOperand(5);
2517 }
2518 }
2519 const SDValue &getVectorLength() const {
2520 switch (getOpcode()) {
2521 default:
2522 llvm_unreachable("Invalid opcode");
2523 case ISD::VP_LOAD:
2524 return getOperand(4);
2525 case ISD::VP_STORE:
2526 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2527 return getOperand(5);
2528 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2529 return getOperand(6);
2530 }
2531 }
2532
2533 /// Return the addressing mode for this load or store:
2534 /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
2536 return static_cast<ISD::MemIndexedMode>(LSBaseSDNodeBits.AddressingMode);
2537 }
2538
2539 /// Return true if this is a pre/post inc/dec load/store.
2540 bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
2541
2542 /// Return true if this is NOT a pre/post inc/dec load/store.
2543 bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
2544
2545 static bool classof(const SDNode *N) {
2546 return N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD ||
2547 N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE ||
2548 N->getOpcode() == ISD::VP_LOAD || N->getOpcode() == ISD::VP_STORE;
2549 }
2550};
2551
2552/// This class is used to represent a VP_LOAD node
2554public:
2555 friend class SelectionDAG;
2556
2557 VPLoadSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2558 ISD::MemIndexedMode AM, ISD::LoadExtType ETy, bool isExpanding,
2559 EVT MemVT, MachineMemOperand *MMO)
2560 : VPBaseLoadStoreSDNode(ISD::VP_LOAD, Order, dl, VTs, AM, MemVT, MMO) {
2561 LoadSDNodeBits.ExtTy = ETy;
2562 LoadSDNodeBits.IsExpanding = isExpanding;
2563 }
2564
2566 return static_cast<ISD::LoadExtType>(LoadSDNodeBits.ExtTy);
2567 }
2568
2569 const SDValue &getBasePtr() const { return getOperand(1); }
2570 const SDValue &getOffset() const { return getOperand(2); }
2571 const SDValue &getMask() const { return getOperand(3); }
2572 const SDValue &getVectorLength() const { return getOperand(4); }
2573
2574 static bool classof(const SDNode *N) {
2575 return N->getOpcode() == ISD::VP_LOAD;
2576 }
2577 bool isExpandingLoad() const { return LoadSDNodeBits.IsExpanding; }
2578};
2579
2580/// This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
2582public:
2583 friend class SelectionDAG;
2584
2585 VPStridedLoadSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs,
2587 bool IsExpanding, EVT MemVT, MachineMemOperand *MMO)
2588 : VPBaseLoadStoreSDNode(ISD::EXPERIMENTAL_VP_STRIDED_LOAD, Order, DL, VTs,
2589 AM, MemVT, MMO) {
2590 LoadSDNodeBits.ExtTy = ETy;
2591 LoadSDNodeBits.IsExpanding = IsExpanding;
2592 }
2593
2595 return static_cast<ISD::LoadExtType>(LoadSDNodeBits.ExtTy);
2596 }
2597
2598 const SDValue &getBasePtr() const { return getOperand(1); }
2599 const SDValue &getOffset() const { return getOperand(2); }
2600 const SDValue &getStride() const { return getOperand(3); }
2601 const SDValue &getMask() const { return getOperand(4); }
2602 const SDValue &getVectorLength() const { return getOperand(5); }
2603
2604 static bool classof(const SDNode *N) {
2605 return N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD;
2606 }
2607 bool isExpandingLoad() const { return LoadSDNodeBits.IsExpanding; }
2608};
2609
2610/// This class is used to represent a VP_STORE node
2612public:
2613 friend class SelectionDAG;
2614
2615 VPStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2616 ISD::MemIndexedMode AM, bool isTrunc, bool isCompressing,
2617 EVT MemVT, MachineMemOperand *MMO)
2618 : VPBaseLoadStoreSDNode(ISD::VP_STORE, Order, dl, VTs, AM, MemVT, MMO) {
2619 StoreSDNodeBits.IsTruncating = isTrunc;
2620 StoreSDNodeBits.IsCompressing = isCompressing;
2621 }
2622
2623 /// Return true if this is a truncating store.
2624 /// For integers this is the same as doing a TRUNCATE and storing the result.
2625 /// For floats, it is the same as doing an FP_ROUND and storing the result.
2626 bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
2627
2628 /// Returns true if the op does a compression to the vector before storing.
2629 /// The node contiguously stores the active elements (integers or floats)
2630 /// in src (those with their respective bit set in writemask k) to unaligned
2631 /// memory at base_addr.
2632 bool isCompressingStore() const { return StoreSDNodeBits.IsCompressing; }
2633
2634 const SDValue &getValue() const { return getOperand(1); }
2635 const SDValue &getBasePtr() const { return getOperand(2); }
2636 const SDValue &getOffset() const { return getOperand(3); }
2637 const SDValue &getMask() const { return getOperand(4); }
2638 const SDValue &getVectorLength() const { return getOperand(5); }
2639
2640 static bool classof(const SDNode *N) {
2641 return N->getOpcode() == ISD::VP_STORE;
2642 }
2643};
2644
2645/// This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
2647public:
2648 friend class SelectionDAG;
2649
2650 VPStridedStoreSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs,
2651 ISD::MemIndexedMode AM, bool IsTrunc, bool IsCompressing,
2652 EVT MemVT, MachineMemOperand *MMO)
2653 : VPBaseLoadStoreSDNode(ISD::EXPERIMENTAL_VP_STRIDED_STORE, Order, DL,
2654 VTs, AM, MemVT, MMO) {
2655 StoreSDNodeBits.IsTruncating = IsTrunc;
2656 StoreSDNodeBits.IsCompressing = IsCompressing;
2657 }
2658
2659 /// Return true if this is a truncating store.
2660 /// For integers this is the same as doing a TRUNCATE and storing the result.
2661 /// For floats, it is the same as doing an FP_ROUND and storing the result.
2662 bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
2663
2664 /// Returns true if the op does a compression to the vector before storing.
2665 /// The node contiguously stores the active elements (integers or floats)
2666 /// in src (those with their respective bit set in writemask k) to unaligned
2667 /// memory at base_addr.
2668 bool isCompressingStore() const { return StoreSDNodeBits.IsCompressing; }
2669
2670 const SDValue &getValue() const { return getOperand(1); }
2671 const SDValue &getBasePtr() const { return getOperand(2); }
2672 const SDValue &getOffset() const { return getOperand(3); }
2673 const SDValue &getStride() const { return getOperand(4); }
2674 const SDValue &getMask() const { return getOperand(5); }
2675 const SDValue &getVectorLength() const { return getOperand(6); }
2676
2677 static bool classof(const SDNode *N) {
2678 return N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE;
2679 }
2680};
2681
2682/// This base class is used to represent MLOAD and MSTORE nodes
2684public:
2685 friend class SelectionDAG;
2686
2687 MaskedLoadStoreSDNode(ISD::NodeType NodeTy, unsigned Order,
2688 const DebugLoc &dl, SDVTList VTs,
2689 ISD::MemIndexedMode AM, EVT MemVT,
2691 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) {
2692 LSBaseSDNodeBits.AddressingMode = AM;
2693 assert(getAddressingMode() == AM && "Value truncated");
2694 }
2695
2696 // MaskedLoadSDNode (Chain, ptr, offset, mask, passthru)
2697 // MaskedStoreSDNode (Chain, data, ptr, offset, mask)
2698 // Mask is a vector of i1 elements
2699 const SDValue &getOffset() const {
2700 return getOperand(getOpcode() == ISD::MLOAD ? 2 : 3);
2701 }
2702 const SDValue &getMask() const {
2703 return getOperand(getOpcode() == ISD::MLOAD ? 3 : 4);
2704 }
2705
2706 /// Return the addressing mode for this load or store:
2707 /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
2709 return static_cast<ISD::MemIndexedMode>(LSBaseSDNodeBits.AddressingMode);
2710 }
2711
2712 /// Return true if this is a pre/post inc/dec load/store.
2713 bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
2714
2715 /// Return true if this is NOT a pre/post inc/dec load/store.
2716 bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
2717
2718 static bool classof(const SDNode *N) {
2719 return N->getOpcode() == ISD::MLOAD ||
2720 N->getOpcode() == ISD::MSTORE;
2721 }
2722};
2723
2724/// This class is used to represent an MLOAD node
2726public:
2727 friend class SelectionDAG;
2728
2729 MaskedLoadSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2731 bool IsExpanding, EVT MemVT, MachineMemOperand *MMO)
2732 : MaskedLoadStoreSDNode(ISD::MLOAD, Order, dl, VTs, AM, MemVT, MMO) {
2733 LoadSDNodeBits.ExtTy = ETy;
2734 LoadSDNodeBits.IsExpanding = IsExpanding;
2735 }
2736
2738 return static_cast<ISD::LoadExtType>(LoadSDNodeBits.ExtTy);
2739 }
2740
2741 const SDValue &getBasePtr() const { return getOperand(1); }
2742 const SDValue &getOffset() const { return getOperand(2); }
2743 const SDValue &getMask() const { return getOperand(3); }
2744 const SDValue &getPassThru() const { return getOperand(4); }
2745
2746 static bool classof(const SDNode *N) {
2747 return N->getOpcode() == ISD::MLOAD;
2748 }
2749
2750 bool isExpandingLoad() const { return LoadSDNodeBits.IsExpanding; }
2751};
2752
2753/// This class is used to represent an MSTORE node
2755public:
2756 friend class SelectionDAG;
2757
2758 MaskedStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2759 ISD::MemIndexedMode AM, bool isTrunc, bool isCompressing,
2760 EVT MemVT, MachineMemOperand *MMO)
2761 : MaskedLoadStoreSDNode(ISD::MSTORE, Order, dl, VTs, AM, MemVT, MMO) {
2762 StoreSDNodeBits.IsTruncating = isTrunc;
2763 StoreSDNodeBits.IsCompressing = isCompressing;
2764 }
2765
2766 /// Return true if the op does a truncation before store.
2767 /// For integers this is the same as doing a TRUNCATE and storing the result.
2768 /// For floats, it is the same as doing an FP_ROUND and storing the result.
2769 bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
2770
2771 /// Returns true if the op does a compression to the vector before storing.
2772 /// The node contiguously stores the active elements (integers or floats)
2773 /// in src (those with their respective bit set in writemask k) to unaligned
2774 /// memory at base_addr.
2775 bool isCompressingStore() const { return StoreSDNodeBits.IsCompressing; }
2776
2777 const SDValue &getValue() const { return getOperand(1); }
2778 const SDValue &getBasePtr() const { return getOperand(2); }
2779 const SDValue &getOffset() const { return getOperand(3); }
2780 const SDValue &getMask() const { return getOperand(4); }
2781
2782 static bool classof(const SDNode *N) {
2783 return N->getOpcode() == ISD::MSTORE;
2784 }
2785};
2786
2787/// This is a base class used to represent
2788/// VP_GATHER and VP_SCATTER nodes
2789///
2791public:
2792 friend class SelectionDAG;
2793
2794 VPGatherScatterSDNode(ISD::NodeType NodeTy, unsigned Order,
2795 const DebugLoc &dl, SDVTList VTs, EVT MemVT,
2797 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) {
2798 LSBaseSDNodeBits.AddressingMode = IndexType;
2799 assert(getIndexType() == IndexType && "Value truncated");
2800 }
2801
2802 /// How is Index applied to BasePtr when computing addresses.
2804 return static_cast<ISD::MemIndexType>(LSBaseSDNodeBits.AddressingMode);
2805 }
2806 bool isIndexScaled() const {
2807 return !cast<ConstantSDNode>(getScale())->isOne();
2808 }
2809 bool isIndexSigned() const { return isIndexTypeSigned(getIndexType()); }
2810
2811 // In the both nodes address is Op1, mask is Op2:
2812 // VPGatherSDNode (Chain, base, index, scale, mask, vlen)
2813 // VPScatterSDNode (Chain, value, base, index, scale, mask, vlen)
2814 // Mask is a vector of i1 elements
2815 const SDValue &getBasePtr() const {
2816 return getOperand((getOpcode() == ISD::VP_GATHER) ? 1 : 2);
2817 }
2818 const SDValue &getIndex() const {
2819 return getOperand((getOpcode() == ISD::VP_GATHER) ? 2 : 3);
2820 }
2821 const SDValue &getScale() const {
2822 return getOperand((getOpcode() == ISD::VP_GATHER) ? 3 : 4);
2823 }
2824 const SDValue &getMask() const {
2825 return getOperand((getOpcode() == ISD::VP_GATHER) ? 4 : 5);
2826 }
2827 const SDValue &getVectorLength() const {
2828 return getOperand((getOpcode() == ISD::VP_GATHER) ? 5 : 6);
2829 }
2830
2831 static bool classof(const SDNode *N) {
2832 return N->getOpcode() == ISD::VP_GATHER ||
2833 N->getOpcode() == ISD::VP_SCATTER;
2834 }
2835};
2836
2837/// This class is used to represent an VP_GATHER node
2838///
2840public:
2841 friend class SelectionDAG;
2842
2843 VPGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT,
2845 : VPGatherScatterSDNode(ISD::VP_GATHER, Order, dl, VTs, MemVT, MMO,
2846 IndexType) {}
2847
2848 static bool classof(const SDNode *N) {
2849 return N->getOpcode() == ISD::VP_GATHER;
2850 }
2851};
2852
2853/// This class is used to represent an VP_SCATTER node
2854///
2856public:
2857 friend class SelectionDAG;
2858
2859 VPScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT,
2861 : VPGatherScatterSDNode(ISD::VP_SCATTER, Order, dl, VTs, MemVT, MMO,
2862 IndexType) {}
2863
2864 const SDValue &getValue() const { return getOperand(1); }
2865
2866 static bool classof(const SDNode *N) {
2867 return N->getOpcode() == ISD::VP_SCATTER;
2868 }
2869};
2870
2871/// This is a base class used to represent
2872/// MGATHER and MSCATTER nodes
2873///
2875public:
2876 friend class SelectionDAG;
2877
2879 const DebugLoc &dl, SDVTList VTs, EVT MemVT,
2881 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) {
2882 LSBaseSDNodeBits.AddressingMode = IndexType;
2883 assert(getIndexType() == IndexType && "Value truncated");
2884 }
2885
2886 /// How is Index applied to BasePtr when computing addresses.
2888 return static_cast<ISD::MemIndexType>(LSBaseSDNodeBits.AddressingMode);
2889 }
2890 bool isIndexScaled() const {
2891 return !cast<ConstantSDNode>(getScale())->isOne();
2892 }
2893 bool isIndexSigned() const { return isIndexTypeSigned(getIndexType()); }
2894
2895 // In the both nodes address is Op1, mask is Op2:
2896 // MaskedGatherSDNode (Chain, passthru, mask, base, index, scale)
2897 // MaskedScatterSDNode (Chain, value, mask, base, index, scale)
2898 // Mask is a vector of i1 elements
2899 const SDValue &getBasePtr() const { return getOperand(3); }
2900 const SDValue &getIndex() const { return getOperand(4); }
2901 const SDValue &getMask() const { return getOperand(2); }
2902 const SDValue &getScale() const { return getOperand(5); }
2903
2904 static bool classof(const SDNode *N) {
2905 return N->getOpcode() == ISD::MGATHER ||
2906 N->getOpcode() == ISD::MSCATTER;
2907 }
2908};
2909
2910/// This class is used to represent an MGATHER node
2911///
2913public:
2914 friend class SelectionDAG;
2915
2916 MaskedGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2917 EVT MemVT, MachineMemOperand *MMO,
2918 ISD::MemIndexType IndexType, ISD::LoadExtType ETy)
2919 : MaskedGatherScatterSDNode(ISD::MGATHER, Order, dl, VTs, MemVT, MMO,
2920 IndexType) {
2921 LoadSDNodeBits.ExtTy = ETy;
2922 }
2923
2924 const SDValue &getPassThru() const { return getOperand(1); }
2925
2927 return ISD::LoadExtType(LoadSDNodeBits.ExtTy);
2928 }
2929
2930 static bool classof(const SDNode *N) {
2931 return N->getOpcode() == ISD::MGATHER;
2932 }
2933};
2934
2935/// This class is used to represent an MSCATTER node
2936///
2938public:
2939 friend class SelectionDAG;
2940
2941 MaskedScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
2942 EVT MemVT, MachineMemOperand *MMO,
2943 ISD::MemIndexType IndexType, bool IsTrunc)
2944 : MaskedGatherScatterSDNode(ISD::MSCATTER, Order, dl, VTs, MemVT, MMO,
2945 IndexType) {
2946 StoreSDNodeBits.IsTruncating = IsTrunc;
2947 }
2948
2949 /// Return true if the op does a truncation before store.
2950 /// For integers this is the same as doing a TRUNCATE and storing the result.
2951 /// For floats, it is the same as doing an FP_ROUND and storing the result.
2952 bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
2953
2954 const SDValue &getValue() const { return getOperand(1); }
2955
2956 static bool classof(const SDNode *N) {
2957 return N->getOpcode() == ISD::MSCATTER;
2958 }
2959};
2960
2962public:
2963 friend class SelectionDAG;
2964
2965 MaskedHistogramSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs,
2966 EVT MemVT, MachineMemOperand *MMO,
2967 ISD::MemIndexType IndexType)
2968 : MemSDNode(ISD::EXPERIMENTAL_VECTOR_HISTOGRAM, Order, DL, VTs, MemVT,
2969 MMO) {
2970 LSBaseSDNodeBits.AddressingMode = IndexType;
2971 }
2972
2974 return static_cast<ISD::MemIndexType>(LSBaseSDNodeBits.AddressingMode);
2975 }
2976
2977 const SDValue &getBasePtr() const { return getOperand(3); }
2978 const SDValue &getIndex() const { return getOperand(4); }
2979 const SDValue &getMask() const { return getOperand(2); }
2980 const SDValue &getScale() const { return getOperand(5); }
2981 const SDValue &getInc() const { return getOperand(1); }
2982 const SDValue &getIntID() const { return getOperand(6); }
2983
2984 static bool classof(const SDNode *N) {
2985 return N->getOpcode() == ISD::EXPERIMENTAL_VECTOR_HISTOGRAM;
2986 }
2987};
2988
2990public:
2991 friend class SelectionDAG;
2992
2993 FPStateAccessSDNode(unsigned NodeTy, unsigned Order, const DebugLoc &dl,
2994 SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
2995 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) {
2996 assert((NodeTy == ISD::GET_FPENV_MEM || NodeTy == ISD::SET_FPENV_MEM) &&
2997 "Expected FP state access node");
2998 }
2999
3000 static bool classof(const SDNode *N) {
3001 return N->getOpcode() == ISD::GET_FPENV_MEM ||
3002 N->getOpcode() == ISD::SET_FPENV_MEM;
3003 }
3004};
3005
3006/// An SDNode that represents everything that will be needed
3007/// to construct a MachineInstr. These nodes are created during the
3008/// instruction selection proper phase.
3009///
3010/// Note that the only supported way to set the `memoperands` is by calling the
3011/// `SelectionDAG::setNodeMemRefs` function as the memory management happens
3012/// inside the DAG rather than in the node.
3013class MachineSDNode : public SDNode {
3014private:
3015 friend class SelectionDAG;
3016
3017 MachineSDNode(unsigned Opc, unsigned Order, const DebugLoc &DL, SDVTList VTs)
3018 : SDNode(Opc, Order, DL, VTs) {}
3019
3020 // We use a pointer union between a single `MachineMemOperand` pointer and
3021 // a pointer to an array of `MachineMemOperand` pointers. This is null when
3022 // the number of these is zero, the single pointer variant used when the
3023 // number is one, and the array is used for larger numbers.
3024 //
3025 // The array is allocated via the `SelectionDAG`'s allocator and so will
3026 // always live until the DAG is cleaned up and doesn't require ownership here.
3027 //
3028 // We can't use something simpler like `TinyPtrVector` here because `SDNode`
3029 // subclasses aren't managed in a conforming C++ manner. See the comments on
3030 // `SelectionDAG::MorphNodeTo` which details what all goes on, but the
3031 // constraint here is that these don't manage memory with their constructor or
3032 // destructor and can be initialized to a good state even if they start off
3033 // uninitialized.
3035
3036 // Note that this could be folded into the above `MemRefs` member if doing so
3037 // is advantageous at some point. We don't need to store this in most cases.
3038 // However, at the moment this doesn't appear to make the allocation any
3039 // smaller and makes the code somewhat simpler to read.
3040 int NumMemRefs = 0;
3041
3042public:
3044
3046 // Special case the common cases.
3047 if (NumMemRefs == 0)
3048 return {};
3049 if (NumMemRefs == 1)
3050 return ArrayRef(MemRefs.getAddrOfPtr1(), 1);
3051
3052 // Otherwise we have an actual array.
3053 return ArrayRef(cast<MachineMemOperand **>(MemRefs), NumMemRefs);
3054 }
3055 mmo_iterator memoperands_begin() const { return memoperands().begin(); }
3056 mmo_iterator memoperands_end() const { return memoperands().end(); }
3057 bool memoperands_empty() const { return memoperands().empty(); }
3058
3059 /// Clear out the memory reference descriptor list.
3061 MemRefs = nullptr;
3062 NumMemRefs = 0;
3063 }
3064
3065 static bool classof(const SDNode *N) {
3066 return N->isMachineOpcode();
3067 }
3068};
3069
3070/// An SDNode that records if a register contains a value that is guaranteed to
3071/// be aligned accordingly.
3073 Align Alignment;
3074
3075public:
3076 AssertAlignSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs, Align A)
3077 : SDNode(ISD::AssertAlign, Order, DL, VTs), Alignment(A) {}
3078
3079 Align getAlign() const { return Alignment; }
3080
3081 static bool classof(const SDNode *N) {
3082 return N->getOpcode() == ISD::AssertAlign;
3083 }
3084};
3085
3087 const SDNode *Node;
3088 unsigned Operand;
3089
3090 SDNodeIterator(const SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
3091
3092public:
3093 using iterator_category = std::forward_iterator_tag;
3095 using difference_type = std::ptrdiff_t;
3098
3099 bool operator==(const SDNodeIterator& x) const {
3100 return Operand == x.Operand;
3101 }
3102 bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
3103
3105 return Node->getOperand(Operand).getNode();
3106 }
3107 pointer operator->() const { return operator*(); }
3108
3109 SDNodeIterator& operator++() { // Preincrement
3110 ++Operand;
3111 return *this;
3112 }
3113 SDNodeIterator operator++(int) { // Postincrement
3114 SDNodeIterator tmp = *this; ++*this; return tmp;
3115 }
3117 assert(Node == Other.Node &&
3118 "Cannot compare iterators of two different nodes!");
3119 return Operand - Other.Operand;
3120 }
3121
3122 static SDNodeIterator begin(const SDNode *N) { return SDNodeIterator(N, 0); }
3123 static SDNodeIterator end (const SDNode *N) {
3124 return SDNodeIterator(N, N->getNumOperands());
3125 }
3126
3127 unsigned getOperand() const { return Operand; }
3128 const SDNode *getNode() const { return Node; }
3129};
3130
3131template <> struct GraphTraits<SDNode*> {
3132 using NodeRef = SDNode *;
3134
3135 static NodeRef getEntryNode(SDNode *N) { return N; }
3136
3138 return SDNodeIterator::begin(N);
3139 }
3140
3142 return SDNodeIterator::end(N);
3143 }
3144};
3145
3146/// A representation of the largest SDNode, for use in sizeof().
3147///
3148/// This needs to be a union because the largest node differs on 32 bit systems
3149/// with 4 and 8 byte pointer alignment, respectively.
3154
3155/// The SDNode class with the greatest alignment requirement.
3157
3158namespace ISD {
3159
3160 /// Returns true if the specified node is a non-extending and unindexed load.
3161 inline bool isNormalLoad(const SDNode *N) {
3162 auto *Ld = dyn_cast<LoadSDNode>(N);
3163 return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD &&
3164 Ld->getAddressingMode() == ISD::UNINDEXED;
3165 }
3166
3167 /// Returns true if the specified node is a non-extending load.
3168 inline bool isNON_EXTLoad(const SDNode *N) {
3169 auto *Ld = dyn_cast<LoadSDNode>(N);
3170 return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD;
3171 }
3172
3173 /// Returns true if the specified node is a EXTLOAD.
3174 inline bool isEXTLoad(const SDNode *N) {
3175 auto *Ld = dyn_cast<LoadSDNode>(N);
3176 return Ld && Ld->getExtensionType() == ISD::EXTLOAD;
3177 }
3178
3179 /// Returns true if the specified node is a SEXTLOAD.
3180 inline bool isSEXTLoad(const SDNode *N) {
3181 auto *Ld = dyn_cast<LoadSDNode>(N);
3182 return Ld && Ld->getExtensionType() == ISD::SEXTLOAD;
3183 }
3184
3185 /// Returns true if the specified node is a ZEXTLOAD.
3186 inline bool isZEXTLoad(const SDNode *N) {
3187 auto *Ld = dyn_cast<LoadSDNode>(N);
3188 return Ld && Ld->getExtensionType() == ISD::ZEXTLOAD;
3189 }
3190
3191 /// Returns true if the specified node is an unindexed load.
3192 inline bool isUNINDEXEDLoad(const SDNode *N) {
3193 auto *Ld = dyn_cast<LoadSDNode>(N);
3194 return Ld && Ld->getAddressingMode() == ISD::UNINDEXED;
3195 }
3196
3197 /// Returns true if the specified node is a non-truncating
3198 /// and unindexed store.
3199 inline bool isNormalStore(const SDNode *N) {
3200 auto *St = dyn_cast<StoreSDNode>(N);
3201 return St && !St->isTruncatingStore() &&
3202 St->getAddressingMode() == ISD::UNINDEXED;
3203 }
3204
3205 /// Returns true if the specified node is an unindexed store.
3206 inline bool isUNINDEXEDStore(const SDNode *N) {
3207 auto *St = dyn_cast<StoreSDNode>(N);
3208 return St && St->getAddressingMode() == ISD::UNINDEXED;
3209 }
3210
3211 /// Attempt to match a unary predicate against a scalar/splat constant or
3212 /// every element of a constant BUILD_VECTOR.
3213 /// If AllowUndef is true, then UNDEF elements will pass nullptr to Match.
3214 template <typename ConstNodeType>
3216 std::function<bool(ConstNodeType *)> Match,
3217 bool AllowUndefs = false);
3218
3219 /// Hook for matching ConstantSDNode predicate
3221 std::function<bool(ConstantSDNode *)> Match,
3222 bool AllowUndefs = false) {
3223 return matchUnaryPredicateImpl<ConstantSDNode>(Op, Match, AllowUndefs);
3224 }
3225
3226 /// Hook for matching ConstantFPSDNode predicate
3227 inline bool
3229 std::function<bool(ConstantFPSDNode *)> Match,
3230 bool AllowUndefs = false) {
3231 return matchUnaryPredicateImpl<ConstantFPSDNode>(Op, Match, AllowUndefs);
3232 }
3233
3234 /// Attempt to match a binary predicate against a pair of scalar/splat
3235 /// constants or every element of a pair of constant BUILD_VECTORs.
3236 /// If AllowUndef is true, then UNDEF elements will pass nullptr to Match.
3237 /// If AllowTypeMismatch is true then RetType + ArgTypes don't need to match.
3240 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
3241 bool AllowUndefs = false, bool AllowTypeMismatch = false);
3242
3243 /// Returns true if the specified value is the overflow result from one
3244 /// of the overflow intrinsic nodes.
3246 unsigned Opc = Op.getOpcode();
3247 return (Op.getResNo() == 1 &&
3248 (Opc == ISD::SADDO || Opc == ISD::UADDO || Opc == ISD::SSUBO ||
3249 Opc == ISD::USUBO || Opc == ISD::SMULO || Opc == ISD::UMULO));
3250 }
3251
3252} // end namespace ISD
3253
3254} // end namespace llvm
3255
3256#endif // LLVM_CODEGEN_SELECTIONDAGNODES_H
aarch64 promote const
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
AMDGPU Kernel Attributes
This file declares a class to represent arbitrary precision floating point values and provide a varie...
Atomic ordering constants.
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
RelocType Type
Definition: COFFYAML.cpp:391
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
uint32_t Index
uint64_t Size
uint64_t Offset
Definition: ELF_riscv.cpp:478
Symbol * Sym
Definition: ELF_riscv.cpp:479
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file defines a hash set that can be used to remove duplication of nodes in a graph.
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
#define op(i)
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
Load MIR Sample Profile
unsigned Reg
This file contains the declarations for metadata subclasses.
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
#define END_TWO_BYTE_PACK()
#define BEGIN_TWO_BYTE_PACK()
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
Value * RHS
Value * LHS
DEMANGLE_DUMP_METHOD void dump() const
Class for arbitrary precision integers.
Definition: APInt.h:76
unsigned getSrcAddressSpace() const
AddrSpaceCastSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, unsigned SrcAS, unsigned DestAS)
unsigned getDestAddressSpace() const
static bool classof(const SDNode *N)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
An SDNode that records if a register contains a value that is guaranteed to be aligned accordingly.
static bool classof(const SDNode *N)
AssertAlignSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs, Align A)
This is an SDNode representing atomic operations.
void setExtensionType(ISD::LoadExtType ETy)
static bool classof(const SDNode *N)
const SDValue & getBasePtr() const
ISD::LoadExtType getExtensionType() const
AtomicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTL, EVT MemVT, MachineMemOperand *MMO)
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
bool isCompareAndSwap() const
Returns true if this SDNode represents cmpxchg atomic operation, false otherwise.
const SDValue & getVal() const
MachineBasicBlock * getBasicBlock() const
static bool classof(const SDNode *N)
LLVM Basic Block Representation.
Definition: BasicBlock.h:60
static bool classof(const SDNode *N)
unsigned getTargetFlags() const
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition: Constants.h:889
A "pseudo-class" with methods for operating on BUILD_VECTORs.
bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
std::optional< std::pair< APInt, APInt > > isConstantSequence() const
If this BuildVector is constant and represents the numerical series "<a, a+n, a+2n,...
SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
static bool classof(const SDNode *N)
ISD::CondCode get() const
static bool classof(const SDNode *N)
static bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isNaN() const
Return true if the value is a NaN.
const ConstantFP * getConstantFPValue() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
bool isNegative() const
Return true if the value is negative.
bool isInfinity() const
Return true if the value is an infinity.
static bool classof(const SDNode *N)
bool isZero() const
Return true if the value is positive or negative zero.
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:268
This is the shared class of boolean and integer constants.
Definition: Constants.h:80
static bool classof(const SDNode *N)
MachineConstantPoolValue * getMachineCPVal() const
bool isMachineConstantPoolEntry() const
MachineConstantPoolValue * MachineCPVal
const Constant * getConstVal() const
unsigned getTargetFlags() const
MaybeAlign getMaybeAlignValue() const
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX)
const ConstantInt * getConstantIntValue() const
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
int64_t getSExtValue() const
static bool classof(const SDNode *N)
This is an important base class in LLVM.
Definition: Constant.h:41
This class represents an Operation in the Expression.
A debug info location.
Definition: DebugLoc.h:33
bool hasTrivialDestructor() const
Check whether this has a trivial destructor.
Definition: DebugLoc.h:69
const char * getSymbol() const
static bool classof(const SDNode *N)
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition: Operator.h:201
bool hasAllowReassoc() const
Test if this operation may be simplified with reassociative transforms.
Definition: Operator.h:283
bool hasNoNaNs() const
Test if this operation's arguments and results are assumed not-NaN.
Definition: Operator.h:288
bool hasAllowReciprocal() const
Test if this operation can use reciprocal multiply instead of division.
Definition: Operator.h:303
bool hasNoSignedZeros() const
Test if this operation can ignore the sign of zero.
Definition: Operator.h:298
bool hasAllowContract() const
Test if this operation can be floating-point contracted (FMA).
Definition: Operator.h:308
bool hasNoInfs() const
Test if this operation's arguments and results are assumed not-infinite.
Definition: Operator.h:293
bool hasApproxFunc() const
Test if this operation allows approximations of math library functions or intrinsics.
Definition: Operator.h:314
static bool classof(const SDNode *N)
FPStateAccessSDNode(unsigned NodeTy, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
Node - This class is used to maintain the singly linked bucket list in a folding set.
Definition: FoldingSet.h:137
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition: FoldingSet.h:319
static bool classof(const SDNode *N)
unsigned getAddressSpace() const
static bool classof(const SDNode *N)
const GlobalValue * getGlobal() const
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static bool classof(const SDNode *N)
unsigned getTargetFlags() const
Base class for LoadSDNode and StoreSDNode.
LSBaseSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, EVT MemVT, MachineMemOperand *MMO)
ISD::MemIndexedMode getAddressingMode() const
Return the addressing mode for this load or store: unindexed, pre-inc, pre-dec, post-inc,...
const SDValue & getOffset() const
bool isUnindexed() const
Return true if this is NOT a pre/post inc/dec load/store.
bool isIndexed() const
Return true if this is a pre/post inc/dec load/store.
static bool classof(const SDNode *N)
MCSymbol * getLabel() const
static bool classof(const SDNode *N)
This SDNode is used for LIFETIME_START/LIFETIME_END values, which indicate the offet and size that ar...
int64_t getFrameIndex() const
static bool classof(const SDNode *N)
int64_t getOffset() const
This class is used to represent ISD::LOAD nodes.
const SDValue & getBasePtr() const
const SDValue & getOffset() const
ISD::LoadExtType getExtensionType() const
Return whether this is a plain node, or one of the varieties of value-extending loads.
static bool classof(const SDNode *N)
MCSymbol * getMCSymbol() const
static bool classof(const SDNode *N)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:40
static bool classof(const SDNode *N)
const MDNode * getMD() const
Metadata node.
Definition: Metadata.h:1067
Machine Value Type.
Abstract base class for all machine specific constantpool value subclasses.
A description of a memory reference used in the backend.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
bool isUnordered() const
Returns true if this memory operation doesn't have any ordering constraints other than normal aliasin...
const MDNode * getRanges() const
Return the range tag for the memory reference.
bool isAtomic() const
Returns true if this operation has an atomic ordering requirement of unordered or higher,...
void refineAlignment(const MachineMemOperand *MMO)
Update this MachineMemOperand to reflect the alignment of MMO, if it has a greater alignment.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
AtomicOrdering getMergedOrdering() const
Return a single atomic ordering that is at least as strong as both the success and failure orderings ...
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
const MachinePointerInfo & getPointerInfo() const
Align getAlign() const
Return the minimum known alignment in bytes of the actual memory reference.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
An SDNode that represents everything that will be needed to construct a MachineInstr.
ArrayRef< MachineMemOperand * > memoperands() const
bool memoperands_empty() const
void clearMemRefs()
Clear out the memory reference descriptor list.
mmo_iterator memoperands_begin() const
static bool classof(const SDNode *N)
mmo_iterator memoperands_end() const
This class is used to represent an MGATHER node.
static bool classof(const SDNode *N)
MaskedGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ETy)
const SDValue & getPassThru() const
ISD::LoadExtType getExtensionType() const
This is a base class used to represent MGATHER and MSCATTER nodes.
const SDValue & getIndex() const
const SDValue & getScale() const
static bool classof(const SDNode *N)
MaskedGatherScatterSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
const SDValue & getBasePtr() const
const SDValue & getMask() const
ISD::MemIndexType getIndexType() const
How is Index applied to BasePtr when computing addresses.
const SDValue & getInc() const
MaskedHistogramSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
const SDValue & getScale() const
static bool classof(const SDNode *N)
const SDValue & getMask() const
const SDValue & getIntID() const
const SDValue & getIndex() const
const SDValue & getBasePtr() const
ISD::MemIndexType getIndexType() const
This class is used to represent an MLOAD node.
MaskedLoadSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, ISD::LoadExtType ETy, bool IsExpanding, EVT MemVT, MachineMemOperand *MMO)
const SDValue & getBasePtr() const
ISD::LoadExtType getExtensionType() const
const SDValue & getMask() const
const SDValue & getPassThru() const
static bool classof(const SDNode *N)
const SDValue & getOffset() const
This base class is used to represent MLOAD and MSTORE nodes.
const SDValue & getMask() const
MaskedLoadStoreSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, EVT MemVT, MachineMemOperand *MMO)
bool isIndexed() const
Return true if this is a pre/post inc/dec load/store.
static bool classof(const SDNode *N)
const SDValue & getOffset() const
bool isUnindexed() const
Return true if this is NOT a pre/post inc/dec load/store.
ISD::MemIndexedMode getAddressingMode() const
Return the addressing mode for this load or store: unindexed, pre-inc, pre-dec, post-inc,...
This class is used to represent an MSCATTER node.
MaskedScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTrunc)
const SDValue & getValue() const
static bool classof(const SDNode *N)
bool isTruncatingStore() const
Return true if the op does a truncation before store.
This class is used to represent an MSTORE node.
bool isCompressingStore() const
Returns true if the op does a compression to the vector before storing.
MaskedStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, bool isTrunc, bool isCompressing, EVT MemVT, MachineMemOperand *MMO)
const SDValue & getOffset() const
const SDValue & getBasePtr() const
const SDValue & getMask() const
const SDValue & getValue() const
bool isTruncatingStore() const
Return true if the op does a truncation before store.
static bool classof(const SDNode *N)
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
MemIntrinsicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemoryVT, MachineMemOperand *MMO)
static bool classof(const SDNode *N)
This is an abstract virtual class for memory operations.
MachineMemOperand * MMO
Memory reference information.
unsigned getAddressSpace() const
Return the address space for the associated pointer.
const MDNode * getRanges() const
Returns the Ranges that describes the dereference.
Align getAlign() const
bool isVolatile() const
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
Align getOriginalAlign() const
Returns alignment and volatility of the memory access.
int64_t getSrcValueOffset() const
bool readMem() const
bool isSimple() const
Returns true if the memory operation is neither atomic or volatile.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
MachineMemOperand * getMemOperand() const
Return a MachineMemOperand object describing the memory reference performed by operation.
const SDValue & getBasePtr() const
void refineAlignment(const MachineMemOperand *NewMMO)
Update this MemSDNode's MachineMemOperand information to reflect the alignment of NewMMO,...
const MachinePointerInfo & getPointerInfo() const
AtomicOrdering getMergedOrdering() const
Return a single atomic ordering that is at least as strong as both the success and failure orderings ...
const SDValue & getChain() const
bool isNonTemporal() const
bool isInvariant() const
bool writeMem() const
bool isDereferenceable() const
bool isUnordered() const
Returns true if the memory operation doesn't imply any ordering constraints on surrounding memory ope...
bool isAtomic() const
Return true if the memory operation ordering is Unordered or higher.
static bool classof(const SDNode *N)
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
First const * getAddrOfPtr1() const
If the union is set to the first pointer type get an address pointing to it.
Definition: PointerUnion.h:168
This SDNode is used for PSEUDO_PROBE values, which are the function guid and the index of the basic b...
static bool classof(const SDNode *N)
uint32_t getAttributes() const
const uint32_t * getRegMask() const
static bool classof(const SDNode *N)
static bool classof(const SDNode *N)
Register getReg() const
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
SDLoc(const SDValue V)
SDLoc()=default
SDLoc(const SDNode *N)
SDLoc(const Instruction *I, int Order)
pointer operator->() const
static SDNodeIterator end(const SDNode *N)
size_t operator-(SDNodeIterator Other) const
SDNodeIterator operator++(int)
std::ptrdiff_t difference_type
std::forward_iterator_tag iterator_category
unsigned getOperand() const
pointer operator*() const
SDNodeIterator & operator++()
bool operator==(const SDNodeIterator &x) const
const SDNode * getNode() const
static SDNodeIterator begin(const SDNode *N)
bool operator!=(const SDNodeIterator &x) const
This class provides iterator support for SDUse operands that use a specific SDNode.
bool operator!=(const use_iterator &x) const
use_iterator & operator=(const use_iterator &)=default
unsigned getOperandNo() const
Retrieve the operand # of this use in its user.
std::forward_iterator_tag iterator_category
bool operator==(const use_iterator &x) const
SDNode * operator*() const
Retrieve a pointer to the current user node.
bool atEnd() const
Return true if this iterator is at the end of uses list.
use_iterator(const use_iterator &I)=default
Represents one node in the SelectionDAG.
void setDebugLoc(DebugLoc dl)
Set source location info.
uint32_t getCFIType() const
static SDVTList getSDVTList(EVT VT)
void setIROrder(unsigned Order)
Set the node ordering.
bool isStrictFPOpcode()
Test if this node is a strict floating point pseudo-op.
ArrayRef< SDUse > ops() const
char RawSDNodeBits[sizeof(uint16_t)]
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
int getNodeId() const
Return the unique node id.
void dump() const
Dump this node, for debugging.
iterator_range< value_iterator > values() const
iterator_range< use_iterator > uses() const
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDNode * getGluedUser() const
If this node has a glue value with a user, return the user (there is at most one).
bool isDivergent() const
bool hasOneUse() const
Return true if there is exactly one use of this node.
bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
static const char * getIndexedModeName(ISD::MemIndexedMode AM)
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
LoadSDNodeBitfields LoadSDNodeBits
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
value_iterator value_end() const
void setHasDebugValue(bool b)
LSBaseSDNodeBitfields LSBaseSDNodeBits
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
bool getHasDebugValue() const
void dumpr() const
Dump (recursively) this node and its use-def subgraph.
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
std::string getOperationName(const SelectionDAG *G=nullptr) const
Return the opcode of this operation for printing.
void printrFull(raw_ostream &O, const SelectionDAG *G=nullptr) const
Print a SelectionDAG node and all children down to the leaves.
size_t use_size() const
Return the number of uses of this node.
void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
void printr(raw_ostream &OS, const SelectionDAG *G=nullptr) const
StoreSDNodeBitfields StoreSDNodeBits
TypeSize getValueSizeInBits(unsigned ResNo) const
Returns MVT::getSizeInBits(getValueType(ResNo)).
MVT getSimpleValueType(unsigned ResNo) const
Return the type of a specified result as a simple type.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
unsigned getMachineOpcode() const
This may only be called if isMachineOpcode returns true.
SDVTList getVTList() const
const SDValue & getOperand(unsigned Num) const
bool isMemIntrinsic() const
Test if this node is a memory intrinsic (with valid pointer information).
uint64_t getConstantOperandVal(unsigned Num) const
Helper method returns the integer value of a ConstantSDNode operand.
static bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
bool isTargetStrictFPOpcode() const
Test if this node has a target-specific opcode that may raise FP exceptions (in the <target>ISD names...
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
void print(raw_ostream &OS, const SelectionDAG *G=nullptr) const
const DebugLoc & getDebugLoc() const
Return the source location info.
void printrWithDepth(raw_ostream &O, const SelectionDAG *G=nullptr, unsigned depth=100) const
Print a SelectionDAG node and children up to depth "depth." The given SelectionDAG allows target-spec...
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
uint16_t PersistentId
Unique and persistent id per SDNode in the DAG.
void dumprWithDepth(const SelectionDAG *G=nullptr, unsigned depth=100) const
printrWithDepth to dbgs().
bool isPredecessorOf(const SDNode *N) const
Return true if this node is a predecessor of N.
bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
void addUse(SDUse &U)
This method should only be used by the SDUse class.
bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
void print_details(raw_ostream &OS, const SelectionDAG *G) const
bool isTargetMemoryOpcode() const
Test if this node has a target-specific memory-referencing opcode (in the <target>ISD namespace and g...
void setCFIType(uint32_t Type)
bool isUndef() const
Return true if the type of the node type undefined.
void print_types(raw_ostream &OS, const SelectionDAG *G) const
bool hasNUsesOfValue(unsigned NUses, unsigned Value) const
Return true if there are exactly NUSES uses of the indicated value.
bool isVPOpcode() const
Test if this node is a vector predication operation.
bool hasPoisonGeneratingFlags() const
void setFlags(SDNodeFlags NewFlags)
SDNode * getGluedNode() const
If this node has a glue operand, return the node to which the glue operand points.
bool isTargetOpcode() const
Test if this node has a target-specific opcode (in the <target>ISD namespace).
op_iterator op_end() const
ConstantSDNodeBitfields ConstantSDNodeBits
value_iterator value_begin() const
op_iterator op_begin() const
static use_iterator use_end()
void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
SDNodeBitfields SDNodeBits
Represents a use of a SDNode.
const SDNode * getUser() const
SDUse & operator=(const SDUse &)=delete
EVT getValueType() const
Convenience function for get().getValueType().
const SDValue & get() const
If implicit conversion to SDValue doesn't work, the get() method returns the SDValue.
SDUse * getNext() const
Get the next SDUse in the use list.
SDNode * getNode() const
Convenience function for get().getNode().
bool operator!=(const SDValue &V) const
Convenience function for get().operator!=.
SDUse()=default
SDUse(const SDUse &U)=delete
unsigned getResNo() const
Convenience function for get().getResNo().
bool operator==(const SDValue &V) const
Convenience function for get().operator==.
bool operator<(const SDValue &V) const
Convenience function for get().operator<.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node.
bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
SDValue()=default
bool isTargetMemoryOpcode() const
bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
bool operator!=(const SDValue &O) const
SDValue getValue(unsigned R) const
void dump() const
EVT getValueType() const
Return the ValueType of the referenced return value.
bool isTargetOpcode() const
bool isMachineOpcode() const
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const DebugLoc & getDebugLoc() const
SDNode * operator->() const
bool operator==(const SDValue &O) const
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
bool operator<(const SDValue &O) const
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
void setNode(SDNode *N)
set the SDNode
unsigned getMachineOpcode() const
unsigned getOpcode() const
void dumpr() const
unsigned getNumOperands() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:225
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
static bool isSplatMask(const int *Mask, EVT VT)
int getMaskElt(unsigned Idx) const
ShuffleVectorSDNode(SDVTList VTs, unsigned Order, const DebugLoc &dl, const int *M)
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static bool classof(const SDNode *N)
size_type size() const
Definition: SmallPtrSet.h:94
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:321
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:360
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:342
bool empty() const
Definition: SmallVector.h:94
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:696
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
An SDNode that holds an arbitrary LLVM IR Value.
const Value * getValue() const
Return the contained Value.
static bool classof(const SDNode *N)
This class is used to represent ISD::STORE nodes.
const SDValue & getBasePtr() const
const SDValue & getOffset() const
const SDValue & getValue() const
bool isTruncatingStore() const
Return true if the op does a truncation before store.
void setTruncatingStore(bool Truncating)
static bool classof(const SDNode *N)
Completely target-dependent object reference.
TargetIndexSDNode(int Idx, SDVTList VTs, int64_t Ofs, unsigned TF)
static bool classof(const SDNode *N)
unsigned getTargetFlags() const
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
This base class is used to represent VP_LOAD, VP_STORE, EXPERIMENTAL_VP_STRIDED_LOAD and EXPERIMENTAL...
const SDValue & getMask() const
static bool classof(const SDNode *N)
bool isIndexed() const
Return true if this is a pre/post inc/dec load/store.
VPBaseLoadStoreSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &DL, SDVTList VTs, ISD::MemIndexedMode AM, EVT MemVT, MachineMemOperand *MMO)
const SDValue & getOffset() const
ISD::MemIndexedMode getAddressingMode() const
Return the addressing mode for this load or store: unindexed, pre-inc, pre-dec, post-inc,...
const SDValue & getVectorLength() const
bool isUnindexed() const
Return true if this is NOT a pre/post inc/dec load/store.
const SDValue & getBasePtr() const
This class is used to represent an VP_GATHER node.
VPGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
static bool classof(const SDNode *N)
This is a base class used to represent VP_GATHER and VP_SCATTER nodes.
const SDValue & getScale() const
ISD::MemIndexType getIndexType() const
How is Index applied to BasePtr when computing addresses.
const SDValue & getVectorLength() const
const SDValue & getIndex() const
VPGatherScatterSDNode(ISD::NodeType NodeTy, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
const SDValue & getBasePtr() const
static bool classof(const SDNode *N)
const SDValue & getMask() const
This class is used to represent a VP_LOAD node.
const SDValue & getOffset() const
const SDValue & getVectorLength() const
ISD::LoadExtType getExtensionType() const
const SDValue & getMask() const
VPLoadSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, ISD::LoadExtType ETy, bool isExpanding, EVT MemVT, MachineMemOperand *MMO)
const SDValue & getBasePtr() const
static bool classof(const SDNode *N)
bool isExpandingLoad() const
This class is used to represent an VP_SCATTER node.
static bool classof(const SDNode *N)
VPScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
const SDValue & getValue() const
This class is used to represent a VP_STORE node.
const SDValue & getMask() const
VPStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs, ISD::MemIndexedMode AM, bool isTrunc, bool isCompressing, EVT MemVT, MachineMemOperand *MMO)
static bool classof(const SDNode *N)
const SDValue & getVectorLength() const
bool isCompressingStore() const
Returns true if the op does a compression to the vector before storing.
const SDValue & getOffset() const
bool isTruncatingStore() const
Return true if this is a truncating store.
const SDValue & getBasePtr() const
const SDValue & getValue() const
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
const SDValue & getMask() const
ISD::LoadExtType getExtensionType() const
const SDValue & getStride() const
const SDValue & getOffset() const
const SDValue & getVectorLength() const
static bool classof(const SDNode *N)
const SDValue & getBasePtr() const
VPStridedLoadSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs, ISD::MemIndexedMode AM, ISD::LoadExtType ETy, bool IsExpanding, EVT MemVT, MachineMemOperand *MMO)
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
const SDValue & getBasePtr() const
const SDValue & getMask() const
const SDValue & getValue() const
bool isTruncatingStore() const
Return true if this is a truncating store.
VPStridedStoreSDNode(unsigned Order, const DebugLoc &DL, SDVTList VTs, ISD::MemIndexedMode AM, bool IsTrunc, bool IsCompressing, EVT MemVT, MachineMemOperand *MMO)
const SDValue & getOffset() const
const SDValue & getVectorLength() const
static bool classof(const SDNode *N)
const SDValue & getStride() const
bool isCompressingStore() const
Returns true if the op does a compression to the vector before storing.
This class is used to represent EVT's, which are used to parameterize some operations.
static bool classof(const SDNode *N)
LLVM Value Representation.
Definition: Value.h:74
CRTP base class for adapting an iterator to a different type.
Definition: iterator.h:237
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define UINT64_MAX
Definition: DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition: ISDOpcodes.h:40
@ TargetConstantPool
Definition: ISDOpcodes.h:168
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
Definition: ISDOpcodes.h:1178
@ ATOMIC_LOAD_FMAX
Definition: ISDOpcodes.h:1283
@ ATOMIC_LOAD_NAND
Definition: ISDOpcodes.h:1276
@ TargetBlockAddress
Definition: ISDOpcodes.h:170
@ ConstantFP
Definition: ISDOpcodes.h:77
@ ATOMIC_LOAD_MAX
Definition: ISDOpcodes.h:1278
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) This corresponds to "store atomic" instruction.
Definition: ISDOpcodes.h:1248
@ ATOMIC_LOAD_UMIN
Definition: ISDOpcodes.h:1279
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
Definition: ISDOpcodes.h:1038
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:199
@ GlobalAddress
Definition: ISDOpcodes.h:78
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
Definition: ISDOpcodes.h:1261
@ ATOMIC_LOAD_OR
Definition: ISDOpcodes.h:1274
@ ATOMIC_LOAD_XOR
Definition: ISDOpcodes.h:1275
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:1412
@ ATOMIC_LOAD_FADD
Definition: ISDOpcodes.h:1281
@ GlobalTLSAddress
Definition: ISDOpcodes.h:79
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
Definition: ISDOpcodes.h:1174
@ FrameIndex
Definition: ISDOpcodes.h:80
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1109
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
Definition: ISDOpcodes.h:1115
@ TargetExternalSymbol
Definition: ISDOpcodes.h:169
@ TargetJumpTable
Definition: ISDOpcodes.h:167
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition: ISDOpcodes.h:177
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
Definition: ISDOpcodes.h:1228
@ ATOMIC_LOAD_FSUB
Definition: ISDOpcodes.h:1282
@ SSUBO
Same for subtraction.
Definition: ISDOpcodes.h:328
@ ATOMIC_LOAD_MIN
Definition: ISDOpcodes.h:1277
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
Definition: ISDOpcodes.h:1244
@ UNDEF
UNDEF - An undefined node.
Definition: ISDOpcodes.h:212
@ RegisterMask
Definition: ISDOpcodes.h:75
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition: ISDOpcodes.h:68
@ ATOMIC_LOAD_FMIN
Definition: ISDOpcodes.h:1284
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition: ISDOpcodes.h:324
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition: ISDOpcodes.h:164
@ STRICT_FP_TO_FP16
Definition: ISDOpcodes.h:917
@ STRICT_FP16_TO_FP
Definition: ISDOpcodes.h:916
@ ATOMIC_LOAD_CLR
Definition: ISDOpcodes.h:1273
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition: ISDOpcodes.h:601
@ ATOMIC_LOAD_AND
Definition: ISDOpcodes.h:1272
@ TargetConstantFP
Definition: ISDOpcodes.h:159
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
Definition: ISDOpcodes.h:1255
@ ATOMIC_LOAD_UMAX
Definition: ISDOpcodes.h:1280
@ SMULO
Same for multiplication.
Definition: ISDOpcodes.h:332
@ TargetFrameIndex
Definition: ISDOpcodes.h:166
@ ConstantPool
Definition: ISDOpcodes.h:82
@ LIFETIME_START
This corresponds to the llvm.lifetime.
Definition: ISDOpcodes.h:1311
@ STRICT_BF16_TO_FP
Definition: ISDOpcodes.h:925
@ ATOMIC_LOAD_UDEC_WRAP
Definition: ISDOpcodes.h:1286
@ ATOMIC_LOAD_ADD
Definition: ISDOpcodes.h:1270
@ ATOMIC_LOAD_SUB
Definition: ISDOpcodes.h:1271
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition: ISDOpcodes.h:158
@ GET_FPENV_MEM
Gets the current floating-point environment.
Definition: ISDOpcodes.h:1014
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
Definition: ISDOpcodes.h:1331
@ STRICT_FP_TO_BF16
Definition: ISDOpcodes.h:926
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
Definition: ISDOpcodes.h:1269
@ ExternalSymbol
Definition: ISDOpcodes.h:83
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition: ISDOpcodes.h:908
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Definition: ISDOpcodes.h:1408
@ BlockAddress
Definition: ISDOpcodes.h:84
@ ATOMIC_LOAD_UINC_WRAP
Definition: ISDOpcodes.h:1285
@ SET_FPENV_MEM
Sets the current floating point environment.
Definition: ISDOpcodes.h:1019
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:192
@ TargetGlobalTLSAddress
Definition: ISDOpcodes.h:165
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition: ISDOpcodes.h:516
bool isOverflowIntrOpRes(SDValue Op)
Returns true if the specified value is the overflow result from one of the overflow intrinsic nodes.
bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
bool isNormalStore(const SDNode *N)
Returns true if the specified node is a non-truncating and unindexed store.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantSDNode predicate.
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool matchUnaryFpPredicate(SDValue Op, std::function< bool(ConstantFPSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantFPSDNode predicate.
static const int FIRST_TARGET_MEMORY_OPCODE
FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations which do not reference a specific me...
Definition: ISDOpcodes.h:1424
bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
bool isUNINDEXEDLoad(const SDNode *N)
Returns true if the specified node is an unindexed load.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
Definition: ISDOpcodes.h:1497
bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
bool isUNINDEXEDStore(const SDNode *N)
Returns true if the specified node is an unindexed store.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
Definition: ISDOpcodes.h:1484
bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
static const int FIRST_TARGET_STRICTFP_OPCODE
FIRST_TARGET_STRICTFP_OPCODE - Target-specific pre-isel operations which cannot raise FP exceptions s...
Definition: ISDOpcodes.h:1418
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1535
bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:1515
bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
bool isNormalLoad(const SDNode *N)
Returns true if the specified node is a non-extending and unindexed load.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition: Utils.cpp:1539
SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition: Utils.cpp:1521
bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
void checkForCycles(const SelectionDAG *DAG, bool force=false)
SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition: STLExtras.h:322
SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Other
Any other memory.
ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
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:1849
bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:760
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
A suitably aligned and sized character array member which can hold elements of any type.
Definition: AlignOf.h:27
static unsigned getHashValue(const SDValue &Val)
static bool isEqual(const SDValue &LHS, const SDValue &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:50
Extended Value Type.
Definition: ValueTypes.h:34
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:358
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition: ValueTypes.h:306
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition: ValueTypes.h:366
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition: ValueTypes.h:313
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition: ValueTypes.h:326
static ChildIteratorType child_begin(NodeRef N)
static ChildIteratorType child_end(NodeRef N)
static NodeRef getEntryNode(SDNode *N)
This class contains a discriminated union of information about pointers in memory operands,...
unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
bool hasNoInfs() const
void setNoFPExcept(bool b)
void setDisjoint(bool b)
void setAllowContract(bool b)
void setNoSignedZeros(bool b)
bool hasNoFPExcept() const
void setNoNaNs(bool b)
bool hasNoUnsignedWrap() const
void setAllowReassociation(bool b)
bool hasNoNaNs() const
void setUnpredictable(bool b)
void setNoInfs(bool b)
void setAllowReciprocal(bool b)
bool hasAllowContract() const
bool hasNoSignedZeros() const
bool hasDisjoint() const
void intersectWith(const SDNodeFlags Flags)
Clear any flags in this flag set that aren't also set in Flags.
bool hasApproximateFuncs() const
bool hasUnpredictable() const
void setApproximateFuncs(bool b)
bool hasNoSignedWrap() const
void setNonNeg(bool b)
bool hasAllowReciprocal() const
bool hasNonNeg() const
SDNodeFlags()
Default constructor turns off all optimization flags.
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
Iterator for directly iterating over the operand SDValue's.
const SDValue & operator*() const
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
static SimpleType getSimplifiedValue(SDUse &Val)
static SimpleType getSimplifiedValue(SDValue &Val)
static SimpleType getSimplifiedValue(const SDValue &Val)
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...
Definition: Casting.h:34