1//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the SDNode class and derived classes, which are used to
11// represent the nodes and operations present in a SelectionDAG.  These nodes
12// and operations are machine code level operations, with some similarities to
13// the GCC RTL representation.
14//
15// Clients should include the SelectionDAG.h file instead of this file directly.
16//
17//===----------------------------------------------------------------------===//
18
19#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H
20#define LLVM_CODEGEN_SELECTIONDAGNODES_H
21
22#include "llvm/Constants.h"
23#include "llvm/Instructions.h"
24#include "llvm/ADT/FoldingSet.h"
25#include "llvm/ADT/GraphTraits.h"
26#include "llvm/ADT/ilist_node.h"
27#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/ADT/STLExtras.h"
30#include "llvm/CodeGen/ISDOpcodes.h"
31#include "llvm/CodeGen/ValueTypes.h"
32#include "llvm/CodeGen/MachineMemOperand.h"
33#include "llvm/Support/MathExtras.h"
34#include "llvm/Support/DataTypes.h"
35#include "llvm/Support/DebugLoc.h"
36#include <cassert>
37
38namespace llvm {
39
40class SelectionDAG;
41class GlobalValue;
42class MachineBasicBlock;
43class MachineConstantPoolValue;
44class SDNode;
45class Value;
46class MCSymbol;
47template <typename T> struct DenseMapInfo;
48template <typename T> struct simplify_type;
49template <typename T> struct ilist_traits;
50
51void checkForCycles(const SDNode *N);
52
53/// SDVTList - This represents a list of ValueType's that has been intern'd by
54/// a SelectionDAG.  Instances of this simple value class are returned by
55/// SelectionDAG::getVTList(...).
56///
57struct SDVTList {
58  const EVT *VTs;
59  unsigned int NumVTs;
60};
61
62namespace ISD {
63  /// Node predicates
64
65  /// isBuildVectorAllOnes - Return true if the specified node is a
66  /// BUILD_VECTOR where all of the elements are ~0 or undef.
67  bool isBuildVectorAllOnes(const SDNode *N);
68
69  /// isBuildVectorAllZeros - Return true if the specified node is a
70  /// BUILD_VECTOR where all of the elements are 0 or undef.
71  bool isBuildVectorAllZeros(const SDNode *N);
72
73  /// isScalarToVector - Return true if the specified node is a
74  /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
75  /// element is not an undef.
76  bool isScalarToVector(const SDNode *N);
77}  // end llvm:ISD namespace
78
79//===----------------------------------------------------------------------===//
80/// SDValue - Unlike LLVM values, Selection DAG nodes may return multiple
81/// values as the result of a computation.  Many nodes return multiple values,
82/// from loads (which define a token and a return value) to ADDC (which returns
83/// a result and a carry value), to calls (which may return an arbitrary number
84/// of values).
85///
86/// As such, each use of a SelectionDAG computation must indicate the node that
87/// computes it as well as which return value to use from that node.  This pair
88/// of information is represented with the SDValue value type.
89///
90class SDValue {
91  SDNode *Node;       // The node defining the value we are using.
92  unsigned ResNo;     // Which return value of the node we are using.
93public:
94  SDValue() : Node(0), ResNo(0) {}
95  SDValue(SDNode *node, unsigned resno) : Node(node), ResNo(resno) {}
96
97  /// get the index which selects a specific result in the SDNode
98  unsigned getResNo() const { return ResNo; }
99
100  /// get the SDNode which holds the desired result
101  SDNode *getNode() const { return Node; }
102
103  /// set the SDNode
104  void setNode(SDNode *N) { Node = N; }
105
106  inline SDNode *operator->() const { return Node; }
107
108  bool operator==(const SDValue &O) const {
109    return Node == O.Node && ResNo == O.ResNo;
110  }
111  bool operator!=(const SDValue &O) const {
112    return !operator==(O);
113  }
114  bool operator<(const SDValue &O) const {
115    return Node < O.Node || (Node == O.Node && ResNo < O.ResNo);
116  }
117
118  SDValue getValue(unsigned R) const {
119    return SDValue(Node, R);
120  }
121
122  // isOperandOf - Return true if this node is an operand of N.
123  bool isOperandOf(SDNode *N) const;
124
125  /// getValueType - Return the ValueType of the referenced return value.
126  ///
127  inline EVT getValueType() const;
128
129  /// getValueSizeInBits - Returns the size of the value in bits.
130  ///
131  unsigned getValueSizeInBits() const {
132    return getValueType().getSizeInBits();
133  }
134
135  // Forwarding methods - These forward to the corresponding methods in SDNode.
136  inline unsigned getOpcode() const;
137  inline unsigned getNumOperands() const;
138  inline const SDValue &getOperand(unsigned i) const;
139  inline uint64_t getConstantOperandVal(unsigned i) const;
140  inline bool isTargetMemoryOpcode() const;
141  inline bool isTargetOpcode() const;
142  inline bool isMachineOpcode() const;
143  inline unsigned getMachineOpcode() const;
144  inline const DebugLoc getDebugLoc() const;
145
146
147  /// reachesChainWithoutSideEffects - Return true if this operand (which must
148  /// be a chain) reaches the specified operand without crossing any
149  /// side-effecting instructions.  In practice, this looks through token
150  /// factors and non-volatile loads.  In order to remain efficient, this only
151  /// looks a couple of nodes in, it does not do an exhaustive search.
152  bool reachesChainWithoutSideEffects(SDValue Dest,
153                                      unsigned Depth = 2) const;
154
155  /// use_empty - Return true if there are no nodes using value ResNo
156  /// of Node.
157  ///
158  inline bool use_empty() const;
159
160  /// hasOneUse - Return true if there is exactly one node using value
161  /// ResNo of Node.
162  ///
163  inline bool hasOneUse() const;
164};
165
166
167template<> struct DenseMapInfo<SDValue> {
168  static inline SDValue getEmptyKey() {
169    return SDValue((SDNode*)-1, -1U);
170  }
171  static inline SDValue getTombstoneKey() {
172    return SDValue((SDNode*)-1, 0);
173  }
174  static unsigned getHashValue(const SDValue &Val) {
175    return ((unsigned)((uintptr_t)Val.getNode() >> 4) ^
176            (unsigned)((uintptr_t)Val.getNode() >> 9)) + Val.getResNo();
177  }
178  static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
179    return LHS == RHS;
180  }
181};
182template <> struct isPodLike<SDValue> { static const bool value = true; };
183
184
185/// simplify_type specializations - Allow casting operators to work directly on
186/// SDValues as if they were SDNode*'s.
187template<> struct simplify_type<SDValue> {
188  typedef SDNode* SimpleType;
189  static SimpleType getSimplifiedValue(const SDValue &Val) {
190    return static_cast<SimpleType>(Val.getNode());
191  }
192};
193template<> struct simplify_type<const SDValue> {
194  typedef SDNode* SimpleType;
195  static SimpleType getSimplifiedValue(const SDValue &Val) {
196    return static_cast<SimpleType>(Val.getNode());
197  }
198};
199
200/// SDUse - Represents a use of a SDNode. This class holds an SDValue,
201/// which records the SDNode being used and the result number, a
202/// pointer to the SDNode using the value, and Next and Prev pointers,
203/// which link together all the uses of an SDNode.
204///
205class SDUse {
206  /// Val - The value being used.
207  SDValue Val;
208  /// User - The user of this value.
209  SDNode *User;
210  /// Prev, Next - Pointers to the uses list of the SDNode referred by
211  /// this operand.
212  SDUse **Prev, *Next;
213
214  SDUse(const SDUse &U);          // Do not implement
215  void operator=(const SDUse &U); // Do not implement
216
217public:
218  SDUse() : Val(), User(NULL), Prev(NULL), Next(NULL) {}
219
220  /// Normally SDUse will just implicitly convert to an SDValue that it holds.
221  operator const SDValue&() const { return Val; }
222
223  /// If implicit conversion to SDValue doesn't work, the get() method returns
224  /// the SDValue.
225  const SDValue &get() const { return Val; }
226
227  /// getUser - This returns the SDNode that contains this Use.
228  SDNode *getUser() { return User; }
229
230  /// getNext - Get the next SDUse in the use list.
231  SDUse *getNext() const { return Next; }
232
233  /// getNode - Convenience function for get().getNode().
234  SDNode *getNode() const { return Val.getNode(); }
235  /// getResNo - Convenience function for get().getResNo().
236  unsigned getResNo() const { return Val.getResNo(); }
237  /// getValueType - Convenience function for get().getValueType().
238  EVT getValueType() const { return Val.getValueType(); }
239
240  /// operator== - Convenience function for get().operator==
241  bool operator==(const SDValue &V) const {
242    return Val == V;
243  }
244
245  /// operator!= - Convenience function for get().operator!=
246  bool operator!=(const SDValue &V) const {
247    return Val != V;
248  }
249
250  /// operator< - Convenience function for get().operator<
251  bool operator<(const SDValue &V) const {
252    return Val < V;
253  }
254
255private:
256  friend class SelectionDAG;
257  friend class SDNode;
258
259  void setUser(SDNode *p) { User = p; }
260
261  /// set - Remove this use from its existing use list, assign it the
262  /// given value, and add it to the new value's node's use list.
263  inline void set(const SDValue &V);
264  /// setInitial - like set, but only supports initializing a newly-allocated
265  /// SDUse with a non-null value.
266  inline void setInitial(const SDValue &V);
267  /// setNode - like set, but only sets the Node portion of the value,
268  /// leaving the ResNo portion unmodified.
269  inline void setNode(SDNode *N);
270
271  void addToList(SDUse **List) {
272    Next = *List;
273    if (Next) Next->Prev = &Next;
274    Prev = List;
275    *List = this;
276  }
277
278  void removeFromList() {
279    *Prev = Next;
280    if (Next) Next->Prev = Prev;
281  }
282};
283
284/// simplify_type specializations - Allow casting operators to work directly on
285/// SDValues as if they were SDNode*'s.
286template<> struct simplify_type<SDUse> {
287  typedef SDNode* SimpleType;
288  static SimpleType getSimplifiedValue(const SDUse &Val) {
289    return static_cast<SimpleType>(Val.getNode());
290  }
291};
292template<> struct simplify_type<const SDUse> {
293  typedef SDNode* SimpleType;
294  static SimpleType getSimplifiedValue(const SDUse &Val) {
295    return static_cast<SimpleType>(Val.getNode());
296  }
297};
298
299
300/// SDNode - Represents one node in the SelectionDAG.
301///
302class SDNode : public FoldingSetNode, public ilist_node<SDNode> {
303private:
304  /// NodeType - The operation that this node performs.
305  ///
306  int16_t NodeType;
307
308  /// OperandsNeedDelete - This is true if OperandList was new[]'d.  If true,
309  /// then they will be delete[]'d when the node is destroyed.
310  uint16_t OperandsNeedDelete : 1;
311
312  /// HasDebugValue - This tracks whether this node has one or more dbg_value
313  /// nodes corresponding to it.
314  uint16_t HasDebugValue : 1;
315
316protected:
317  /// SubclassData - This member is defined by this class, but is not used for
318  /// anything.  Subclasses can use it to hold whatever state they find useful.
319  /// This field is initialized to zero by the ctor.
320  uint16_t SubclassData : 14;
321
322private:
323  /// NodeId - Unique id per SDNode in the DAG.
324  int NodeId;
325
326  /// OperandList - The values that are used by this operation.
327  ///
328  SDUse *OperandList;
329
330  /// ValueList - The types of the values this node defines.  SDNode's may
331  /// define multiple values simultaneously.
332  const EVT *ValueList;
333
334  /// UseList - List of uses for this SDNode.
335  SDUse *UseList;
336
337  /// NumOperands/NumValues - The number of entries in the Operand/Value list.
338  unsigned short NumOperands, NumValues;
339
340  /// debugLoc - source line information.
341  DebugLoc debugLoc;
342
343  /// getValueTypeList - Return a pointer to the specified value type.
344  static const EVT *getValueTypeList(EVT VT);
345
346  friend class SelectionDAG;
347  friend struct ilist_traits<SDNode>;
348
349public:
350  //===--------------------------------------------------------------------===//
351  //  Accessors
352  //
353
354  /// getOpcode - Return the SelectionDAG opcode value for this node. For
355  /// pre-isel nodes (those for which isMachineOpcode returns false), these
356  /// are the opcode values in the ISD and <target>ISD namespaces. For
357  /// post-isel opcodes, see getMachineOpcode.
358  unsigned getOpcode()  const { return (unsigned short)NodeType; }
359
360  /// isTargetOpcode - Test if this node has a target-specific opcode (in the
361  /// \<target\>ISD namespace).
362  bool isTargetOpcode() const { return NodeType >= ISD::BUILTIN_OP_END; }
363
364  /// isTargetMemoryOpcode - Test if this node has a target-specific
365  /// memory-referencing opcode (in the \<target\>ISD namespace and
366  /// greater than FIRST_TARGET_MEMORY_OPCODE).
367  bool isTargetMemoryOpcode() const {
368    return NodeType >= ISD::FIRST_TARGET_MEMORY_OPCODE;
369  }
370
371  /// isMachineOpcode - Test if this node has a post-isel opcode, directly
372  /// corresponding to a MachineInstr opcode.
373  bool isMachineOpcode() const { return NodeType < 0; }
374
375  /// getMachineOpcode - This may only be called if isMachineOpcode returns
376  /// true. It returns the MachineInstr opcode value that the node's opcode
377  /// corresponds to.
378  unsigned getMachineOpcode() const {
379    assert(isMachineOpcode() && "Not a MachineInstr opcode!");
380    return ~NodeType;
381  }
382
383  /// getHasDebugValue - get this bit.
384  bool getHasDebugValue() const { return HasDebugValue; }
385
386  /// setHasDebugValue - set this bit.
387  void setHasDebugValue(bool b) { HasDebugValue = b; }
388
389  /// use_empty - Return true if there are no uses of this node.
390  ///
391  bool use_empty() const { return UseList == NULL; }
392
393  /// hasOneUse - Return true if there is exactly one use of this node.
394  ///
395  bool hasOneUse() const {
396    return !use_empty() && llvm::next(use_begin()) == use_end();
397  }
398
399  /// use_size - Return the number of uses of this node. This method takes
400  /// time proportional to the number of uses.
401  ///
402  size_t use_size() const { return std::distance(use_begin(), use_end()); }
403
404  /// getNodeId - Return the unique node id.
405  ///
406  int getNodeId() const { return NodeId; }
407
408  /// setNodeId - Set unique node id.
409  void setNodeId(int Id) { NodeId = Id; }
410
411  /// getDebugLoc - Return the source location info.
412  const DebugLoc getDebugLoc() const { return debugLoc; }
413
414  /// setDebugLoc - Set source location info.  Try to avoid this, putting
415  /// it in the constructor is preferable.
416  void setDebugLoc(const DebugLoc dl) { debugLoc = dl; }
417
418  /// use_iterator - This class provides iterator support for SDUse
419  /// operands that use a specific SDNode.
420  class use_iterator
421    : public std::iterator<std::forward_iterator_tag, SDUse, ptrdiff_t> {
422    SDUse *Op;
423    explicit use_iterator(SDUse *op) : Op(op) {
424    }
425    friend class SDNode;
426  public:
427    typedef std::iterator<std::forward_iterator_tag,
428                          SDUse, ptrdiff_t>::reference reference;
429    typedef std::iterator<std::forward_iterator_tag,
430                          SDUse, ptrdiff_t>::pointer pointer;
431
432    use_iterator(const use_iterator &I) : Op(I.Op) {}
433    use_iterator() : Op(0) {}
434
435    bool operator==(const use_iterator &x) const {
436      return Op == x.Op;
437    }
438    bool operator!=(const use_iterator &x) const {
439      return !operator==(x);
440    }
441
442    /// atEnd - return true if this iterator is at the end of uses list.
443    bool atEnd() const { return Op == 0; }
444
445    // Iterator traversal: forward iteration only.
446    use_iterator &operator++() {          // Preincrement
447      assert(Op && "Cannot increment end iterator!");
448      Op = Op->getNext();
449      return *this;
450    }
451
452    use_iterator operator++(int) {        // Postincrement
453      use_iterator tmp = *this; ++*this; return tmp;
454    }
455
456    /// Retrieve a pointer to the current user node.
457    SDNode *operator*() const {
458      assert(Op && "Cannot dereference end iterator!");
459      return Op->getUser();
460    }
461
462    SDNode *operator->() const { return operator*(); }
463
464    SDUse &getUse() const { return *Op; }
465
466    /// getOperandNo - Retrieve the operand # of this use in its user.
467    ///
468    unsigned getOperandNo() const {
469      assert(Op && "Cannot dereference end iterator!");
470      return (unsigned)(Op - Op->getUser()->OperandList);
471    }
472  };
473
474  /// use_begin/use_end - Provide iteration support to walk over all uses
475  /// of an SDNode.
476
477  use_iterator use_begin() const {
478    return use_iterator(UseList);
479  }
480
481  static use_iterator use_end() { return use_iterator(0); }
482
483
484  /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
485  /// indicated value.  This method ignores uses of other values defined by this
486  /// operation.
487  bool hasNUsesOfValue(unsigned NUses, unsigned Value) const;
488
489  /// hasAnyUseOfValue - Return true if there are any use of the indicated
490  /// value. This method ignores uses of other values defined by this operation.
491  bool hasAnyUseOfValue(unsigned Value) const;
492
493  /// isOnlyUserOf - Return true if this node is the only use of N.
494  ///
495  bool isOnlyUserOf(SDNode *N) const;
496
497  /// isOperandOf - Return true if this node is an operand of N.
498  ///
499  bool isOperandOf(SDNode *N) const;
500
501  /// isPredecessorOf - Return true if this node is a predecessor of N.
502  /// NOTE: Implemented on top of hasPredecessor and every bit as
503  /// expensive. Use carefully.
504  bool isPredecessorOf(const SDNode *N) const { return N->hasPredecessor(this); }
505
506  /// hasPredecessor - Return true if N is a predecessor of this node.
507  /// N is either an operand of this node, or can be reached by recursively
508  /// traversing up the operands.
509  /// NOTE: This is an expensive method. Use it carefully.
510  bool hasPredecessor(const SDNode *N) const;
511
512  /// hasPredecesorHelper - Return true if N is a predecessor of this node.
513  /// N is either an operand of this node, or can be reached by recursively
514  /// traversing up the operands.
515  /// In this helper the Visited and worklist sets are held externally to
516  /// cache predecessors over multiple invocations. If you want to test for
517  /// multiple predecessors this method is preferable to multiple calls to
518  /// hasPredecessor. Be sure to clear Visited and Worklist if the DAG
519  /// changes.
520  /// NOTE: This is still very expensive. Use carefully.
521  bool hasPredecessorHelper(const SDNode *N,
522                            SmallPtrSet<const SDNode *, 32> &Visited,
523                            SmallVector<const SDNode *, 16> &Worklist) const;
524
525  /// getNumOperands - Return the number of values used by this operation.
526  ///
527  unsigned getNumOperands() const { return NumOperands; }
528
529  /// getConstantOperandVal - Helper method returns the integer value of a
530  /// ConstantSDNode operand.
531  uint64_t getConstantOperandVal(unsigned Num) const;
532
533  const SDValue &getOperand(unsigned Num) const {
534    assert(Num < NumOperands && "Invalid child # of SDNode!");
535    return OperandList[Num];
536  }
537
538  typedef SDUse* op_iterator;
539  op_iterator op_begin() const { return OperandList; }
540  op_iterator op_end() const { return OperandList+NumOperands; }
541
542  SDVTList getVTList() const {
543    SDVTList X = { ValueList, NumValues };
544    return X;
545  }
546
547  /// getGluedNode - If this node has a glue operand, return the node
548  /// to which the glue operand points. Otherwise return NULL.
549  SDNode *getGluedNode() const {
550    if (getNumOperands() != 0 &&
551      getOperand(getNumOperands()-1).getValueType() == MVT::Glue)
552      return getOperand(getNumOperands()-1).getNode();
553    return 0;
554  }
555
556  // If this is a pseudo op, like copyfromreg, look to see if there is a
557  // real target node glued to it.  If so, return the target node.
558  const SDNode *getGluedMachineNode() const {
559    const SDNode *FoundNode = this;
560
561    // Climb up glue edges until a machine-opcode node is found, or the
562    // end of the chain is reached.
563    while (!FoundNode->isMachineOpcode()) {
564      const SDNode *N = FoundNode->getGluedNode();
565      if (!N) break;
566      FoundNode = N;
567    }
568
569    return FoundNode;
570  }
571
572  /// getGluedUser - If this node has a glue value with a user, return
573  /// the user (there is at most one). Otherwise return NULL.
574  SDNode *getGluedUser() const {
575    for (use_iterator UI = use_begin(), UE = use_end(); UI != UE; ++UI)
576      if (UI.getUse().get().getValueType() == MVT::Glue)
577        return *UI;
578    return 0;
579  }
580
581  /// getNumValues - Return the number of values defined/returned by this
582  /// operator.
583  ///
584  unsigned getNumValues() const { return NumValues; }
585
586  /// getValueType - Return the type of a specified result.
587  ///
588  EVT getValueType(unsigned ResNo) const {
589    assert(ResNo < NumValues && "Illegal result number!");
590    return ValueList[ResNo];
591  }
592
593  /// getValueSizeInBits - Returns MVT::getSizeInBits(getValueType(ResNo)).
594  ///
595  unsigned getValueSizeInBits(unsigned ResNo) const {
596    return getValueType(ResNo).getSizeInBits();
597  }
598
599  typedef const EVT* value_iterator;
600  value_iterator value_begin() const { return ValueList; }
601  value_iterator value_end() const { return ValueList+NumValues; }
602
603  /// getOperationName - Return the opcode of this operation for printing.
604  ///
605  std::string getOperationName(const SelectionDAG *G = 0) const;
606  static const char* getIndexedModeName(ISD::MemIndexedMode AM);
607  void print_types(raw_ostream &OS, const SelectionDAG *G) const;
608  void print_details(raw_ostream &OS, const SelectionDAG *G) const;
609  void print(raw_ostream &OS, const SelectionDAG *G = 0) const;
610  void printr(raw_ostream &OS, const SelectionDAG *G = 0) const;
611
612  /// printrFull - Print a SelectionDAG node and all children down to
613  /// the leaves.  The given SelectionDAG allows target-specific nodes
614  /// to be printed in human-readable form.  Unlike printr, this will
615  /// print the whole DAG, including children that appear multiple
616  /// times.
617  ///
618  void printrFull(raw_ostream &O, const SelectionDAG *G = 0) const;
619
620  /// printrWithDepth - Print a SelectionDAG node and children up to
621  /// depth "depth."  The given SelectionDAG allows target-specific
622  /// nodes to be printed in human-readable form.  Unlike printr, this
623  /// will print children that appear multiple times wherever they are
624  /// used.
625  ///
626  void printrWithDepth(raw_ostream &O, const SelectionDAG *G = 0,
627                       unsigned depth = 100) const;
628
629
630  /// dump - Dump this node, for debugging.
631  void dump() const;
632
633  /// dumpr - Dump (recursively) this node and its use-def subgraph.
634  void dumpr() const;
635
636  /// dump - Dump this node, for debugging.
637  /// The given SelectionDAG allows target-specific nodes to be printed
638  /// in human-readable form.
639  void dump(const SelectionDAG *G) const;
640
641  /// dumpr - Dump (recursively) this node and its use-def subgraph.
642  /// The given SelectionDAG allows target-specific nodes to be printed
643  /// in human-readable form.
644  void dumpr(const SelectionDAG *G) const;
645
646  /// dumprFull - printrFull to dbgs().  The given SelectionDAG allows
647  /// target-specific nodes to be printed in human-readable form.
648  /// Unlike dumpr, this will print the whole DAG, including children
649  /// that appear multiple times.
650  ///
651  void dumprFull(const SelectionDAG *G = 0) const;
652
653  /// dumprWithDepth - printrWithDepth to dbgs().  The given
654  /// SelectionDAG allows target-specific nodes to be printed in
655  /// human-readable form.  Unlike dumpr, this will print children
656  /// that appear multiple times wherever they are used.
657  ///
658  void dumprWithDepth(const SelectionDAG *G = 0, unsigned depth = 100) const;
659
660
661  static bool classof(const SDNode *) { return true; }
662
663  /// Profile - Gather unique data for the node.
664  ///
665  void Profile(FoldingSetNodeID &ID) const;
666
667  /// addUse - This method should only be used by the SDUse class.
668  ///
669  void addUse(SDUse &U) { U.addToList(&UseList); }
670
671protected:
672  static SDVTList getSDVTList(EVT VT) {
673    SDVTList Ret = { getValueTypeList(VT), 1 };
674    return Ret;
675  }
676
677  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs, const SDValue *Ops,
678         unsigned NumOps)
679    : NodeType(Opc), OperandsNeedDelete(true), HasDebugValue(false),
680      SubclassData(0), NodeId(-1),
681      OperandList(NumOps ? new SDUse[NumOps] : 0),
682      ValueList(VTs.VTs), UseList(NULL),
683      NumOperands(NumOps), NumValues(VTs.NumVTs),
684      debugLoc(dl) {
685    for (unsigned i = 0; i != NumOps; ++i) {
686      OperandList[i].setUser(this);
687      OperandList[i].setInitial(Ops[i]);
688    }
689    checkForCycles(this);
690  }
691
692  /// This constructor adds no operands itself; operands can be
693  /// set later with InitOperands.
694  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs)
695    : NodeType(Opc), OperandsNeedDelete(false), HasDebugValue(false),
696      SubclassData(0), NodeId(-1), OperandList(0), ValueList(VTs.VTs),
697      UseList(NULL), NumOperands(0), NumValues(VTs.NumVTs),
698      debugLoc(dl) {}
699
700  /// InitOperands - Initialize the operands list of this with 1 operand.
701  void InitOperands(SDUse *Ops, const SDValue &Op0) {
702    Ops[0].setUser(this);
703    Ops[0].setInitial(Op0);
704    NumOperands = 1;
705    OperandList = Ops;
706    checkForCycles(this);
707  }
708
709  /// InitOperands - Initialize the operands list of this with 2 operands.
710  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1) {
711    Ops[0].setUser(this);
712    Ops[0].setInitial(Op0);
713    Ops[1].setUser(this);
714    Ops[1].setInitial(Op1);
715    NumOperands = 2;
716    OperandList = Ops;
717    checkForCycles(this);
718  }
719
720  /// InitOperands - Initialize the operands list of this with 3 operands.
721  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
722                    const SDValue &Op2) {
723    Ops[0].setUser(this);
724    Ops[0].setInitial(Op0);
725    Ops[1].setUser(this);
726    Ops[1].setInitial(Op1);
727    Ops[2].setUser(this);
728    Ops[2].setInitial(Op2);
729    NumOperands = 3;
730    OperandList = Ops;
731    checkForCycles(this);
732  }
733
734  /// InitOperands - Initialize the operands list of this with 4 operands.
735  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
736                    const SDValue &Op2, const SDValue &Op3) {
737    Ops[0].setUser(this);
738    Ops[0].setInitial(Op0);
739    Ops[1].setUser(this);
740    Ops[1].setInitial(Op1);
741    Ops[2].setUser(this);
742    Ops[2].setInitial(Op2);
743    Ops[3].setUser(this);
744    Ops[3].setInitial(Op3);
745    NumOperands = 4;
746    OperandList = Ops;
747    checkForCycles(this);
748  }
749
750  /// InitOperands - Initialize the operands list of this with N operands.
751  void InitOperands(SDUse *Ops, const SDValue *Vals, unsigned N) {
752    for (unsigned i = 0; i != N; ++i) {
753      Ops[i].setUser(this);
754      Ops[i].setInitial(Vals[i]);
755    }
756    NumOperands = N;
757    OperandList = Ops;
758    checkForCycles(this);
759  }
760
761  /// DropOperands - Release the operands and set this node to have
762  /// zero operands.
763  void DropOperands();
764};
765
766
767// Define inline functions from the SDValue class.
768
769inline unsigned SDValue::getOpcode() const {
770  return Node->getOpcode();
771}
772inline EVT SDValue::getValueType() const {
773  return Node->getValueType(ResNo);
774}
775inline unsigned SDValue::getNumOperands() const {
776  return Node->getNumOperands();
777}
778inline const SDValue &SDValue::getOperand(unsigned i) const {
779  return Node->getOperand(i);
780}
781inline uint64_t SDValue::getConstantOperandVal(unsigned i) const {
782  return Node->getConstantOperandVal(i);
783}
784inline bool SDValue::isTargetOpcode() const {
785  return Node->isTargetOpcode();
786}
787inline bool SDValue::isTargetMemoryOpcode() const {
788  return Node->isTargetMemoryOpcode();
789}
790inline bool SDValue::isMachineOpcode() const {
791  return Node->isMachineOpcode();
792}
793inline unsigned SDValue::getMachineOpcode() const {
794  return Node->getMachineOpcode();
795}
796inline bool SDValue::use_empty() const {
797  return !Node->hasAnyUseOfValue(ResNo);
798}
799inline bool SDValue::hasOneUse() const {
800  return Node->hasNUsesOfValue(1, ResNo);
801}
802inline const DebugLoc SDValue::getDebugLoc() const {
803  return Node->getDebugLoc();
804}
805
806// Define inline functions from the SDUse class.
807
808inline void SDUse::set(const SDValue &V) {
809  if (Val.getNode()) removeFromList();
810  Val = V;
811  if (V.getNode()) V.getNode()->addUse(*this);
812}
813
814inline void SDUse::setInitial(const SDValue &V) {
815  Val = V;
816  V.getNode()->addUse(*this);
817}
818
819inline void SDUse::setNode(SDNode *N) {
820  if (Val.getNode()) removeFromList();
821  Val.setNode(N);
822  if (N) N->addUse(*this);
823}
824
825/// UnarySDNode - This class is used for single-operand SDNodes.  This is solely
826/// to allow co-allocation of node operands with the node itself.
827class UnarySDNode : public SDNode {
828  SDUse Op;
829public:
830  UnarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X)
831    : SDNode(Opc, dl, VTs) {
832    InitOperands(&Op, X);
833  }
834};
835
836/// BinarySDNode - This class is used for two-operand SDNodes.  This is solely
837/// to allow co-allocation of node operands with the node itself.
838class BinarySDNode : public SDNode {
839  SDUse Ops[2];
840public:
841  BinarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y)
842    : SDNode(Opc, dl, VTs) {
843    InitOperands(Ops, X, Y);
844  }
845};
846
847/// TernarySDNode - This class is used for three-operand SDNodes. This is solely
848/// to allow co-allocation of node operands with the node itself.
849class TernarySDNode : public SDNode {
850  SDUse Ops[3];
851public:
852  TernarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y,
853                SDValue Z)
854    : SDNode(Opc, dl, VTs) {
855    InitOperands(Ops, X, Y, Z);
856  }
857};
858
859
860/// HandleSDNode - This class is used to form a handle around another node that
861/// is persistent and is updated across invocations of replaceAllUsesWith on its
862/// operand.  This node should be directly created by end-users and not added to
863/// the AllNodes list.
864class HandleSDNode : public SDNode {
865  SDUse Op;
866public:
867  // FIXME: Remove the "noinline" attribute once <rdar://problem/5852746> is
868  // fixed.
869#if __GNUC__==4 && __GNUC_MINOR__==2 && defined(__APPLE__) && !defined(__llvm__)
870  explicit __attribute__((__noinline__)) HandleSDNode(SDValue X)
871#else
872  explicit HandleSDNode(SDValue X)
873#endif
874    : SDNode(ISD::HANDLENODE, DebugLoc(), getSDVTList(MVT::Other)) {
875    InitOperands(&Op, X);
876  }
877  ~HandleSDNode();
878  const SDValue &getValue() const { return Op; }
879};
880
881/// Abstact virtual class for operations for memory operations
882class MemSDNode : public SDNode {
883private:
884  // MemoryVT - VT of in-memory value.
885  EVT MemoryVT;
886
887protected:
888  /// MMO - Memory reference information.
889  MachineMemOperand *MMO;
890
891public:
892  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT MemoryVT,
893            MachineMemOperand *MMO);
894
895  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, const SDValue *Ops,
896            unsigned NumOps, EVT MemoryVT, MachineMemOperand *MMO);
897
898  bool readMem() const { return MMO->isLoad(); }
899  bool writeMem() const { return MMO->isStore(); }
900
901  /// Returns alignment and volatility of the memory access
902  unsigned getOriginalAlignment() const {
903    return MMO->getBaseAlignment();
904  }
905  unsigned getAlignment() const {
906    return MMO->getAlignment();
907  }
908
909  /// getRawSubclassData - Return the SubclassData value, which contains an
910  /// encoding of the volatile flag, as well as bits used by subclasses. This
911  /// function should only be used to compute a FoldingSetNodeID value.
912  unsigned getRawSubclassData() const {
913    return SubclassData;
914  }
915
916  // We access subclass data here so that we can check consistency
917  // with MachineMemOperand information.
918  bool isVolatile() const { return (SubclassData >> 5) & 1; }
919  bool isNonTemporal() const { return (SubclassData >> 6) & 1; }
920
921  AtomicOrdering getOrdering() const {
922    return AtomicOrdering((SubclassData >> 7) & 15);
923  }
924  SynchronizationScope getSynchScope() const {
925    return SynchronizationScope((SubclassData >> 11) & 1);
926  }
927
928  /// Returns the SrcValue and offset that describes the location of the access
929  const Value *getSrcValue() const { return MMO->getValue(); }
930  int64_t getSrcValueOffset() const { return MMO->getOffset(); }
931
932  /// Returns the TBAAInfo that describes the dereference.
933  const MDNode *getTBAAInfo() const { return MMO->getTBAAInfo(); }
934
935  /// getMemoryVT - Return the type of the in-memory value.
936  EVT getMemoryVT() const { return MemoryVT; }
937
938  /// getMemOperand - Return a MachineMemOperand object describing the memory
939  /// reference performed by operation.
940  MachineMemOperand *getMemOperand() const { return MMO; }
941
942  const MachinePointerInfo &getPointerInfo() const {
943    return MMO->getPointerInfo();
944  }
945
946  /// refineAlignment - Update this MemSDNode's MachineMemOperand information
947  /// to reflect the alignment of NewMMO, if it has a greater alignment.
948  /// This must only be used when the new alignment applies to all users of
949  /// this MachineMemOperand.
950  void refineAlignment(const MachineMemOperand *NewMMO) {
951    MMO->refineAlignment(NewMMO);
952  }
953
954  const SDValue &getChain() const { return getOperand(0); }
955  const SDValue &getBasePtr() const {
956    return getOperand(getOpcode() == ISD::STORE ? 2 : 1);
957  }
958
959  // Methods to support isa and dyn_cast
960  static bool classof(const MemSDNode *) { return true; }
961  static bool classof(const SDNode *N) {
962    // For some targets, we lower some target intrinsics to a MemIntrinsicNode
963    // with either an intrinsic or a target opcode.
964    return N->getOpcode() == ISD::LOAD                ||
965           N->getOpcode() == ISD::STORE               ||
966           N->getOpcode() == ISD::PREFETCH            ||
967           N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
968           N->getOpcode() == ISD::ATOMIC_SWAP         ||
969           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
970           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
971           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
972           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
973           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
974           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
975           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
976           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
977           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
978           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX    ||
979           N->getOpcode() == ISD::ATOMIC_LOAD         ||
980           N->getOpcode() == ISD::ATOMIC_STORE        ||
981           N->isTargetMemoryOpcode();
982  }
983};
984
985/// AtomicSDNode - A SDNode reprenting atomic operations.
986///
987class AtomicSDNode : public MemSDNode {
988  SDUse Ops[4];
989
990  void InitAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope) {
991    // This must match encodeMemSDNodeFlags() in SelectionDAG.cpp.
992    assert((Ordering & 15) == Ordering &&
993           "Ordering may not require more than 4 bits!");
994    assert((SynchScope & 1) == SynchScope &&
995           "SynchScope may not require more than 1 bit!");
996    SubclassData |= Ordering << 7;
997    SubclassData |= SynchScope << 11;
998    assert(getOrdering() == Ordering && "Ordering encoding error!");
999    assert(getSynchScope() == SynchScope && "Synch-scope encoding error!");
1000
1001    assert((readMem() || getOrdering() <= Monotonic) &&
1002           "Acquire/Release MachineMemOperand must be a load!");
1003    assert((writeMem() || getOrdering() <= Monotonic) &&
1004           "Acquire/Release MachineMemOperand must be a store!");
1005  }
1006
1007public:
1008  // Opc:   opcode for atomic
1009  // VTL:    value type list
1010  // Chain:  memory chain for operaand
1011  // Ptr:    address to update as a SDValue
1012  // Cmp:    compare value
1013  // Swp:    swap value
1014  // SrcVal: address to update as a Value (used for MemOperand)
1015  // Align:  alignment of memory
1016  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1017               SDValue Chain, SDValue Ptr,
1018               SDValue Cmp, SDValue Swp, MachineMemOperand *MMO,
1019               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1020    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1021    InitAtomic(Ordering, SynchScope);
1022    InitOperands(Ops, Chain, Ptr, Cmp, Swp);
1023  }
1024  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1025               SDValue Chain, SDValue Ptr,
1026               SDValue Val, MachineMemOperand *MMO,
1027               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1028    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1029    InitAtomic(Ordering, SynchScope);
1030    InitOperands(Ops, Chain, Ptr, Val);
1031  }
1032  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1033               SDValue Chain, SDValue Ptr,
1034               MachineMemOperand *MMO,
1035               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1036    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1037    InitAtomic(Ordering, SynchScope);
1038    InitOperands(Ops, Chain, Ptr);
1039  }
1040
1041  const SDValue &getBasePtr() const { return getOperand(1); }
1042  const SDValue &getVal() const { return getOperand(2); }
1043
1044  bool isCompareAndSwap() const {
1045    unsigned Op = getOpcode();
1046    return Op == ISD::ATOMIC_CMP_SWAP;
1047  }
1048
1049  // Methods to support isa and dyn_cast
1050  static bool classof(const AtomicSDNode *) { return true; }
1051  static bool classof(const SDNode *N) {
1052    return N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
1053           N->getOpcode() == ISD::ATOMIC_SWAP         ||
1054           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
1055           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
1056           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
1057           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
1058           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
1059           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
1060           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
1061           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
1062           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
1063           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX    ||
1064           N->getOpcode() == ISD::ATOMIC_LOAD         ||
1065           N->getOpcode() == ISD::ATOMIC_STORE;
1066  }
1067};
1068
1069/// MemIntrinsicSDNode - This SDNode is used for target intrinsics that touch
1070/// memory and need an associated MachineMemOperand. Its opcode may be
1071/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, PREFETCH, or a target-specific opcode
1072/// with a value not less than FIRST_TARGET_MEMORY_OPCODE.
1073class MemIntrinsicSDNode : public MemSDNode {
1074public:
1075  MemIntrinsicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
1076                     const SDValue *Ops, unsigned NumOps,
1077                     EVT MemoryVT, MachineMemOperand *MMO)
1078    : MemSDNode(Opc, dl, VTs, Ops, NumOps, MemoryVT, MMO) {
1079  }
1080
1081  // Methods to support isa and dyn_cast
1082  static bool classof(const MemIntrinsicSDNode *) { return true; }
1083  static bool classof(const SDNode *N) {
1084    // We lower some target intrinsics to their target opcode
1085    // early a node with a target opcode can be of this class
1086    return N->getOpcode() == ISD::INTRINSIC_W_CHAIN ||
1087           N->getOpcode() == ISD::INTRINSIC_VOID ||
1088           N->getOpcode() == ISD::PREFETCH ||
1089           N->isTargetMemoryOpcode();
1090  }
1091};
1092
1093/// ShuffleVectorSDNode - This SDNode is used to implement the code generator
1094/// support for the llvm IR shufflevector instruction.  It combines elements
1095/// from two input vectors into a new input vector, with the selection and
1096/// ordering of elements determined by an array of integers, referred to as
1097/// the shuffle mask.  For input vectors of width N, mask indices of 0..N-1
1098/// refer to elements from the LHS input, and indices from N to 2N-1 the RHS.
1099/// An index of -1 is treated as undef, such that the code generator may put
1100/// any value in the corresponding element of the result.
1101class ShuffleVectorSDNode : public SDNode {
1102  SDUse Ops[2];
1103
1104  // The memory for Mask is owned by the SelectionDAG's OperandAllocator, and
1105  // is freed when the SelectionDAG object is destroyed.
1106  const int *Mask;
1107protected:
1108  friend class SelectionDAG;
1109  ShuffleVectorSDNode(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
1110                      const int *M)
1111    : SDNode(ISD::VECTOR_SHUFFLE, dl, getSDVTList(VT)), Mask(M) {
1112    InitOperands(Ops, N1, N2);
1113  }
1114public:
1115
1116  void getMask(SmallVectorImpl<int> &M) const {
1117    EVT VT = getValueType(0);
1118    M.clear();
1119    for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1120      M.push_back(Mask[i]);
1121  }
1122  int getMaskElt(unsigned Idx) const {
1123    assert(Idx < getValueType(0).getVectorNumElements() && "Idx out of range!");
1124    return Mask[Idx];
1125  }
1126
1127  bool isSplat() const { return isSplatMask(Mask, getValueType(0)); }
1128  int  getSplatIndex() const {
1129    assert(isSplat() && "Cannot get splat index for non-splat!");
1130    EVT VT = getValueType(0);
1131    for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
1132      if (Mask[i] != -1)
1133        return Mask[i];
1134    }
1135    return -1;
1136  }
1137  static bool isSplatMask(const int *Mask, EVT VT);
1138
1139  static bool classof(const ShuffleVectorSDNode *) { return true; }
1140  static bool classof(const SDNode *N) {
1141    return N->getOpcode() == ISD::VECTOR_SHUFFLE;
1142  }
1143};
1144
1145class ConstantSDNode : public SDNode {
1146  const ConstantInt *Value;
1147  friend class SelectionDAG;
1148  ConstantSDNode(bool isTarget, const ConstantInt *val, EVT VT)
1149    : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant,
1150             DebugLoc(), getSDVTList(VT)), Value(val) {
1151  }
1152public:
1153
1154  const ConstantInt *getConstantIntValue() const { return Value; }
1155  const APInt &getAPIntValue() const { return Value->getValue(); }
1156  uint64_t getZExtValue() const { return Value->getZExtValue(); }
1157  int64_t getSExtValue() const { return Value->getSExtValue(); }
1158
1159  bool isOne() const { return Value->isOne(); }
1160  bool isNullValue() const { return Value->isNullValue(); }
1161  bool isAllOnesValue() const { return Value->isAllOnesValue(); }
1162
1163  static bool classof(const ConstantSDNode *) { return true; }
1164  static bool classof(const SDNode *N) {
1165    return N->getOpcode() == ISD::Constant ||
1166           N->getOpcode() == ISD::TargetConstant;
1167  }
1168};
1169
1170class ConstantFPSDNode : public SDNode {
1171  const ConstantFP *Value;
1172  friend class SelectionDAG;
1173  ConstantFPSDNode(bool isTarget, const ConstantFP *val, EVT VT)
1174    : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP,
1175             DebugLoc(), getSDVTList(VT)), Value(val) {
1176  }
1177public:
1178
1179  const APFloat& getValueAPF() const { return Value->getValueAPF(); }
1180  const ConstantFP *getConstantFPValue() const { return Value; }
1181
1182  /// isZero - Return true if the value is positive or negative zero.
1183  bool isZero() const { return Value->isZero(); }
1184
1185  /// isNaN - Return true if the value is a NaN.
1186  bool isNaN() const { return Value->isNaN(); }
1187
1188  /// isExactlyValue - We don't rely on operator== working on double values, as
1189  /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
1190  /// As such, this method can be used to do an exact bit-for-bit comparison of
1191  /// two floating point values.
1192
1193  /// We leave the version with the double argument here because it's just so
1194  /// convenient to write "2.0" and the like.  Without this function we'd
1195  /// have to duplicate its logic everywhere it's called.
1196  bool isExactlyValue(double V) const {
1197    bool ignored;
1198    // convert is not supported on this type
1199    if (&Value->getValueAPF().getSemantics() == &APFloat::PPCDoubleDouble)
1200      return false;
1201    APFloat Tmp(V);
1202    Tmp.convert(Value->getValueAPF().getSemantics(),
1203                APFloat::rmNearestTiesToEven, &ignored);
1204    return isExactlyValue(Tmp);
1205  }
1206  bool isExactlyValue(const APFloat& V) const;
1207
1208  static bool isValueValidForType(EVT VT, const APFloat& Val);
1209
1210  static bool classof(const ConstantFPSDNode *) { return true; }
1211  static bool classof(const SDNode *N) {
1212    return N->getOpcode() == ISD::ConstantFP ||
1213           N->getOpcode() == ISD::TargetConstantFP;
1214  }
1215};
1216
1217class GlobalAddressSDNode : public SDNode {
1218  const GlobalValue *TheGlobal;
1219  int64_t Offset;
1220  unsigned char TargetFlags;
1221  friend class SelectionDAG;
1222  GlobalAddressSDNode(unsigned Opc, DebugLoc DL, const GlobalValue *GA, EVT VT,
1223                      int64_t o, unsigned char TargetFlags);
1224public:
1225
1226  const GlobalValue *getGlobal() const { return TheGlobal; }
1227  int64_t getOffset() const { return Offset; }
1228  unsigned char getTargetFlags() const { return TargetFlags; }
1229  // Return the address space this GlobalAddress belongs to.
1230  unsigned getAddressSpace() const;
1231
1232  static bool classof(const GlobalAddressSDNode *) { return true; }
1233  static bool classof(const SDNode *N) {
1234    return N->getOpcode() == ISD::GlobalAddress ||
1235           N->getOpcode() == ISD::TargetGlobalAddress ||
1236           N->getOpcode() == ISD::GlobalTLSAddress ||
1237           N->getOpcode() == ISD::TargetGlobalTLSAddress;
1238  }
1239};
1240
1241class FrameIndexSDNode : public SDNode {
1242  int FI;
1243  friend class SelectionDAG;
1244  FrameIndexSDNode(int fi, EVT VT, bool isTarg)
1245    : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex,
1246      DebugLoc(), getSDVTList(VT)), FI(fi) {
1247  }
1248public:
1249
1250  int getIndex() const { return FI; }
1251
1252  static bool classof(const FrameIndexSDNode *) { return true; }
1253  static bool classof(const SDNode *N) {
1254    return N->getOpcode() == ISD::FrameIndex ||
1255           N->getOpcode() == ISD::TargetFrameIndex;
1256  }
1257};
1258
1259class JumpTableSDNode : public SDNode {
1260  int JTI;
1261  unsigned char TargetFlags;
1262  friend class SelectionDAG;
1263  JumpTableSDNode(int jti, EVT VT, bool isTarg, unsigned char TF)
1264    : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable,
1265      DebugLoc(), getSDVTList(VT)), JTI(jti), TargetFlags(TF) {
1266  }
1267public:
1268
1269  int getIndex() const { return JTI; }
1270  unsigned char getTargetFlags() const { return TargetFlags; }
1271
1272  static bool classof(const JumpTableSDNode *) { return true; }
1273  static bool classof(const SDNode *N) {
1274    return N->getOpcode() == ISD::JumpTable ||
1275           N->getOpcode() == ISD::TargetJumpTable;
1276  }
1277};
1278
1279class ConstantPoolSDNode : public SDNode {
1280  union {
1281    const Constant *ConstVal;
1282    MachineConstantPoolValue *MachineCPVal;
1283  } Val;
1284  int Offset;  // It's a MachineConstantPoolValue if top bit is set.
1285  unsigned Alignment;  // Minimum alignment requirement of CP (not log2 value).
1286  unsigned char TargetFlags;
1287  friend class SelectionDAG;
1288  ConstantPoolSDNode(bool isTarget, const Constant *c, EVT VT, int o,
1289                     unsigned Align, unsigned char TF)
1290    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1291             DebugLoc(),
1292             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1293    assert((int)Offset >= 0 && "Offset is too large");
1294    Val.ConstVal = c;
1295  }
1296  ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v,
1297                     EVT VT, int o, unsigned Align, unsigned char TF)
1298    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1299             DebugLoc(),
1300             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1301    assert((int)Offset >= 0 && "Offset is too large");
1302    Val.MachineCPVal = v;
1303    Offset |= 1 << (sizeof(unsigned)*CHAR_BIT-1);
1304  }
1305public:
1306
1307
1308  bool isMachineConstantPoolEntry() const {
1309    return (int)Offset < 0;
1310  }
1311
1312  const Constant *getConstVal() const {
1313    assert(!isMachineConstantPoolEntry() && "Wrong constantpool type");
1314    return Val.ConstVal;
1315  }
1316
1317  MachineConstantPoolValue *getMachineCPVal() const {
1318    assert(isMachineConstantPoolEntry() && "Wrong constantpool type");
1319    return Val.MachineCPVal;
1320  }
1321
1322  int getOffset() const {
1323    return Offset & ~(1 << (sizeof(unsigned)*CHAR_BIT-1));
1324  }
1325
1326  // Return the alignment of this constant pool object, which is either 0 (for
1327  // default alignment) or the desired value.
1328  unsigned getAlignment() const { return Alignment; }
1329  unsigned char getTargetFlags() const { return TargetFlags; }
1330
1331  Type *getType() const;
1332
1333  static bool classof(const ConstantPoolSDNode *) { return true; }
1334  static bool classof(const SDNode *N) {
1335    return N->getOpcode() == ISD::ConstantPool ||
1336           N->getOpcode() == ISD::TargetConstantPool;
1337  }
1338};
1339
1340class BasicBlockSDNode : public SDNode {
1341  MachineBasicBlock *MBB;
1342  friend class SelectionDAG;
1343  /// Debug info is meaningful and potentially useful here, but we create
1344  /// blocks out of order when they're jumped to, which makes it a bit
1345  /// harder.  Let's see if we need it first.
1346  explicit BasicBlockSDNode(MachineBasicBlock *mbb)
1347    : SDNode(ISD::BasicBlock, DebugLoc(), getSDVTList(MVT::Other)), MBB(mbb) {
1348  }
1349public:
1350
1351  MachineBasicBlock *getBasicBlock() const { return MBB; }
1352
1353  static bool classof(const BasicBlockSDNode *) { return true; }
1354  static bool classof(const SDNode *N) {
1355    return N->getOpcode() == ISD::BasicBlock;
1356  }
1357};
1358
1359/// BuildVectorSDNode - A "pseudo-class" with methods for operating on
1360/// BUILD_VECTORs.
1361class BuildVectorSDNode : public SDNode {
1362  // These are constructed as SDNodes and then cast to BuildVectorSDNodes.
1363  explicit BuildVectorSDNode();        // Do not implement
1364public:
1365  /// isConstantSplat - Check if this is a constant splat, and if so, find the
1366  /// smallest element size that splats the vector.  If MinSplatBits is
1367  /// nonzero, the element size must be at least that large.  Note that the
1368  /// splat element may be the entire vector (i.e., a one element vector).
1369  /// Returns the splat element value in SplatValue.  Any undefined bits in
1370  /// that value are zero, and the corresponding bits in the SplatUndef mask
1371  /// are set.  The SplatBitSize value is set to the splat element size in
1372  /// bits.  HasAnyUndefs is set to true if any bits in the vector are
1373  /// undefined.  isBigEndian describes the endianness of the target.
1374  bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
1375                       unsigned &SplatBitSize, bool &HasAnyUndefs,
1376                       unsigned MinSplatBits = 0, bool isBigEndian = false);
1377
1378  static inline bool classof(const BuildVectorSDNode *) { return true; }
1379  static inline bool classof(const SDNode *N) {
1380    return N->getOpcode() == ISD::BUILD_VECTOR;
1381  }
1382};
1383
1384/// SrcValueSDNode - An SDNode that holds an arbitrary LLVM IR Value. This is
1385/// used when the SelectionDAG needs to make a simple reference to something
1386/// in the LLVM IR representation.
1387///
1388class SrcValueSDNode : public SDNode {
1389  const Value *V;
1390  friend class SelectionDAG;
1391  /// Create a SrcValue for a general value.
1392  explicit SrcValueSDNode(const Value *v)
1393    : SDNode(ISD::SRCVALUE, DebugLoc(), getSDVTList(MVT::Other)), V(v) {}
1394
1395public:
1396  /// getValue - return the contained Value.
1397  const Value *getValue() const { return V; }
1398
1399  static bool classof(const SrcValueSDNode *) { return true; }
1400  static bool classof(const SDNode *N) {
1401    return N->getOpcode() == ISD::SRCVALUE;
1402  }
1403};
1404
1405class MDNodeSDNode : public SDNode {
1406  const MDNode *MD;
1407  friend class SelectionDAG;
1408  explicit MDNodeSDNode(const MDNode *md)
1409  : SDNode(ISD::MDNODE_SDNODE, DebugLoc(), getSDVTList(MVT::Other)), MD(md) {}
1410public:
1411
1412  const MDNode *getMD() const { return MD; }
1413
1414  static bool classof(const MDNodeSDNode *) { return true; }
1415  static bool classof(const SDNode *N) {
1416    return N->getOpcode() == ISD::MDNODE_SDNODE;
1417  }
1418};
1419
1420
1421class RegisterSDNode : public SDNode {
1422  unsigned Reg;
1423  friend class SelectionDAG;
1424  RegisterSDNode(unsigned reg, EVT VT)
1425    : SDNode(ISD::Register, DebugLoc(), getSDVTList(VT)), Reg(reg) {
1426  }
1427public:
1428
1429  unsigned getReg() const { return Reg; }
1430
1431  static bool classof(const RegisterSDNode *) { return true; }
1432  static bool classof(const SDNode *N) {
1433    return N->getOpcode() == ISD::Register;
1434  }
1435};
1436
1437class BlockAddressSDNode : public SDNode {
1438  const BlockAddress *BA;
1439  unsigned char TargetFlags;
1440  friend class SelectionDAG;
1441  BlockAddressSDNode(unsigned NodeTy, EVT VT, const BlockAddress *ba,
1442                     unsigned char Flags)
1443    : SDNode(NodeTy, DebugLoc(), getSDVTList(VT)),
1444             BA(ba), TargetFlags(Flags) {
1445  }
1446public:
1447  const BlockAddress *getBlockAddress() const { return BA; }
1448  unsigned char getTargetFlags() const { return TargetFlags; }
1449
1450  static bool classof(const BlockAddressSDNode *) { return true; }
1451  static bool classof(const SDNode *N) {
1452    return N->getOpcode() == ISD::BlockAddress ||
1453           N->getOpcode() == ISD::TargetBlockAddress;
1454  }
1455};
1456
1457class EHLabelSDNode : public SDNode {
1458  SDUse Chain;
1459  MCSymbol *Label;
1460  friend class SelectionDAG;
1461  EHLabelSDNode(DebugLoc dl, SDValue ch, MCSymbol *L)
1462    : SDNode(ISD::EH_LABEL, dl, getSDVTList(MVT::Other)), Label(L) {
1463    InitOperands(&Chain, ch);
1464  }
1465public:
1466  MCSymbol *getLabel() const { return Label; }
1467
1468  static bool classof(const EHLabelSDNode *) { return true; }
1469  static bool classof(const SDNode *N) {
1470    return N->getOpcode() == ISD::EH_LABEL;
1471  }
1472};
1473
1474class ExternalSymbolSDNode : public SDNode {
1475  const char *Symbol;
1476  unsigned char TargetFlags;
1477
1478  friend class SelectionDAG;
1479  ExternalSymbolSDNode(bool isTarget, const char *Sym, unsigned char TF, EVT VT)
1480    : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol,
1481             DebugLoc(), getSDVTList(VT)), Symbol(Sym), TargetFlags(TF) {
1482  }
1483public:
1484
1485  const char *getSymbol() const { return Symbol; }
1486  unsigned char getTargetFlags() const { return TargetFlags; }
1487
1488  static bool classof(const ExternalSymbolSDNode *) { return true; }
1489  static bool classof(const SDNode *N) {
1490    return N->getOpcode() == ISD::ExternalSymbol ||
1491           N->getOpcode() == ISD::TargetExternalSymbol;
1492  }
1493};
1494
1495class CondCodeSDNode : public SDNode {
1496  ISD::CondCode Condition;
1497  friend class SelectionDAG;
1498  explicit CondCodeSDNode(ISD::CondCode Cond)
1499    : SDNode(ISD::CONDCODE, DebugLoc(), getSDVTList(MVT::Other)),
1500      Condition(Cond) {
1501  }
1502public:
1503
1504  ISD::CondCode get() const { return Condition; }
1505
1506  static bool classof(const CondCodeSDNode *) { return true; }
1507  static bool classof(const SDNode *N) {
1508    return N->getOpcode() == ISD::CONDCODE;
1509  }
1510};
1511
1512/// CvtRndSatSDNode - NOTE: avoid using this node as this may disappear in the
1513/// future and most targets don't support it.
1514class CvtRndSatSDNode : public SDNode {
1515  ISD::CvtCode CvtCode;
1516  friend class SelectionDAG;
1517  explicit CvtRndSatSDNode(EVT VT, DebugLoc dl, const SDValue *Ops,
1518                           unsigned NumOps, ISD::CvtCode Code)
1519    : SDNode(ISD::CONVERT_RNDSAT, dl, getSDVTList(VT), Ops, NumOps),
1520      CvtCode(Code) {
1521    assert(NumOps == 5 && "wrong number of operations");
1522  }
1523public:
1524  ISD::CvtCode getCvtCode() const { return CvtCode; }
1525
1526  static bool classof(const CvtRndSatSDNode *) { return true; }
1527  static bool classof(const SDNode *N) {
1528    return N->getOpcode() == ISD::CONVERT_RNDSAT;
1529  }
1530};
1531
1532/// VTSDNode - This class is used to represent EVT's, which are used
1533/// to parameterize some operations.
1534class VTSDNode : public SDNode {
1535  EVT ValueType;
1536  friend class SelectionDAG;
1537  explicit VTSDNode(EVT VT)
1538    : SDNode(ISD::VALUETYPE, DebugLoc(), getSDVTList(MVT::Other)),
1539      ValueType(VT) {
1540  }
1541public:
1542
1543  EVT getVT() const { return ValueType; }
1544
1545  static bool classof(const VTSDNode *) { return true; }
1546  static bool classof(const SDNode *N) {
1547    return N->getOpcode() == ISD::VALUETYPE;
1548  }
1549};
1550
1551/// LSBaseSDNode - Base class for LoadSDNode and StoreSDNode
1552///
1553class LSBaseSDNode : public MemSDNode {
1554  //! Operand array for load and store
1555  /*!
1556    \note Moving this array to the base class captures more
1557    common functionality shared between LoadSDNode and
1558    StoreSDNode
1559   */
1560  SDUse Ops[4];
1561public:
1562  LSBaseSDNode(ISD::NodeType NodeTy, DebugLoc dl, SDValue *Operands,
1563               unsigned numOperands, SDVTList VTs, ISD::MemIndexedMode AM,
1564               EVT MemVT, MachineMemOperand *MMO)
1565    : MemSDNode(NodeTy, dl, VTs, MemVT, MMO) {
1566    SubclassData |= AM << 2;
1567    assert(getAddressingMode() == AM && "MemIndexedMode encoding error!");
1568    InitOperands(Ops, Operands, numOperands);
1569    assert((getOffset().getOpcode() == ISD::UNDEF || isIndexed()) &&
1570           "Only indexed loads and stores have a non-undef offset operand");
1571  }
1572
1573  const SDValue &getOffset() const {
1574    return getOperand(getOpcode() == ISD::LOAD ? 2 : 3);
1575  }
1576
1577  /// getAddressingMode - Return the addressing mode for this load or store:
1578  /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
1579  ISD::MemIndexedMode getAddressingMode() const {
1580    return ISD::MemIndexedMode((SubclassData >> 2) & 7);
1581  }
1582
1583  /// isIndexed - Return true if this is a pre/post inc/dec load/store.
1584  bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
1585
1586  /// isUnindexed - Return true if this is NOT a pre/post inc/dec load/store.
1587  bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
1588
1589  static bool classof(const LSBaseSDNode *) { return true; }
1590  static bool classof(const SDNode *N) {
1591    return N->getOpcode() == ISD::LOAD ||
1592           N->getOpcode() == ISD::STORE;
1593  }
1594};
1595
1596/// LoadSDNode - This class is used to represent ISD::LOAD nodes.
1597///
1598class LoadSDNode : public LSBaseSDNode {
1599  friend class SelectionDAG;
1600  LoadSDNode(SDValue *ChainPtrOff, DebugLoc dl, SDVTList VTs,
1601             ISD::MemIndexedMode AM, ISD::LoadExtType ETy, EVT MemVT,
1602             MachineMemOperand *MMO)
1603    : LSBaseSDNode(ISD::LOAD, dl, ChainPtrOff, 3,
1604                   VTs, AM, MemVT, MMO) {
1605    SubclassData |= (unsigned short)ETy;
1606    assert(getExtensionType() == ETy && "LoadExtType encoding error!");
1607    assert(readMem() && "Load MachineMemOperand is not a load!");
1608    assert(!writeMem() && "Load MachineMemOperand is a store!");
1609  }
1610public:
1611
1612  /// getExtensionType - Return whether this is a plain node,
1613  /// or one of the varieties of value-extending loads.
1614  ISD::LoadExtType getExtensionType() const {
1615    return ISD::LoadExtType(SubclassData & 3);
1616  }
1617
1618  const SDValue &getBasePtr() const { return getOperand(1); }
1619  const SDValue &getOffset() const { return getOperand(2); }
1620
1621  static bool classof(const LoadSDNode *) { return true; }
1622  static bool classof(const SDNode *N) {
1623    return N->getOpcode() == ISD::LOAD;
1624  }
1625};
1626
1627/// StoreSDNode - This class is used to represent ISD::STORE nodes.
1628///
1629class StoreSDNode : public LSBaseSDNode {
1630  friend class SelectionDAG;
1631  StoreSDNode(SDValue *ChainValuePtrOff, DebugLoc dl, SDVTList VTs,
1632              ISD::MemIndexedMode AM, bool isTrunc, EVT MemVT,
1633              MachineMemOperand *MMO)
1634    : LSBaseSDNode(ISD::STORE, dl, ChainValuePtrOff, 4,
1635                   VTs, AM, MemVT, MMO) {
1636    SubclassData |= (unsigned short)isTrunc;
1637    assert(isTruncatingStore() == isTrunc && "isTrunc encoding error!");
1638    assert(!readMem() && "Store MachineMemOperand is a load!");
1639    assert(writeMem() && "Store MachineMemOperand is not a store!");
1640  }
1641public:
1642
1643  /// isTruncatingStore - Return true if the op does a truncation before store.
1644  /// For integers this is the same as doing a TRUNCATE and storing the result.
1645  /// For floats, it is the same as doing an FP_ROUND and storing the result.
1646  bool isTruncatingStore() const { return SubclassData & 1; }
1647
1648  const SDValue &getValue() const { return getOperand(1); }
1649  const SDValue &getBasePtr() const { return getOperand(2); }
1650  const SDValue &getOffset() const { return getOperand(3); }
1651
1652  static bool classof(const StoreSDNode *) { return true; }
1653  static bool classof(const SDNode *N) {
1654    return N->getOpcode() == ISD::STORE;
1655  }
1656};
1657
1658/// MachineSDNode - An SDNode that represents everything that will be needed
1659/// to construct a MachineInstr. These nodes are created during the
1660/// instruction selection proper phase.
1661///
1662class MachineSDNode : public SDNode {
1663public:
1664  typedef MachineMemOperand **mmo_iterator;
1665
1666private:
1667  friend class SelectionDAG;
1668  MachineSDNode(unsigned Opc, const DebugLoc DL, SDVTList VTs)
1669    : SDNode(Opc, DL, VTs), MemRefs(0), MemRefsEnd(0) {}
1670
1671  /// LocalOperands - Operands for this instruction, if they fit here. If
1672  /// they don't, this field is unused.
1673  SDUse LocalOperands[4];
1674
1675  /// MemRefs - Memory reference descriptions for this instruction.
1676  mmo_iterator MemRefs;
1677  mmo_iterator MemRefsEnd;
1678
1679public:
1680  mmo_iterator memoperands_begin() const { return MemRefs; }
1681  mmo_iterator memoperands_end() const { return MemRefsEnd; }
1682  bool memoperands_empty() const { return MemRefsEnd == MemRefs; }
1683
1684  /// setMemRefs - Assign this MachineSDNodes's memory reference descriptor
1685  /// list. This does not transfer ownership.
1686  void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) {
1687    MemRefs = NewMemRefs;
1688    MemRefsEnd = NewMemRefsEnd;
1689  }
1690
1691  static bool classof(const MachineSDNode *) { return true; }
1692  static bool classof(const SDNode *N) {
1693    return N->isMachineOpcode();
1694  }
1695};
1696
1697class SDNodeIterator : public std::iterator<std::forward_iterator_tag,
1698                                            SDNode, ptrdiff_t> {
1699  SDNode *Node;
1700  unsigned Operand;
1701
1702  SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
1703public:
1704  bool operator==(const SDNodeIterator& x) const {
1705    return Operand == x.Operand;
1706  }
1707  bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
1708
1709  const SDNodeIterator &operator=(const SDNodeIterator &I) {
1710    assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
1711    Operand = I.Operand;
1712    return *this;
1713  }
1714
1715  pointer operator*() const {
1716    return Node->getOperand(Operand).getNode();
1717  }
1718  pointer operator->() const { return operator*(); }
1719
1720  SDNodeIterator& operator++() {                // Preincrement
1721    ++Operand;
1722    return *this;
1723  }
1724  SDNodeIterator operator++(int) { // Postincrement
1725    SDNodeIterator tmp = *this; ++*this; return tmp;
1726  }
1727  size_t operator-(SDNodeIterator Other) const {
1728    assert(Node == Other.Node &&
1729           "Cannot compare iterators of two different nodes!");
1730    return Operand - Other.Operand;
1731  }
1732
1733  static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
1734  static SDNodeIterator end  (SDNode *N) {
1735    return SDNodeIterator(N, N->getNumOperands());
1736  }
1737
1738  unsigned getOperand() const { return Operand; }
1739  const SDNode *getNode() const { return Node; }
1740};
1741
1742template <> struct GraphTraits<SDNode*> {
1743  typedef SDNode NodeType;
1744  typedef SDNodeIterator ChildIteratorType;
1745  static inline NodeType *getEntryNode(SDNode *N) { return N; }
1746  static inline ChildIteratorType child_begin(NodeType *N) {
1747    return SDNodeIterator::begin(N);
1748  }
1749  static inline ChildIteratorType child_end(NodeType *N) {
1750    return SDNodeIterator::end(N);
1751  }
1752};
1753
1754/// LargestSDNode - The largest SDNode class.
1755///
1756typedef LoadSDNode LargestSDNode;
1757
1758/// MostAlignedSDNode - The SDNode class with the greatest alignment
1759/// requirement.
1760///
1761typedef GlobalAddressSDNode MostAlignedSDNode;
1762
1763namespace ISD {
1764  /// isNormalLoad - Returns true if the specified node is a non-extending
1765  /// and unindexed load.
1766  inline bool isNormalLoad(const SDNode *N) {
1767    const LoadSDNode *Ld = dyn_cast<LoadSDNode>(N);
1768    return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD &&
1769      Ld->getAddressingMode() == ISD::UNINDEXED;
1770  }
1771
1772  /// isNON_EXTLoad - Returns true if the specified node is a non-extending
1773  /// load.
1774  inline bool isNON_EXTLoad(const SDNode *N) {
1775    return isa<LoadSDNode>(N) &&
1776      cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;
1777  }
1778
1779  /// isEXTLoad - Returns true if the specified node is a EXTLOAD.
1780  ///
1781  inline bool isEXTLoad(const SDNode *N) {
1782    return isa<LoadSDNode>(N) &&
1783      cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD;
1784  }
1785
1786  /// isSEXTLoad - Returns true if the specified node is a SEXTLOAD.
1787  ///
1788  inline bool isSEXTLoad(const SDNode *N) {
1789    return isa<LoadSDNode>(N) &&
1790      cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD;
1791  }
1792
1793  /// isZEXTLoad - Returns true if the specified node is a ZEXTLOAD.
1794  ///
1795  inline bool isZEXTLoad(const SDNode *N) {
1796    return isa<LoadSDNode>(N) &&
1797      cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD;
1798  }
1799
1800  /// isUNINDEXEDLoad - Returns true if the specified node is an unindexed load.
1801  ///
1802  inline bool isUNINDEXEDLoad(const SDNode *N) {
1803    return isa<LoadSDNode>(N) &&
1804      cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
1805  }
1806
1807  /// isNormalStore - Returns true if the specified node is a non-truncating
1808  /// and unindexed store.
1809  inline bool isNormalStore(const SDNode *N) {
1810    const StoreSDNode *St = dyn_cast<StoreSDNode>(N);
1811    return St && !St->isTruncatingStore() &&
1812      St->getAddressingMode() == ISD::UNINDEXED;
1813  }
1814
1815  /// isNON_TRUNCStore - Returns true if the specified node is a non-truncating
1816  /// store.
1817  inline bool isNON_TRUNCStore(const SDNode *N) {
1818    return isa<StoreSDNode>(N) && !cast<StoreSDNode>(N)->isTruncatingStore();
1819  }
1820
1821  /// isTRUNCStore - Returns true if the specified node is a truncating
1822  /// store.
1823  inline bool isTRUNCStore(const SDNode *N) {
1824    return isa<StoreSDNode>(N) && cast<StoreSDNode>(N)->isTruncatingStore();
1825  }
1826
1827  /// isUNINDEXEDStore - Returns true if the specified node is an
1828  /// unindexed store.
1829  inline bool isUNINDEXEDStore(const SDNode *N) {
1830    return isa<StoreSDNode>(N) &&
1831      cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
1832  }
1833}
1834
1835} // end llvm namespace
1836
1837#endif
1838