SelectionDAGNodes.h revision 52b7ec68d221d65aacbe9b55de325c9b7370b59d
163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//                     The LLVM Compiler Infrastructure
463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
1063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file declares the SDNode class and derived classes, which are used to
1163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// represent the nodes and operations present in a SelectionDAG.  These nodes
1263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// and operations are machine code level operations, with some similarities to
1363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the GCC RTL representation.
1463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//
1563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Clients should include the SelectionDAG.h file instead of this file directly.
1663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//
1763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===//
1863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H
2063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#define LLVM_CODEGEN_SELECTIONDAGNODES_H
2163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
224fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman#include "llvm/Constants.h"
2355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman#include "llvm/Instructions.h"
24583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/ADT/FoldingSet.h"
251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h"
26fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist_node.h"
27944520f38c79f3cbf1abfca92a5414458d639029Lang Hames#include "llvm/ADT/SmallPtrSet.h"
289008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman#include "llvm/ADT/SmallVector.h"
29fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/STLExtras.h"
304031d59685cef09fad651dd39020ccca4c13ef89Dan Gohman#include "llvm/CodeGen/ISDOpcodes.h"
31d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng#include "llvm/CodeGen/ValueTypes.h"
3236b5c1338a03453ba1c110b120269ca972fb65a3Dan Gohman#include "llvm/CodeGen/MachineMemOperand.h"
33101b25c028706c61c7dd9fb92d0b3c1541cb12b6Nate Begeman#include "llvm/Support/MathExtras.h"
341f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
351e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel#include "llvm/Support/DebugLoc.h"
3663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <cassert>
3763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
3863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace llvm {
3963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
4063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SelectionDAG;
4163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalValue;
4263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass MachineBasicBlock;
43d6594ae54cfde4db4d30272192645c0a45fb9902Evan Chengclass MachineConstantPoolValue;
4463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode;
4583489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patelclass Value;
467561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattnerclass MCSymbol;
4776c1b97e4020faace8c95a127f1eab66c278fb58Chris Lattnertemplate <typename T> struct DenseMapInfo;
4863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate <typename T> struct simplify_type;
498e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate <typename T> struct ilist_traits;
5063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
51cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SDNode *N);
52cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene
530b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner/// SDVTList - This represents a list of ValueType's that has been intern'd by
540b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner/// a SelectionDAG.  Instances of this simple value class are returned by
550b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner/// SelectionDAG::getVTList(...).
560b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner///
570b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattnerstruct SDVTList {
58e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  const EVT *VTs;
59168840662e66ef8eaff6cd6a9389c4451f606e73Dan Gohman  unsigned int NumVTs;
600b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner};
610b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner
6263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace ISD {
63322dcd379eb19ea8d01478a661920ea1ce62fa0dChris Lattner  /// Node predicates
64322dcd379eb19ea8d01478a661920ea1ce62fa0dChris Lattner
65a8df166fbef047c90adba3c673162a1b1f6681c4Evan Cheng  /// isBuildVectorAllOnes - Return true if the specified node is a
66322dcd379eb19ea8d01478a661920ea1ce62fa0dChris Lattner  /// BUILD_VECTOR where all of the elements are ~0 or undef.
67a8df166fbef047c90adba3c673162a1b1f6681c4Evan Cheng  bool isBuildVectorAllOnes(const SDNode *N);
684a147842eb24a7611fcd7bfb37c55185b4664927Evan Cheng
694a147842eb24a7611fcd7bfb37c55185b4664927Evan Cheng  /// isBuildVectorAllZeros - Return true if the specified node is a
704a147842eb24a7611fcd7bfb37c55185b4664927Evan Cheng  /// BUILD_VECTOR where all of the elements are 0 or undef.
714a147842eb24a7611fcd7bfb37c55185b4664927Evan Cheng  bool isBuildVectorAllZeros(const SDNode *N);
72bb81d97feb396a8bb21d074db1c57e9f66525f40Evan Cheng
73efec751a1b786724862ceff52748df94873a807eEvan Cheng  /// isScalarToVector - Return true if the specified node is a
74efec751a1b786724862ceff52748df94873a807eEvan Cheng  /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
75efec751a1b786724862ceff52748df94873a807eEvan Cheng  /// element is not an undef.
76efec751a1b786724862ceff52748df94873a807eEvan Cheng  bool isScalarToVector(const SDNode *N);
77b87bdac6a3de4ab83e23bf808f990e4bb7eade5eNadav Rotem
78b87bdac6a3de4ab83e23bf808f990e4bb7eade5eNadav Rotem  /// allOperandsUndef - Return true if the node has at least one operand
79b87bdac6a3de4ab83e23bf808f990e4bb7eade5eNadav Rotem  /// and all operands of the specified node are ISD::UNDEF.
80b87bdac6a3de4ab83e23bf808f990e4bb7eade5eNadav Rotem  bool allOperandsUndef(const SDNode *N);
814031d59685cef09fad651dd39020ccca4c13ef89Dan Gohman}  // end llvm:ISD namespace
8263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
8363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===//
84475871a144eb604ddaf37503397ba0941442e5fbDan Gohman/// SDValue - Unlike LLVM values, Selection DAG nodes may return multiple
8563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// values as the result of a computation.  Many nodes return multiple values,
8663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// from loads (which define a token and a return value) to ADDC (which returns
8763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// a result and a carry value), to calls (which may return an arbitrary number
8863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of values).
8963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner///
9063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// As such, each use of a SelectionDAG computation must indicate the node that
9163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// computes it as well as which return value to use from that node.  This pair
92475871a144eb604ddaf37503397ba0941442e5fbDan Gohman/// of information is represented with the SDValue value type.
9363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner///
94475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanclass SDValue {
95ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDNode *Node;       // The node defining the value we are using.
9663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  unsigned ResNo;     // Which return value of the node we are using.
9799a6cb92d173c142073416c81efe6d3daeb80b49Gabor Greifpublic:
98ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDValue() : Node(0), ResNo(0) {}
99ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDValue(SDNode *node, unsigned resno) : Node(node), ResNo(resno) {}
10063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
10199a6cb92d173c142073416c81efe6d3daeb80b49Gabor Greif  /// get the index which selects a specific result in the SDNode
10299a6cb92d173c142073416c81efe6d3daeb80b49Gabor Greif  unsigned getResNo() const { return ResNo; }
10399a6cb92d173c142073416c81efe6d3daeb80b49Gabor Greif
104ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  /// get the SDNode which holds the desired result
105ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  SDNode *getNode() const { return Node; }
106ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif
107ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  /// set the SDNode
108ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  void setNode(SDNode *N) { Node = N; }
109ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif
1109f06cb4fe5214c93cbe68b5359b43891875b30e5Chris Lattner  inline SDNode *operator->() const { return Node; }
1119f06cb4fe5214c93cbe68b5359b43891875b30e5Chris Lattner
112475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool operator==(const SDValue &O) const {
113ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return Node == O.Node && ResNo == O.ResNo;
11463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
115475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool operator!=(const SDValue &O) const {
11663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner    return !operator==(O);
11763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
118475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool operator<(const SDValue &O) const {
119ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return Node < O.Node || (Node == O.Node && ResNo < O.ResNo);
12063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
12163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
122475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getValue(unsigned R) const {
123ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return SDValue(Node, R);
12463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
12563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
126917be6814e0a4e529d290be5d806a054bbbc4a27Evan Cheng  // isOperandOf - Return true if this node is an operand of N.
127917be6814e0a4e529d290be5d806a054bbbc4a27Evan Cheng  bool isOperandOf(SDNode *N) const;
128bfa284f69752c54f81bffc2b0d15d5c1e618a659Evan Cheng
12963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// getValueType - Return the ValueType of the referenced return value.
13063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  ///
131e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  inline EVT getValueType() const;
132ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
13383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  /// getValueSizeInBits - Returns the size of the value in bits.
1344fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  ///
1354fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  unsigned getValueSizeInBits() const {
13683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    return getValueType().getSizeInBits();
1374fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  }
1384fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman
13963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  // Forwarding methods - These forward to the corresponding methods in SDNode.
14063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  inline unsigned getOpcode() const;
14163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  inline unsigned getNumOperands() const;
142475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  inline const SDValue &getOperand(unsigned i) const;
143c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  inline uint64_t getConstantOperandVal(unsigned i) const;
144c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  inline bool isTargetMemoryOpcode() const;
1450f66a9172175aa7c3055333358170581c999219bNate Begeman  inline bool isTargetOpcode() const;
146e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  inline bool isMachineOpcode() const;
147e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  inline unsigned getMachineOpcode() const;
148124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johannesen  inline const DebugLoc getDebugLoc() const;
14952b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem  inline void dump() const;
15052b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem  inline void dumpr() const;
151fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
152572dee71af1313e6742e1dfd5274fff326b9ef1cChris Lattner  /// reachesChainWithoutSideEffects - Return true if this operand (which must
153fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// be a chain) reaches the specified operand without crossing any
154572dee71af1313e6742e1dfd5274fff326b9ef1cChris Lattner  /// side-effecting instructions.  In practice, this looks through token
155572dee71af1313e6742e1dfd5274fff326b9ef1cChris Lattner  /// factors and non-volatile loads.  In order to remain efficient, this only
156572dee71af1313e6742e1dfd5274fff326b9ef1cChris Lattner  /// looks a couple of nodes in, it does not do an exhaustive search.
157fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  bool reachesChainWithoutSideEffects(SDValue Dest,
158dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein                                      unsigned Depth = 2) const;
159fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1607a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  /// use_empty - Return true if there are no nodes using value ResNo
161ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  /// of Node.
1627a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  ///
163e1b50639a860934685dff840e1826b16dbe6a344Dan Gohman  inline bool use_empty() const;
1647a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman
165231fe7054160d2953e0cc6635f9a171a4b311af2Gabor Greif  /// hasOneUse - Return true if there is exactly one node using value
166ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  /// ResNo of Node.
1677a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  ///
1687a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  inline bool hasOneUse() const;
16963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
17063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
17163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
172475871a144eb604ddaf37503397ba0941442e5fbDan Gohmantemplate<> struct DenseMapInfo<SDValue> {
173fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  static inline SDValue getEmptyKey() {
174fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    return SDValue((SDNode*)-1, -1U);
175dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
176fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  static inline SDValue getTombstoneKey() {
177475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    return SDValue((SDNode*)-1, 0);
178dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
179475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  static unsigned getHashValue(const SDValue &Val) {
180ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return ((unsigned)((uintptr_t)Val.getNode() >> 4) ^
181ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif            (unsigned)((uintptr_t)Val.getNode() >> 9)) + Val.getResNo();
182c63d391c9a886d58c6a53a7f565fbd544b076d9fEvan Cheng  }
183475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
18476c1b97e4020faace8c95a127f1eab66c278fb58Chris Lattner    return LHS == RHS;
18576c1b97e4020faace8c95a127f1eab66c278fb58Chris Lattner  }
186c63d391c9a886d58c6a53a7f565fbd544b076d9fEvan Cheng};
1874bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattnertemplate <> struct isPodLike<SDValue> { static const bool value = true; };
1884bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattner
189c63d391c9a886d58c6a53a7f565fbd544b076d9fEvan Cheng
19063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// simplify_type specializations - Allow casting operators to work directly on
191475871a144eb604ddaf37503397ba0941442e5fbDan Gohman/// SDValues as if they were SDNode*'s.
192475871a144eb604ddaf37503397ba0941442e5fbDan Gohmantemplate<> struct simplify_type<SDValue> {
193dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  typedef SDNode* SimpleType;
194475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  static SimpleType getSimplifiedValue(const SDValue &Val) {
195ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return static_cast<SimpleType>(Val.getNode());
196dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
197dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein};
198475871a144eb604ddaf37503397ba0941442e5fbDan Gohmantemplate<> struct simplify_type<const SDValue> {
199dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  typedef SDNode* SimpleType;
200475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  static SimpleType getSimplifiedValue(const SDValue &Val) {
201ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return static_cast<SimpleType>(Val.getNode());
202dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
203dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein};
204dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
205e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman/// SDUse - Represents a use of a SDNode. This class holds an SDValue,
206e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman/// which records the SDNode being used and the result number, a
207e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman/// pointer to the SDNode using the value, and Next and Prev pointers,
208e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman/// which link together all the uses of an SDNode.
209e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman///
2109cac5259fe237120a0c347d6d14e549005148f1bRoman Levensteinclass SDUse {
211e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// Val - The value being used.
212e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDValue Val;
213e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// User - The user of this value.
214e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDNode *User;
215fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// Prev, Next - Pointers to the uses list of the SDNode referred by
216dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  /// this operand.
2179cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse **Prev, *Next;
218dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
219e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDUse(const SDUse &U);          // Do not implement
220e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void operator=(const SDUse &U); // Do not implement
221dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
222e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmanpublic:
223e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDUse() : Val(), User(NULL), Prev(NULL), Next(NULL) {}
224dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
225e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// Normally SDUse will just implicitly convert to an SDValue that it holds.
226e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  operator const SDValue&() const { return Val; }
227dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
228e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// If implicit conversion to SDValue doesn't work, the get() method returns
229e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// the SDValue.
230e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  const SDValue &get() const { return Val; }
231fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
232e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getUser - This returns the SDNode that contains this Use.
23302819257a625d0d9a186845354baadd6e8f1890bRoman Levenstein  SDNode *getUser() { return User; }
2349cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein
235e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getNext - Get the next SDUse in the use list.
236e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDUse *getNext() const { return Next; }
2379cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein
238e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getNode - Convenience function for get().getNode().
239e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDNode *getNode() const { return Val.getNode(); }
240e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getResNo - Convenience function for get().getResNo().
241e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  unsigned getResNo() const { return Val.getResNo(); }
242e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getValueType - Convenience function for get().getValueType().
243e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT getValueType() const { return Val.getValueType(); }
2449cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein
245e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// operator== - Convenience function for get().operator==
246e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  bool operator==(const SDValue &V) const {
247e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return Val == V;
2489cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  }
249fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
250e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// operator!= - Convenience function for get().operator!=
251e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  bool operator!=(const SDValue &V) const {
252e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return Val != V;
2539cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  }
2549cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein
255e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// operator< - Convenience function for get().operator<
256e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  bool operator<(const SDValue &V) const {
257e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return Val < V;
2589cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  }
2599cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein
260e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmanprivate:
261e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  friend class SelectionDAG;
262e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  friend class SDNode;
263e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
264e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void setUser(SDNode *p) { User = p; }
265e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
266e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// set - Remove this use from its existing use list, assign it the
267e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// given value, and add it to the new value's node's use list.
268e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  inline void set(const SDValue &V);
269e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// setInitial - like set, but only supports initializing a newly-allocated
270e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// SDUse with a non-null value.
271e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  inline void setInitial(const SDValue &V);
272e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// setNode - like set, but only sets the Node portion of the value,
273e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// leaving the ResNo portion unmodified.
274e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  inline void setNode(SDNode *N);
275e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
2769cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  void addToList(SDUse **List) {
277dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    Next = *List;
278dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    if (Next) Next->Prev = &Next;
279dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    Prev = List;
280dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    *List = this;
281dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
282dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
283dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  void removeFromList() {
284dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    *Prev = Next;
285dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    if (Next) Next->Prev = Prev;
286dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
287dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein};
288dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
289dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein/// simplify_type specializations - Allow casting operators to work directly on
290475871a144eb604ddaf37503397ba0941442e5fbDan Gohman/// SDValues as if they were SDNode*'s.
2919cac5259fe237120a0c347d6d14e549005148f1bRoman Levensteintemplate<> struct simplify_type<SDUse> {
29263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  typedef SDNode* SimpleType;
2939cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  static SimpleType getSimplifiedValue(const SDUse &Val) {
294e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return static_cast<SimpleType>(Val.getNode());
29563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
29663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
2979cac5259fe237120a0c347d6d14e549005148f1bRoman Levensteintemplate<> struct simplify_type<const SDUse> {
29863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  typedef SDNode* SimpleType;
2999cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  static SimpleType getSimplifiedValue(const SDUse &Val) {
300e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return static_cast<SimpleType>(Val.getNode());
30163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
30263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
30363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
30463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
30563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDNode - Represents one node in the SelectionDAG.
30663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner///
307fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass SDNode : public FoldingSetNode, public ilist_node<SDNode> {
308dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levensteinprivate:
3090442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner  /// NodeType - The operation that this node performs.
3100442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner  ///
311c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  int16_t NodeType;
312fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
31363e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  /// OperandsNeedDelete - This is true if OperandList was new[]'d.  If true,
31463e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  /// then they will be delete[]'d when the node is destroyed.
315c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  uint16_t OperandsNeedDelete : 1;
3160442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner
31706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  /// HasDebugValue - This tracks whether this node has one or more dbg_value
31806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  /// nodes corresponding to it.
31906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  uint16_t HasDebugValue : 1;
32006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
321ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohmanprotected:
322ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// SubclassData - This member is defined by this class, but is not used for
323ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// anything.  Subclasses can use it to hold whatever state they find useful.
324ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// This field is initialized to zero by the ctor.
32506a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  uint16_t SubclassData : 14;
326ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman
327ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohmanprivate:
328b9ee9e60a905b90fa3e84c5c6091af6e5a0382d2Evan Cheng  /// NodeId - Unique id per SDNode in the DAG.
329b9ee9e60a905b90fa3e84c5c6091af6e5a0382d2Evan Cheng  int NodeId;
3300442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner
331f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  /// OperandList - The values that are used by this operation.
3320442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner  ///
3339cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse *OperandList;
334fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
335f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  /// ValueList - The types of the values this node defines.  SDNode's may
336f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  /// define multiple values simultaneously.
337e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  const EVT *ValueList;
33863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
339e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// UseList - List of uses for this SDNode.
340e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  SDUse *UseList;
341dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
3428f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman  /// NumOperands/NumValues - The number of entries in the Operand/Value list.
3438f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman  unsigned short NumOperands, NumValues;
3448f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman
3458f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman  /// debugLoc - source line information.
3468f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman  DebugLoc debugLoc;
3478f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman
348e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// getValueTypeList - Return a pointer to the specified value type.
349e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  static const EVT *getValueTypeList(EVT VT);
350e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
351e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  friend class SelectionDAG;
352e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  friend struct ilist_traits<SDNode>;
353dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
35463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
35563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  //===--------------------------------------------------------------------===//
35663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  //  Accessors
35763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  //
358e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
359e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// getOpcode - Return the SelectionDAG opcode value for this node. For
360e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// pre-isel nodes (those for which isMachineOpcode returns false), these
361e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// are the opcode values in the ISD and <target>ISD namespaces. For
362e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// post-isel opcodes, see getMachineOpcode.
363e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned getOpcode()  const { return (unsigned short)NodeType; }
364e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
365e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// isTargetOpcode - Test if this node has a target-specific opcode (in the
3660f8b53f19d29013ab18f3d444cea1e6305405611Dan Gohman  /// \<target\>ISD namespace).
3670f66a9172175aa7c3055333358170581c999219bNate Begeman  bool isTargetOpcode() const { return NodeType >= ISD::BUILTIN_OP_END; }
368e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
369c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// isTargetMemoryOpcode - Test if this node has a target-specific
370c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// memory-referencing opcode (in the \<target\>ISD namespace and
371c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// greater than FIRST_TARGET_MEMORY_OPCODE).
372c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  bool isTargetMemoryOpcode() const {
373c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    return NodeType >= ISD::FIRST_TARGET_MEMORY_OPCODE;
374c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  }
375c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
376e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// isMachineOpcode - Test if this node has a post-isel opcode, directly
377e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// corresponding to a MachineInstr opcode.
378e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  bool isMachineOpcode() const { return NodeType < 0; }
379e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
380e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// getMachineOpcode - This may only be called if isMachineOpcode returns
381e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// true. It returns the MachineInstr opcode value that the node's opcode
382e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// corresponds to.
383e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned getMachineOpcode() const {
384ec89a364b86ccd943fc6cf3ad8f84825ba1550fdDan Gohman    assert(isMachineOpcode() && "Not a MachineInstr opcode!");
385e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman    return ~NodeType;
3860f66a9172175aa7c3055333358170581c999219bNate Begeman  }
38763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
38806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  /// getHasDebugValue - get this bit.
38906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  bool getHasDebugValue() const { return HasDebugValue; }
39006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
39106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  /// setHasDebugValue - set this bit.
39206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  void setHasDebugValue(bool b) { HasDebugValue = b; }
39306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
3946da38a05f6d904bd4c2bf51d43938e28e00402abDan Gohman  /// use_empty - Return true if there are no uses of this node.
3957a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  ///
396e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  bool use_empty() const { return UseList == NULL; }
3977a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman
3986da38a05f6d904bd4c2bf51d43938e28e00402abDan Gohman  /// hasOneUse - Return true if there is exactly one use of this node.
3997a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  ///
400b9c33c32292d0ae5da2d75623a84a0e7796a2b63Dan Gohman  bool hasOneUse() const {
4017896c9f436a4eda5ec15e882a7505ba482a2fcd0Chris Lattner    return !use_empty() && llvm::next(use_begin()) == use_end();
402b9c33c32292d0ae5da2d75623a84a0e7796a2b63Dan Gohman  }
40363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
4046da38a05f6d904bd4c2bf51d43938e28e00402abDan Gohman  /// use_size - Return the number of uses of this node. This method takes
4057a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  /// time proportional to the number of uses.
4067a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  ///
4077a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman  size_t use_size() const { return std::distance(use_begin(), use_end()); }
4087a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman
409b9ee9e60a905b90fa3e84c5c6091af6e5a0382d2Evan Cheng  /// getNodeId - Return the unique node id.
410b9ee9e60a905b90fa3e84c5c6091af6e5a0382d2Evan Cheng  ///
411b9ee9e60a905b90fa3e84c5c6091af6e5a0382d2Evan Cheng  int getNodeId() const { return NodeId; }
4120442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner
4132e07d33f04c513f3c2da3d7b1acfc098f02c7a6eEvan Cheng  /// setNodeId - Set unique node id.
4142e07d33f04c513f3c2da3d7b1acfc098f02c7a6eEvan Cheng  void setNodeId(int Id) { NodeId = Id; }
4152e07d33f04c513f3c2da3d7b1acfc098f02c7a6eEvan Cheng
4163b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen  /// getDebugLoc - Return the source location info.
417124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johannesen  const DebugLoc getDebugLoc() const { return debugLoc; }
4183b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen
419ab160cf371d6148d49b5401a903dd4ce381b2f8cDale Johannesen  /// setDebugLoc - Set source location info.  Try to avoid this, putting
420ab160cf371d6148d49b5401a903dd4ce381b2f8cDale Johannesen  /// it in the constructor is preferable.
421124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johannesen  void setDebugLoc(const DebugLoc dl) { debugLoc = dl; }
4223b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen
4239cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  /// use_iterator - This class provides iterator support for SDUse
424fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// operands that use a specific SDNode.
425dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  class use_iterator
426f0891be8bdbeeadb39da5575273b6645755fa383Gabor Greif    : public std::iterator<std::forward_iterator_tag, SDUse, ptrdiff_t> {
4279cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein    SDUse *Op;
4289cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein    explicit use_iterator(SDUse *op) : Op(op) {
429dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
430dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    friend class SDNode;
431dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  public:
4327362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greif    typedef std::iterator<std::forward_iterator_tag,
4337362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greif                          SDUse, ptrdiff_t>::reference reference;
4347362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greif    typedef std::iterator<std::forward_iterator_tag,
4357362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greif                          SDUse, ptrdiff_t>::pointer pointer;
436dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
437dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    use_iterator(const use_iterator &I) : Op(I.Op) {}
438dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    use_iterator() : Op(0) {}
439dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
440dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    bool operator==(const use_iterator &x) const {
441dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      return Op == x.Op;
442dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
443dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    bool operator!=(const use_iterator &x) const {
444dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      return !operator==(x);
445dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
446fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
447dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    /// atEnd - return true if this iterator is at the end of uses list.
448dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    bool atEnd() const { return Op == 0; }
449dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
450dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    // Iterator traversal: forward iteration only.
451dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    use_iterator &operator++() {          // Preincrement
452dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      assert(Op && "Cannot increment end iterator!");
453dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      Op = Op->getNext();
454dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      return *this;
455dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
456dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
457dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    use_iterator operator++(int) {        // Postincrement
458dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      use_iterator tmp = *this; ++*this; return tmp;
459dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
460dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
4618968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    /// Retrieve a pointer to the current user node.
4628968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    SDNode *operator*() const {
463dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      assert(Op && "Cannot dereference end iterator!");
4648968450305c28444edc3c272d8752a8db0c2f34aDan Gohman      return Op->getUser();
465dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
466dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
4678968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    SDNode *operator->() const { return operator*(); }
4688968450305c28444edc3c272d8752a8db0c2f34aDan Gohman
4698968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    SDUse &getUse() const { return *Op; }
470dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
471174f938bd042a19d1a840eef6ed162fc938e2fd9Duncan Sands    /// getOperandNo - Retrieve the operand # of this use in its user.
4728968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    ///
4738968450305c28444edc3c272d8752a8db0c2f34aDan Gohman    unsigned getOperandNo() const {
474dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein      assert(Op && "Cannot dereference end iterator!");
4758968450305c28444edc3c272d8752a8db0c2f34aDan Gohman      return (unsigned)(Op - Op->getUser()->OperandList);
476dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
477dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  };
478dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
479dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  /// use_begin/use_end - Provide iteration support to walk over all uses
480dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  /// of an SDNode.
481dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
482dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  use_iterator use_begin() const {
483e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return use_iterator(UseList);
484dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  }
485dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
486dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein  static use_iterator use_end() { return use_iterator(0); }
487dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein
4887ece380440238ad0630a225b85a09a2dbed1165aChris Lattner
489b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner  /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
490b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner  /// indicated value.  This method ignores uses of other values defined by this
491b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner  /// operation.
4924ee621125876cc954cba5280dd9395552755a871Evan Cheng  bool hasNUsesOfValue(unsigned NUses, unsigned Value) const;
4934ee621125876cc954cba5280dd9395552755a871Evan Cheng
49433d5595d667ba4a880bd7fe785724e8197bef70cEvan Cheng  /// hasAnyUseOfValue - Return true if there are any use of the indicated
49533d5595d667ba4a880bd7fe785724e8197bef70cEvan Cheng  /// value. This method ignores uses of other values defined by this operation.
49633d5595d667ba4a880bd7fe785724e8197bef70cEvan Cheng  bool hasAnyUseOfValue(unsigned Value) const;
49733d5595d667ba4a880bd7fe785724e8197bef70cEvan Cheng
4982a6299543fa22f389158409e897fe7099fda3812Dan Gohman  /// isOnlyUserOf - Return true if this node is the only use of N.
499e6e97e66a366cc7d2d103ac58db56e4bfd700b10Evan Cheng  ///
5002a6299543fa22f389158409e897fe7099fda3812Dan Gohman  bool isOnlyUserOf(SDNode *N) const;
501b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner
502917be6814e0a4e529d290be5d806a054bbbc4a27Evan Cheng  /// isOperandOf - Return true if this node is an operand of N.
503e6e97e66a366cc7d2d103ac58db56e4bfd700b10Evan Cheng  ///
504917be6814e0a4e529d290be5d806a054bbbc4a27Evan Cheng  bool isOperandOf(SDNode *N) const;
50580d8eaae05d9bcb25abf6c6f0385ec2554355f26Evan Cheng
506944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// isPredecessorOf - Return true if this node is a predecessor of N.
507944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// NOTE: Implemented on top of hasPredecessor and every bit as
508944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// expensive. Use carefully.
509944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  bool isPredecessorOf(const SDNode *N) const { return N->hasPredecessor(this); }
510944520f38c79f3cbf1abfca92a5414458d639029Lang Hames
511944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// hasPredecessor - Return true if N is a predecessor of this node.
512944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// N is either an operand of this node, or can be reached by recursively
513944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// traversing up the operands.
514944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// NOTE: This is an expensive method. Use it carefully.
515944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  bool hasPredecessor(const SDNode *N) const;
516944520f38c79f3cbf1abfca92a5414458d639029Lang Hames
517944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// hasPredecesorHelper - Return true if N is a predecessor of this node.
518944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// N is either an operand of this node, or can be reached by recursively
519917be6814e0a4e529d290be5d806a054bbbc4a27Evan Cheng  /// traversing up the operands.
520944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// In this helper the Visited and worklist sets are held externally to
521944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// cache predecessors over multiple invocations. If you want to test for
522944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// multiple predecessors this method is preferable to multiple calls to
523944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// hasPredecessor. Be sure to clear Visited and Worklist if the DAG
524944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// changes.
525944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  /// NOTE: This is still very expensive. Use carefully.
526944520f38c79f3cbf1abfca92a5414458d639029Lang Hames  bool hasPredecessorHelper(const SDNode *N,
527944520f38c79f3cbf1abfca92a5414458d639029Lang Hames                            SmallPtrSet<const SDNode *, 32> &Visited,
528944520f38c79f3cbf1abfca92a5414458d639029Lang Hames                            SmallVector<const SDNode *, 16> &Worklist) const;
5297ceebb437ebb18efefe72d8d2d0e9c762c3aa6b3Evan Cheng
53063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// getNumOperands - Return the number of values used by this operation.
53163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  ///
532f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  unsigned getNumOperands() const { return NumOperands; }
53363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
534fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// getConstantOperandVal - Helper method returns the integer value of a
535c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  /// ConstantSDNode operand.
536c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  uint64_t getConstantOperandVal(unsigned Num) const;
537c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng
538475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getOperand(unsigned Num) const {
539f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner    assert(Num < NumOperands && "Invalid child # of SDNode!");
540e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    return OperandList[Num];
54163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
542c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng
5439cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  typedef SDUse* op_iterator;
544f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  op_iterator op_begin() const { return OperandList; }
545f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  op_iterator op_end() const { return OperandList+NumOperands; }
54650f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner
5470b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner  SDVTList getVTList() const {
5480b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner    SDVTList X = { ValueList, NumValues };
5490b3e525a3a6b55b66dc5676675712b26e4c1ed9fChris Lattner    return X;
550f8ca42ff59e01126c8bcfc41c3d35c8b73f1e8b3Douglas Gregor  }
551d23e0f81bc76902052e9198cad3a0d87a412a632Dan Gohman
55229d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// getGluedNode - If this node has a glue operand, return the node
55329d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// to which the glue operand points. Otherwise return NULL.
55429d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  SDNode *getGluedNode() const {
555d23e0f81bc76902052e9198cad3a0d87a412a632Dan Gohman    if (getNumOperands() != 0 &&
556f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner      getOperand(getNumOperands()-1).getValueType() == MVT::Glue)
557d23e0f81bc76902052e9198cad3a0d87a412a632Dan Gohman      return getOperand(getNumOperands()-1).getNode();
558d23e0f81bc76902052e9198cad3a0d87a412a632Dan Gohman    return 0;
559d23e0f81bc76902052e9198cad3a0d87a412a632Dan Gohman  }
560fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman
561fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman  // If this is a pseudo op, like copyfromreg, look to see if there is a
56229d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // real target node glued to it.  If so, return the target node.
56329d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  const SDNode *getGluedMachineNode() const {
564fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    const SDNode *FoundNode = this;
565fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman
56629d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    // Climb up glue edges until a machine-opcode node is found, or the
567fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    // end of the chain is reached.
568fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    while (!FoundNode->isMachineOpcode()) {
56929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner      const SDNode *N = FoundNode->getGluedNode();
570fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman      if (!N) break;
571fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman      FoundNode = N;
572fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    }
573fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman
574fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman    return FoundNode;
575fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman  }
576fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman
57729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// getGluedUser - If this node has a glue value with a user, return
578db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman  /// the user (there is at most one). Otherwise return NULL.
57929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  SDNode *getGluedUser() const {
580db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman    for (use_iterator UI = use_begin(), UE = use_end(); UI != UE; ++UI)
581f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner      if (UI.getUse().get().getValueType() == MVT::Glue)
582db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman        return *UI;
583db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman    return 0;
584db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman  }
585db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman
58663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// getNumValues - Return the number of values defined/returned by this
58763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// operator.
58863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  ///
589f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  unsigned getNumValues() const { return NumValues; }
59063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
59163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// getValueType - Return the type of a specified result.
59263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  ///
593e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT getValueType(unsigned ResNo) const {
594f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner    assert(ResNo < NumValues && "Illegal result number!");
595f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner    return ValueList[ResNo];
59663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
5979eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen
598825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  /// getValueSizeInBits - Returns MVT::getSizeInBits(getValueType(ResNo)).
5994fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  ///
6004fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  unsigned getValueSizeInBits(unsigned ResNo) const {
60183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    return getValueType(ResNo).getSizeInBits();
6024fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman  }
6034fc3d5dac255120e2f0c0b537044fcf56a30fa34Dan Gohman
604e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  typedef const EVT* value_iterator;
605f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  value_iterator value_begin() const { return ValueList; }
606f71e843f651ad94e19f85daa947fe24312b40d11Chris Lattner  value_iterator value_end() const { return ValueList+NumValues; }
60763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
6086e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner  /// getOperationName - Return the opcode of this operation for printing.
6096e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner  ///
610ded5ed873fa7cd85f0b9d7c677b81dddf9a61eaaReid Spencer  std::string getOperationName(const SelectionDAG *G = 0) const;
611144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng  static const char* getIndexedModeName(ISD::MemIndexedMode AM);
61280d6977e90c22313d5a62ac28811e0386a806affStuart Hastings  void print_types(raw_ostream &OS, const SelectionDAG *G) const;
61380d6977e90c22313d5a62ac28811e0386a806affStuart Hastings  void print_details(raw_ostream &OS, const SelectionDAG *G) const;
614944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  void print(raw_ostream &OS, const SelectionDAG *G = 0) const;
61580d6977e90c22313d5a62ac28811e0386a806affStuart Hastings  void printr(raw_ostream &OS, const SelectionDAG *G = 0) const;
616ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
617ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// printrFull - Print a SelectionDAG node and all children down to
618ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// the leaves.  The given SelectionDAG allows target-specific nodes
619ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// to be printed in human-readable form.  Unlike printr, this will
620ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// print the whole DAG, including children that appear multiple
621ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// times.
622ac931c011fae9392b5d68e763ec64ee25181c267David Greene  ///
623ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  void printrFull(raw_ostream &O, const SelectionDAG *G = 0) const;
624ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
625ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// printrWithDepth - Print a SelectionDAG node and children up to
626ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// depth "depth."  The given SelectionDAG allows target-specific
627ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// nodes to be printed in human-readable form.  Unlike printr, this
628ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// will print children that appear multiple times wherever they are
629ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// used.
630ac931c011fae9392b5d68e763ec64ee25181c267David Greene  ///
631ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  void printrWithDepth(raw_ostream &O, const SelectionDAG *G = 0,
632ce6715faa37b2e44edcf400084aa808ae30d7085David Greene                       unsigned depth = 100) const;
633ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
634ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
635cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// dump - Dump this node, for debugging.
63663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  void dump() const;
637ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
638cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// dumpr - Dump (recursively) this node and its use-def subgraph.
63980d6977e90c22313d5a62ac28811e0386a806affStuart Hastings  void dumpr() const;
640ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
641cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// dump - Dump this node, for debugging.
642cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// The given SelectionDAG allows target-specific nodes to be printed
643cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// in human-readable form.
644efe58694050e48b61584b8454434dcd1ad886a71Chris Lattner  void dump(const SelectionDAG *G) const;
645ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
646cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// dumpr - Dump (recursively) this node and its use-def subgraph.
647cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// The given SelectionDAG allows target-specific nodes to be printed
648cb8544fb9e89787f876c37fd1d81ee6c80a10fb5Dan Gohman  /// in human-readable form.
6498fc13cb4f7a2997f993ffdfe6e488046ec6c834eDan Gohman  void dumpr(const SelectionDAG *G) const;
650ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
651ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// dumprFull - printrFull to dbgs().  The given SelectionDAG allows
652ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// target-specific nodes to be printed in human-readable form.
653ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// Unlike dumpr, this will print the whole DAG, including children
654ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// that appear multiple times.
655ac931c011fae9392b5d68e763ec64ee25181c267David Greene  ///
656ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  void dumprFull(const SelectionDAG *G = 0) const;
657ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
658ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// dumprWithDepth - printrWithDepth to dbgs().  The given
659ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// SelectionDAG allows target-specific nodes to be printed in
660ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// human-readable form.  Unlike dumpr, this will print children
661ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  /// that appear multiple times wherever they are used.
662ac931c011fae9392b5d68e763ec64ee25181c267David Greene  ///
663ce6715faa37b2e44edcf400084aa808ae30d7085David Greene  void dumprWithDepth(const SelectionDAG *G = 0, unsigned depth = 100) const;
664ce6715faa37b2e44edcf400084aa808ae30d7085David Greene
66563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
66663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *) { return true; }
66763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
668583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  /// Profile - Gather unique data for the node.
669583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  ///
670b8d2f550b84523e8a73198f98e5d450ec3b4fee7Dan Gohman  void Profile(FoldingSetNodeID &ID) const;
671583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey
672e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// addUse - This method should only be used by the SDUse class.
673109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  ///
674e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void addUse(SDUse &U) { U.addToList(&UseList); }
675e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
676e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmanprotected:
677e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  static SDVTList getSDVTList(EVT VT) {
67863e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner    SDVTList Ret = { getValueTypeList(VT), 1 };
67963e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner    return Ret;
6802d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  }
68163e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner
682fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs, const SDValue *Ops,
683124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johannesen         unsigned NumOps)
68406a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen    : NodeType(Opc), OperandsNeedDelete(true), HasDebugValue(false),
68506a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen      SubclassData(0), NodeId(-1),
6863b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen      OperandList(NumOps ? new SDUse[NumOps] : 0),
6878f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman      ValueList(VTs.VTs), UseList(NULL),
6883b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen      NumOperands(NumOps), NumValues(VTs.NumVTs),
6898f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman      debugLoc(dl) {
6903b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen    for (unsigned i = 0; i != NumOps; ++i) {
6913b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen      OperandList[i].setUser(this);
6923b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen      OperandList[i].setInitial(Ops[i]);
6933b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen    }
694cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
6953b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen  }
6963b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen
6973b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen  /// This constructor adds no operands itself; operands can be
6983b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen  /// set later with InitOperands.
699124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johannesen  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs)
700ae47e461eb0c5501ff985f7af19e1cff554f3af6Dale Johannesen    : NodeType(Opc), OperandsNeedDelete(false), HasDebugValue(false),
701ae47e461eb0c5501ff985f7af19e1cff554f3af6Dale Johannesen      SubclassData(0), NodeId(-1), OperandList(0), ValueList(VTs.VTs),
702ae47e461eb0c5501ff985f7af19e1cff554f3af6Dale Johannesen      UseList(NULL), NumOperands(0), NumValues(VTs.NumVTs),
7038f1174d13d233fe6b8418475df15eeff87a52f37Dan Gohman      debugLoc(dl) {}
704fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
705e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// InitOperands - Initialize the operands list of this with 1 operand.
706e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void InitOperands(SDUse *Ops, const SDValue &Op0) {
707e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setUser(this);
708e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setInitial(Op0);
709e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    NumOperands = 1;
710bc2e26241d507ecd6c79598e5175f90852b716b3Chris Lattner    OperandList = Ops;
711cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
712e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  }
713e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
714e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// InitOperands - Initialize the operands list of this with 2 operands.
715e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1) {
716e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setUser(this);
717e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setInitial(Op0);
718e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setUser(this);
719e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setInitial(Op1);
720e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    NumOperands = 2;
721e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    OperandList = Ops;
722cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
723e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  }
724e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
725e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// InitOperands - Initialize the operands list of this with 3 operands.
726e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
727e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman                    const SDValue &Op2) {
728e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setUser(this);
729e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setInitial(Op0);
730e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setUser(this);
731e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setInitial(Op1);
732e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[2].setUser(this);
733e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[2].setInitial(Op2);
734e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    NumOperands = 3;
735e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    OperandList = Ops;
736cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
737e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  }
738e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
739e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// InitOperands - Initialize the operands list of this with 4 operands.
740e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
741e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman                    const SDValue &Op2, const SDValue &Op3) {
742e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setUser(this);
743e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[0].setInitial(Op0);
744e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setUser(this);
745e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[1].setInitial(Op1);
746e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[2].setUser(this);
747e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[2].setInitial(Op2);
748e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[3].setUser(this);
749e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    Ops[3].setInitial(Op3);
750e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    NumOperands = 4;
751e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    OperandList = Ops;
752cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
753e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  }
754e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
755e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  /// InitOperands - Initialize the operands list of this with N operands.
756e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  void InitOperands(SDUse *Ops, const SDValue *Vals, unsigned N) {
757e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    for (unsigned i = 0; i != N; ++i) {
758e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman      Ops[i].setUser(this);
759e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman      Ops[i].setInitial(Vals[i]);
760dc1adac582fa120861f18ae7221bfe1421fea59fRoman Levenstein    }
761e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    NumOperands = N;
762e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    OperandList = Ops;
763cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    checkForCycles(this);
764bc2e26241d507ecd6c79598e5175f90852b716b3Chris Lattner  }
7650fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
7660fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// DropOperands - Release the operands and set this node to have
767e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// zero operands.
7680fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void DropOperands();
76963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
77063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
77163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
772475871a144eb604ddaf37503397ba0941442e5fbDan Gohman// Define inline functions from the SDValue class.
77363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
774475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline unsigned SDValue::getOpcode() const {
775ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getOpcode();
77663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}
777e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersoninline EVT SDValue::getValueType() const {
778ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getValueType(ResNo);
77963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}
780475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline unsigned SDValue::getNumOperands() const {
781ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getNumOperands();
78263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}
783475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline const SDValue &SDValue::getOperand(unsigned i) const {
784ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getOperand(i);
78563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}
786475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline uint64_t SDValue::getConstantOperandVal(unsigned i) const {
787ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getConstantOperandVal(i);
788c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng}
789475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline bool SDValue::isTargetOpcode() const {
790ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->isTargetOpcode();
7910f66a9172175aa7c3055333358170581c999219bNate Begeman}
792c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmaninline bool SDValue::isTargetMemoryOpcode() const {
793c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  return Node->isTargetMemoryOpcode();
794c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
795475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline bool SDValue::isMachineOpcode() const {
796ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->isMachineOpcode();
797e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman}
798475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline unsigned SDValue::getMachineOpcode() const {
799ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->getMachineOpcode();
8000f66a9172175aa7c3055333358170581c999219bNate Begeman}
801475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline bool SDValue::use_empty() const {
802ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return !Node->hasAnyUseOfValue(ResNo);
803e1b50639a860934685dff840e1826b16dbe6a344Dan Gohman}
804475871a144eb604ddaf37503397ba0941442e5fbDan Gohmaninline bool SDValue::hasOneUse() const {
805ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  return Node->hasNUsesOfValue(1, ResNo);
8067a24cdc4ed5c357e9de4e36a39379e0aa67f6f9cDan Gohman}
807124c7fdd69bd0eebdec8aab7caa2f8779a56d878Dale Johanneseninline const DebugLoc SDValue::getDebugLoc() const {
8083b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen  return Node->getDebugLoc();
8093b1a9c5bceb40a5cf0aecdaf7a389c72a855b52aDale Johannesen}
81052b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Roteminline void SDValue::dump() const {
81152b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem  return Node->dump();
81252b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem}
81352b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Roteminline void SDValue::dumpr() const {
81452b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem  return Node->dumpr();
81552b7ec68d221d65aacbe9b55de325c9b7370b59dNadav Rotem}
816e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman// Define inline functions from the SDUse class.
817e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
818e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmaninline void SDUse::set(const SDValue &V) {
819e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  if (Val.getNode()) removeFromList();
820e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  Val = V;
821e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  if (V.getNode()) V.getNode()->addUse(*this);
822e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman}
823e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
824e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmaninline void SDUse::setInitial(const SDValue &V) {
825e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  Val = V;
826e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  V.getNode()->addUse(*this);
827e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman}
828e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
829e7852d014432a06c783de3c350eb96e686f10f92Dan Gohmaninline void SDUse::setNode(SDNode *N) {
830e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  if (Val.getNode()) removeFromList();
831e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  Val.setNode(N);
832e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  if (N) N->addUse(*this);
833e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman}
834e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman
8353f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// UnarySDNode - This class is used for single-operand SDNodes.  This is solely
8363f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// to allow co-allocation of node operands with the node itself.
8373f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerclass UnarySDNode : public SDNode {
8389cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Op;
8393f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerpublic:
8403edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  UnarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X)
8413edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    : SDNode(Opc, dl, VTs) {
8423edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(&Op, X);
8433edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
8443f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner};
8453f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner
8463f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// BinarySDNode - This class is used for two-operand SDNodes.  This is solely
8473f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// to allow co-allocation of node operands with the node itself.
8483f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerclass BinarySDNode : public SDNode {
8499cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Ops[2];
8503f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerpublic:
8513edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  BinarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y)
8523edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    : SDNode(Opc, dl, VTs) {
8533edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(Ops, X, Y);
8543edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
8553f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner};
8563f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner
8573f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// TernarySDNode - This class is used for three-operand SDNodes. This is solely
8583f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner/// to allow co-allocation of node operands with the node itself.
8593f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerclass TernarySDNode : public SDNode {
8609cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Ops[3];
8613f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattnerpublic:
8623edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  TernarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y,
8633edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen                SDValue Z)
8643edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    : SDNode(Opc, dl, VTs) {
8653edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(Ops, X, Y, Z);
8663edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
8673f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner};
8683f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner
8693f97eb449b08069e3370d4ba7566c60bdbf0babdChris Lattner
870d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattner/// HandleSDNode - This class is used to form a handle around another node that
8717a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// is persistent and is updated across invocations of replaceAllUsesWith on its
872d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattner/// operand.  This node should be directly created by end-users and not added to
873d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattner/// the AllNodes list.
874d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattnerclass HandleSDNode : public SDNode {
8759cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Op;
876d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattnerpublic:
877ef02b815cb37017d8dbac2f18c75bff0aa317163Bill Wendling  // FIXME: Remove the "noinline" attribute once <rdar://problem/5852746> is
878ef02b815cb37017d8dbac2f18c75bff0aa317163Bill Wendling  // fixed.
879aa59c88a6e963cf0f71511ae81784da2873dbc78Bill Wendling#if __GNUC__==4 && __GNUC_MINOR__==2 && defined(__APPLE__) && !defined(__llvm__)
880475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  explicit __attribute__((__noinline__)) HandleSDNode(SDValue X)
88169cedcbcece7e1138c77aac5b34a1377006254c1Bill Wendling#else
882475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  explicit HandleSDNode(SDValue X)
88369cedcbcece7e1138c77aac5b34a1377006254c1Bill Wendling#endif
884b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::HANDLENODE, DebugLoc(), getSDVTList(MVT::Other)) {
885e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman    InitOperands(&Op, X);
886bc2e26241d507ecd6c79598e5175f90852b716b3Chris Lattner  }
887fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  ~HandleSDNode();
888e7852d014432a06c783de3c350eb96e686f10f92Dan Gohman  const SDValue &getValue() const { return Op; }
889d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattner};
890d623e953fc5f46b013994dfa4651cff4d17af159Chris Lattner
89128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang/// Abstact virtual class for operations for memory operations
89228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wangclass MemSDNode : public SDNode {
89328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wangprivate:
8941ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman  // MemoryVT - VT of in-memory value.
895e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT MemoryVT;
8961ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman
897c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanprotected:
898c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MMO - Memory reference information.
899c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineMemOperand *MMO;
90028873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
90128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wangpublic:
902e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT MemoryVT,
903c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman            MachineMemOperand *MMO);
9043edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen
905d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, const SDValue *Ops,
906c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman            unsigned NumOps, EVT MemoryVT, MachineMemOperand *MMO);
907c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
908c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  bool readMem() const { return MMO->isLoad(); }
909c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  bool writeMem() const { return MMO->isStore(); }
9103edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen
91128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// Returns alignment and volatility of the memory access
912101b25c028706c61c7dd9fb92d0b3c1541cb12b6Nate Begeman  unsigned getOriginalAlignment() const {
913c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    return MMO->getBaseAlignment();
914101b25c028706c61c7dd9fb92d0b3c1541cb12b6Nate Begeman  }
915101b25c028706c61c7dd9fb92d0b3c1541cb12b6Nate Begeman  unsigned getAlignment() const {
916c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    return MMO->getAlignment();
917101b25c028706c61c7dd9fb92d0b3c1541cb12b6Nate Begeman  }
918d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
919a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman  /// getRawSubclassData - Return the SubclassData value, which contains an
920c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// encoding of the volatile flag, as well as bits used by subclasses. This
921c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// function should only be used to compute a FoldingSetNodeID value.
922a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman  unsigned getRawSubclassData() const {
923a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    return SubclassData;
924a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman  }
925a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman
9261157f791c967668f0838bb6edb66103c760f1a5bDavid Greene  // We access subclass data here so that we can check consistency
9271157f791c967668f0838bb6edb66103c760f1a5bDavid Greene  // with MachineMemOperand information.
928c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  bool isVolatile() const { return (SubclassData >> 5) & 1; }
9291157f791c967668f0838bb6edb66103c760f1a5bDavid Greene  bool isNonTemporal() const { return (SubclassData >> 6) & 1; }
930d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper  bool isInvariant() const { return (SubclassData >> 7) & 1; }
931c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
93255ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  AtomicOrdering getOrdering() const {
933d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper    return AtomicOrdering((SubclassData >> 8) & 15);
93455ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  }
93555ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  SynchronizationScope getSynchScope() const {
936d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper    return SynchronizationScope((SubclassData >> 12) & 1);
93755ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  }
93855ba816883842e793cdeb32fcb805c4e011b527fEli Friedman
93928873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// Returns the SrcValue and offset that describes the location of the access
940c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  const Value *getSrcValue() const { return MMO->getValue(); }
941c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  int64_t getSrcValueOffset() const { return MMO->getOffset(); }
942d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
943f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman  /// Returns the TBAAInfo that describes the dereference.
944f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman  const MDNode *getTBAAInfo() const { return MMO->getTBAAInfo(); }
945f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman
94695d594cac3737ae1594a391276942a443cac426bRafael Espindola  /// Returns the Ranges that describes the dereference.
94795d594cac3737ae1594a391276942a443cac426bRafael Espindola  const MDNode *getRanges() const { return MMO->getRanges(); }
94895d594cac3737ae1594a391276942a443cac426bRafael Espindola
9491ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman  /// getMemoryVT - Return the type of the in-memory value.
950e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT getMemoryVT() const { return MemoryVT; }
951d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
95228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// getMemOperand - Return a MachineMemOperand object describing the memory
95328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// reference performed by operation.
954c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineMemOperand *getMemOperand() const { return MMO; }
955c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
95640a858f6e71ed8d68779d00c63dad15baded3562Chris Lattner  const MachinePointerInfo &getPointerInfo() const {
95740a858f6e71ed8d68779d00c63dad15baded3562Chris Lattner    return MMO->getPointerInfo();
95840a858f6e71ed8d68779d00c63dad15baded3562Chris Lattner  }
95940a858f6e71ed8d68779d00c63dad15baded3562Chris Lattner
960c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// refineAlignment - Update this MemSDNode's MachineMemOperand information
961c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// to reflect the alignment of NewMMO, if it has a greater alignment.
962c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// This must only be used when the new alignment applies to all users of
963c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// this MachineMemOperand.
964c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  void refineAlignment(const MachineMemOperand *NewMMO) {
965c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    MMO->refineAlignment(NewMMO);
966c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  }
9671ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman
968475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getChain() const { return getOperand(0); }
969475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getBasePtr() const {
9701ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman    return getOperand(getOpcode() == ISD::STORE ? 2 : 1);
9711ea58a52a4296afff10e9db1e54928f38e6d74c6Dan Gohman  }
97228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
97328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Methods to support isa and dyn_cast
97428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  static bool classof(const MemSDNode *) { return true; }
97528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  static bool classof(const SDNode *N) {
976c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang    // For some targets, we lower some target intrinsics to a MemIntrinsicNode
977c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang    // with either an intrinsic or a target opcode.
978e00a8a2a2e11a37fd1ddf2504bd22d225d0994d0Dale Johannesen    return N->getOpcode() == ISD::LOAD                ||
979e00a8a2a2e11a37fd1ddf2504bd22d225d0994d0Dale Johannesen           N->getOpcode() == ISD::STORE               ||
9801de4aa904e9672abfc2e755d798c926d324e2d36Dale Johannesen           N->getOpcode() == ISD::PREFETCH            ||
9810b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
9820b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_SWAP         ||
9830b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
9840b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
9850b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
9860b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
9870b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
9880b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
9890b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
9900b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
9910b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
9920b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX    ||
993327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman           N->getOpcode() == ISD::ATOMIC_LOAD         ||
994327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman           N->getOpcode() == ISD::ATOMIC_STORE        ||
995c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman           N->isTargetMemoryOpcode();
996d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman  }
99728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang};
99828873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
999c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang/// AtomicSDNode - A SDNode reprenting atomic operations.
1000c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang///
100128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wangclass AtomicSDNode : public MemSDNode {
10029cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Ops[4];
1003d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
100455ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  void InitAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope) {
100555ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    // This must match encodeMemSDNodeFlags() in SelectionDAG.cpp.
100655ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    assert((Ordering & 15) == Ordering &&
100755ba816883842e793cdeb32fcb805c4e011b527fEli Friedman           "Ordering may not require more than 4 bits!");
100855ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    assert((SynchScope & 1) == SynchScope &&
100955ba816883842e793cdeb32fcb805c4e011b527fEli Friedman           "SynchScope may not require more than 1 bit!");
1010d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper    SubclassData |= Ordering << 8;
1011d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper    SubclassData |= SynchScope << 12;
101255ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    assert(getOrdering() == Ordering && "Ordering encoding error!");
101355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    assert(getSynchScope() == SynchScope && "Synch-scope encoding error!");
101455ba816883842e793cdeb32fcb805c4e011b527fEli Friedman
1015981a010c095b8fb57422df6fb90b6d802082afc5Eli Friedman    assert((readMem() || getOrdering() <= Monotonic) &&
1016981a010c095b8fb57422df6fb90b6d802082afc5Eli Friedman           "Acquire/Release MachineMemOperand must be a load!");
1017981a010c095b8fb57422df6fb90b6d802082afc5Eli Friedman    assert((writeMem() || getOrdering() <= Monotonic) &&
1018981a010c095b8fb57422df6fb90b6d802082afc5Eli Friedman           "Acquire/Release MachineMemOperand must be a store!");
101955ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  }
102055ba816883842e793cdeb32fcb805c4e011b527fEli Friedman
1021c53361294957b63a9c1e405256c6f0a81db1685cDan Gohmanpublic:
102228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Opc:   opcode for atomic
102328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // VTL:    value type list
102428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Chain:  memory chain for operaand
1025475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Ptr:    address to update as a SDValue
102628873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Cmp:    compare value
102728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Swp:    swap value
102828873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // SrcVal: address to update as a Value (used for MemOperand)
102928873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Align:  alignment of memory
1030e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
10313edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen               SDValue Chain, SDValue Ptr,
103255ba816883842e793cdeb32fcb805c4e011b527fEli Friedman               SDValue Cmp, SDValue Swp, MachineMemOperand *MMO,
103355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1034c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
103555ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    InitAtomic(Ordering, SynchScope);
10363edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(Ops, Chain, Ptr, Cmp, Swp);
10373edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
1038e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1039d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman               SDValue Chain, SDValue Ptr,
104055ba816883842e793cdeb32fcb805c4e011b527fEli Friedman               SDValue Val, MachineMemOperand *MMO,
104155ba816883842e793cdeb32fcb805c4e011b527fEli Friedman               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1042c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
104355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    InitAtomic(Ordering, SynchScope);
10443edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(Ops, Chain, Ptr, Val);
10453edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
1046327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1047327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman               SDValue Chain, SDValue Ptr,
1048327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman               MachineMemOperand *MMO,
1049327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman               AtomicOrdering Ordering, SynchronizationScope SynchScope)
1050327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1051327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman    InitAtomic(Ordering, SynchScope);
1052327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman    InitOperands(Ops, Chain, Ptr);
1053327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  }
1054d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
1055475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getBasePtr() const { return getOperand(1); }
1056475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getVal() const { return getOperand(2); }
105728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
1058d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman  bool isCompareAndSwap() const {
1059d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman    unsigned Op = getOpcode();
10600b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman    return Op == ISD::ATOMIC_CMP_SWAP;
1061e00a8a2a2e11a37fd1ddf2504bd22d225d0994d0Dale Johannesen  }
106228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
106328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  // Methods to support isa and dyn_cast
106428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  static bool classof(const AtomicSDNode *) { return true; }
106528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  static bool classof(const SDNode *N) {
10660b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman    return N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
10670b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_SWAP         ||
10680b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
10690b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
10700b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
10710b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
10720b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
10730b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
10740b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
10750b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
10760b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
1077327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX    ||
1078327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman           N->getOpcode() == ISD::ATOMIC_LOAD         ||
1079327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman           N->getOpcode() == ISD::ATOMIC_STORE;
108028873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  }
1081ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth};
1082ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
1083c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman/// MemIntrinsicSDNode - This SDNode is used for target intrinsics that touch
1084c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman/// memory and need an associated MachineMemOperand. Its opcode may be
10851de4aa904e9672abfc2e755d798c926d324e2d36Dale Johannesen/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, PREFETCH, or a target-specific opcode
10861de4aa904e9672abfc2e755d798c926d324e2d36Dale Johannesen/// with a value not less than FIRST_TARGET_MEMORY_OPCODE.
1087c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wangclass MemIntrinsicSDNode : public MemSDNode {
10883dbc4e350216e197e3014452400f43899f7ad620Dan Gohmanpublic:
10893edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  MemIntrinsicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
10903edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen                     const SDValue *Ops, unsigned NumOps,
1091c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                     EVT MemoryVT, MachineMemOperand *MMO)
1092c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    : MemSDNode(Opc, dl, VTs, Ops, NumOps, MemoryVT, MMO) {
10933edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
1094c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
1095c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  // Methods to support isa and dyn_cast
1096c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  static bool classof(const MemIntrinsicSDNode *) { return true; }
1097c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  static bool classof(const SDNode *N) {
1098c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang    // We lower some target intrinsics to their target opcode
1099c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang    // early a node with a target opcode can be of this class
1100c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang    return N->getOpcode() == ISD::INTRINSIC_W_CHAIN ||
1101c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang           N->getOpcode() == ISD::INTRINSIC_VOID ||
11021de4aa904e9672abfc2e755d798c926d324e2d36Dale Johannesen           N->getOpcode() == ISD::PREFETCH ||
1103c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman           N->isTargetMemoryOpcode();
1104c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  }
1105c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang};
1106c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
11075a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// ShuffleVectorSDNode - This SDNode is used to implement the code generator
11085a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// support for the llvm IR shufflevector instruction.  It combines elements
11095a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// from two input vectors into a new input vector, with the selection and
11105a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// ordering of elements determined by an array of integers, referred to as
11115a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// the shuffle mask.  For input vectors of width N, mask indices of 0..N-1
11125a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// refer to elements from the LHS input, and indices from N to 2N-1 the RHS.
11135a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// An index of -1 is treated as undef, such that the code generator may put
11145a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman/// any value in the corresponding element of the result.
11159008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begemanclass ShuffleVectorSDNode : public SDNode {
11169008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  SDUse Ops[2];
11175a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman
11185a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  // The memory for Mask is owned by the SelectionDAG's OperandAllocator, and
11195a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  // is freed when the SelectionDAG object is destroyed.
11205a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  const int *Mask;
11219008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begemanprotected:
11229008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  friend class SelectionDAG;
1123e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  ShuffleVectorSDNode(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
11245a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman                      const int *M)
11259008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    : SDNode(ISD::VECTOR_SHUFFLE, dl, getSDVTList(VT)), Mask(M) {
11269008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    InitOperands(Ops, N1, N2);
11279008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  }
11289008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begemanpublic:
11299008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
1130ed4c8c633c52a40ad1a3e8687f290be4aeb1f0e8Benjamin Kramer  ArrayRef<int> getMask() const {
1131e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = getValueType(0);
1132ed4c8c633c52a40ad1a3e8687f290be4aeb1f0e8Benjamin Kramer    return makeArrayRef(Mask, VT.getVectorNumElements());
11339008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  }
11349008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  int getMaskElt(unsigned Idx) const {
11359008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    assert(Idx < getValueType(0).getVectorNumElements() && "Idx out of range!");
11369008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    return Mask[Idx];
11379008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  }
11389008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
11399008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  bool isSplat() const { return isSplatMask(Mask, getValueType(0)); }
11409008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  int  getSplatIndex() const {
11419008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    assert(isSplat() && "Cannot get splat index for non-splat!");
11421c40e188c579c49f811eee499af2f371298c758cMon P Wang    EVT VT = getValueType(0);
11431c40e188c579c49f811eee499af2f371298c758cMon P Wang    for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
11441c40e188c579c49f811eee499af2f371298c758cMon P Wang      if (Mask[i] != -1)
11451c40e188c579c49f811eee499af2f371298c758cMon P Wang        return Mask[i];
11461c40e188c579c49f811eee499af2f371298c758cMon P Wang    }
11471c40e188c579c49f811eee499af2f371298c758cMon P Wang    return -1;
11489008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  }
1149e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  static bool isSplatMask(const int *Mask, EVT VT);
11509008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
11519008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  static bool classof(const ShuffleVectorSDNode *) { return true; }
11529008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  static bool classof(const SDNode *N) {
11539008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    return N->getOpcode() == ISD::VECTOR_SHUFFLE;
11549008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  }
11559008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman};
11569008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
115763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantSDNode : public SDNode {
11584fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const ConstantInt *Value;
115963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1160e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  ConstantSDNode(bool isTarget, const ConstantInt *val, EVT VT)
1161fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant,
1162b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner             DebugLoc(), getSDVTList(VT)), Value(val) {
116363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
116463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
116563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
11664fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const ConstantInt *getConstantIntValue() const { return Value; }
11674fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const APInt &getAPIntValue() const { return Value->getValue(); }
11684fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  uint64_t getZExtValue() const { return Value->getZExtValue(); }
11697810bfed5570c192e0714a8fd0e5130a0c38dd2eDan Gohman  int64_t getSExtValue() const { return Value->getSExtValue(); }
117063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1171e368b460a206fafa0d31d5d059b1779b94f7df8cDan Gohman  bool isOne() const { return Value->isOne(); }
11724fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  bool isNullValue() const { return Value->isNullValue(); }
11734fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  bool isAllOnesValue() const { return Value->isAllOnesValue(); }
117463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
117563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const ConstantSDNode *) { return true; }
117663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1177056f9f61d071c6c583951678f2bf543a1316efccChris Lattner    return N->getOpcode() == ISD::Constant ||
1178056f9f61d071c6c583951678f2bf543a1316efccChris Lattner           N->getOpcode() == ISD::TargetConstant;
117963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
118063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
118163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
118263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantFPSDNode : public SDNode {
11834fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const ConstantFP *Value;
118463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1185e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  ConstantFPSDNode(bool isTarget, const ConstantFP *val, EVT VT)
118687503a63d5756f1836f66f4c9723ec0ea30ec3caDale Johannesen    : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP,
1187b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner             DebugLoc(), getSDVTList(VT)), Value(val) {
118863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
118963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
119063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
11914fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const APFloat& getValueAPF() const { return Value->getValueAPF(); }
11924fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  const ConstantFP *getConstantFPValue() const { return Value; }
119363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1194e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isZero - Return true if the value is positive or negative zero.
1195e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isZero() const { return Value->isZero(); }
1196e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
1197e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isNaN - Return true if the value is a NaN.
1198e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isNaN() const { return Value->isNaN(); }
1199e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
120063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// isExactlyValue - We don't rely on operator== working on double values, as
120163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
120263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// As such, this method can be used to do an exact bit-for-bit comparison of
120363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  /// two floating point values.
1204c4dd3c3b519aa2c2ed26ce03a4b1fbb992efeacaDale Johannesen
1205c4dd3c3b519aa2c2ed26ce03a4b1fbb992efeacaDale Johannesen  /// We leave the version with the double argument here because it's just so
1206fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// convenient to write "2.0" and the like.  Without this function we'd
1207c4dd3c3b519aa2c2ed26ce03a4b1fbb992efeacaDale Johannesen  /// have to duplicate its logic everywhere it's called.
12089dd2ce46c58dd05f0835df77f308396715890d66Dale Johannesen  bool isExactlyValue(double V) const {
120923a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    bool ignored;
12109dd2ce46c58dd05f0835df77f308396715890d66Dale Johannesen    // convert is not supported on this type
12114fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    if (&Value->getValueAPF().getSemantics() == &APFloat::PPCDoubleDouble)
12129dd2ce46c58dd05f0835df77f308396715890d66Dale Johannesen      return false;
121384cd0e7fa30af43c47ad9533d84debb144596e48Chris Lattner    APFloat Tmp(V);
12144fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    Tmp.convert(Value->getValueAPF().getSemantics(),
121523a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen                APFloat::rmNearestTiesToEven, &ignored);
121684cd0e7fa30af43c47ad9533d84debb144596e48Chris Lattner    return isExactlyValue(Tmp);
121787503a63d5756f1836f66f4c9723ec0ea30ec3caDale Johannesen  }
1218e6c1742914149d44360fbf05a653041a672282afDale Johannesen  bool isExactlyValue(const APFloat& V) const;
121963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
12207720cb3823d5b5868f9b88b0127277820edcb562Dan Gohman  static bool isValueValidForType(EVT VT, const APFloat& Val);
1221f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen
122263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const ConstantFPSDNode *) { return true; }
122363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1224fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    return N->getOpcode() == ISD::ConstantFP ||
1225ac0d7238258defe72b1aad53d7f48201b91df795Chris Lattner           N->getOpcode() == ISD::TargetConstantFP;
122663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
122763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
122863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
122963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalAddressSDNode : public SDNode {
123046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const GlobalValue *TheGlobal;
12316520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman  int64_t Offset;
12322a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner  unsigned char TargetFlags;
123363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
12340d881dabc1a4e1aefad6dd38de166d8358285638Devang Patel  GlobalAddressSDNode(unsigned Opc, DebugLoc DL, const GlobalValue *GA, EVT VT,
12352a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                      int64_t o, unsigned char TargetFlags);
123663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
123763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
123846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const GlobalValue *getGlobal() const { return TheGlobal; }
12396520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman  int64_t getOffset() const { return Offset; }
12402a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner  unsigned char getTargetFlags() const { return TargetFlags; }
1241a3518a1d6a6a9a7519d3a8d434cde51617c1dc22Sanjiv Gupta  // Return the address space this GlobalAddress belongs to.
1242a3518a1d6a6a9a7519d3a8d434cde51617c1dc22Sanjiv Gupta  unsigned getAddressSpace() const;
124363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
124463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const GlobalAddressSDNode *) { return true; }
124563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1246f6b184981e429ff03742d66cf7111debd9e2bc61Chris Lattner    return N->getOpcode() == ISD::GlobalAddress ||
1247b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio           N->getOpcode() == ISD::TargetGlobalAddress ||
1248b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio           N->getOpcode() == ISD::GlobalTLSAddress ||
1249b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio           N->getOpcode() == ISD::TargetGlobalTLSAddress;
125063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
125163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
125263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
125363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass FrameIndexSDNode : public SDNode {
125463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  int FI;
125563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1256e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  FrameIndexSDNode(int fi, EVT VT, bool isTarg)
1257fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex,
1258b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner      DebugLoc(), getSDVTList(VT)), FI(fi) {
125963e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  }
126063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
126163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
126263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  int getIndex() const { return FI; }
126363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
126463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const FrameIndexSDNode *) { return true; }
126563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1266afb2dd43de61f4585e75d1f3ab93a9ac4b3b7592Chris Lattner    return N->getOpcode() == ISD::FrameIndex ||
1267afb2dd43de61f4585e75d1f3ab93a9ac4b3b7592Chris Lattner           N->getOpcode() == ISD::TargetFrameIndex;
126863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
126963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
127063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
127137efe6764568a3829fee26aba532283131d1a104Nate Begemanclass JumpTableSDNode : public SDNode {
127237efe6764568a3829fee26aba532283131d1a104Nate Begeman  int JTI;
1273f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  unsigned char TargetFlags;
127437efe6764568a3829fee26aba532283131d1a104Nate Begeman  friend class SelectionDAG;
1275e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  JumpTableSDNode(int jti, EVT VT, bool isTarg, unsigned char TF)
127692570c4a1a11cbdaf5ffb13547428dbee1103875Dale Johannesen    : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable,
1277b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner      DebugLoc(), getSDVTList(VT)), JTI(jti), TargetFlags(TF) {
127863e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  }
127937efe6764568a3829fee26aba532283131d1a104Nate Begemanpublic:
1280fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
128159a8cdd36d644fd5d0d7c78c3c02b31f1ba29a95Chris Lattner  int getIndex() const { return JTI; }
1282f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  unsigned char getTargetFlags() const { return TargetFlags; }
1283fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
128437efe6764568a3829fee26aba532283131d1a104Nate Begeman  static bool classof(const JumpTableSDNode *) { return true; }
128537efe6764568a3829fee26aba532283131d1a104Nate Begeman  static bool classof(const SDNode *N) {
128637efe6764568a3829fee26aba532283131d1a104Nate Begeman    return N->getOpcode() == ISD::JumpTable ||
128737efe6764568a3829fee26aba532283131d1a104Nate Begeman           N->getOpcode() == ISD::TargetJumpTable;
128837efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
128937efe6764568a3829fee26aba532283131d1a104Nate Begeman};
129037efe6764568a3829fee26aba532283131d1a104Nate Begeman
129163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantPoolSDNode : public SDNode {
1292d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  union {
129346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Constant *ConstVal;
1294d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    MachineConstantPoolValue *MachineCPVal;
1295d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  } Val;
1296baf4500b3ab128c78932e36f96086c0487c8c7d1Evan Cheng  int Offset;  // It's a MachineConstantPoolValue if top bit is set.
12971606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  unsigned Alignment;  // Minimum alignment requirement of CP (not log2 value).
1298f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  unsigned char TargetFlags;
129963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
130046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  ConstantPoolSDNode(bool isTarget, const Constant *c, EVT VT, int o,
130146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                     unsigned Align, unsigned char TF)
1302ab4ed595385d0b9421c0d45c809ec6324cf11f11Chris Lattner    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1303b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner             DebugLoc(),
1304f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1305d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    assert((int)Offset >= 0 && "Offset is too large");
1306d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    Val.ConstVal = c;
1307d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
1308d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v,
1309e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                     EVT VT, int o, unsigned Align, unsigned char TF)
1310fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1311b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner             DebugLoc(),
1312f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1313d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    assert((int)Offset >= 0 && "Offset is too large");
1314d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    Val.MachineCPVal = v;
1315de551f91d8816632a76a065084caab9fab6aacffDan Gohman    Offset |= 1 << (sizeof(unsigned)*CHAR_BIT-1);
1316d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
131763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
1318f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner
131963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1320d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  bool isMachineConstantPoolEntry() const {
1321d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return (int)Offset < 0;
1322d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
1323d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
132446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const Constant *getConstVal() const {
1325d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    assert(!isMachineConstantPoolEntry() && "Wrong constantpool type");
1326d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return Val.ConstVal;
1327d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
1328d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
1329d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  MachineConstantPoolValue *getMachineCPVal() const {
1330d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    assert(isMachineConstantPoolEntry() && "Wrong constantpool type");
1331d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return Val.MachineCPVal;
1332d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
1333d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
1334baf4500b3ab128c78932e36f96086c0487c8c7d1Evan Cheng  int getOffset() const {
1335de551f91d8816632a76a065084caab9fab6aacffDan Gohman    return Offset & ~(1 << (sizeof(unsigned)*CHAR_BIT-1));
1336baf4500b3ab128c78932e36f96086c0487c8c7d1Evan Cheng  }
1337fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1338ef3640aded552279f65bd6d18633e15ffb245157Chris Lattner  // Return the alignment of this constant pool object, which is either 0 (for
13391606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  // default alignment) or the desired value.
1340b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  unsigned getAlignment() const { return Alignment; }
1341f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  unsigned char getTargetFlags() const { return TargetFlags; }
134263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1343db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *getType() const;
1344d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
134563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const ConstantPoolSDNode *) { return true; }
134663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1347aaaaf79d4aaa172c2f2ae0e327bbae523a045bf5Chris Lattner    return N->getOpcode() == ISD::ConstantPool ||
1348aaaaf79d4aaa172c2f2ae0e327bbae523a045bf5Chris Lattner           N->getOpcode() == ISD::TargetConstantPool;
134963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
135063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
135163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
135274500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen/// Completely target-dependent object reference.
135374500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesenclass TargetIndexSDNode : public SDNode {
135474500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  unsigned char TargetFlags;
135574500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  int Index;
135674500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  int64_t Offset;
135774500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  friend class SelectionDAG;
135874500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesenpublic:
135974500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen
136074500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  TargetIndexSDNode(int Idx, EVT VT, int64_t Ofs, unsigned char TF)
136174500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen    : SDNode(ISD::TargetIndex, DebugLoc(), getSDVTList(VT)),
136274500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen      TargetFlags(TF), Index(Idx), Offset(Ofs) {}
136374500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesenpublic:
136474500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen
136574500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  unsigned char getTargetFlags() const { return TargetFlags; }
136674500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  int getIndex() const { return Index; }
136774500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  int64_t getOffset() const { return Offset; }
136874500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen
136974500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  static bool classof(const TargetIndexSDNode*) { return true; }
137074500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  static bool classof(const SDNode *N) {
137174500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen    return N->getOpcode() == ISD::TargetIndex;
137274500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  }
137374500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen};
137474500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen
137563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass BasicBlockSDNode : public SDNode {
137663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  MachineBasicBlock *MBB;
137763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
137892570c4a1a11cbdaf5ffb13547428dbee1103875Dale Johannesen  /// Debug info is meaningful and potentially useful here, but we create
137992570c4a1a11cbdaf5ffb13547428dbee1103875Dale Johannesen  /// blocks out of order when they're jumped to, which makes it a bit
138092570c4a1a11cbdaf5ffb13547428dbee1103875Dale Johannesen  /// harder.  Let's see if we need it first.
1381423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman  explicit BasicBlockSDNode(MachineBasicBlock *mbb)
1382b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::BasicBlock, DebugLoc(), getSDVTList(MVT::Other)), MBB(mbb) {
13833edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
138463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
138563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
138663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  MachineBasicBlock *getBasicBlock() const { return MBB; }
138763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
138863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const BasicBlockSDNode *) { return true; }
138963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
139063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner    return N->getOpcode() == ISD::BasicBlock;
139163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
139263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
139363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1394a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson/// BuildVectorSDNode - A "pseudo-class" with methods for operating on
1395a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson/// BUILD_VECTORs.
1396a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilsonclass BuildVectorSDNode : public SDNode {
13971a6d31aee6acd2b9b715b4f11f09481608f13179Bob Wilson  // These are constructed as SDNodes and then cast to BuildVectorSDNodes.
13981a6d31aee6acd2b9b715b4f11f09481608f13179Bob Wilson  explicit BuildVectorSDNode();        // Do not implement
1399a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilsonpublic:
140024e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// isConstantSplat - Check if this is a constant splat, and if so, find the
140124e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// smallest element size that splats the vector.  If MinSplatBits is
140224e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// nonzero, the element size must be at least that large.  Note that the
140324e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// splat element may be the entire vector (i.e., a one element vector).
140424e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// Returns the splat element value in SplatValue.  Any undefined bits in
140524e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// that value are zero, and the corresponding bits in the SplatUndef mask
140624e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// are set.  The SplatBitSize value is set to the splat element size in
140724e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  /// bits.  HasAnyUndefs is set to true if any bits in the vector are
14081e608819aa26c06b1552521469f2211339e3bfe0Dale Johannesen  /// undefined.  isBigEndian describes the endianness of the target.
140924e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson  bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
141024e338e8a3dab2923db30fe63d77a5ac95456ff9Bob Wilson                       unsigned &SplatBitSize, bool &HasAnyUndefs,
14111e608819aa26c06b1552521469f2211339e3bfe0Dale Johannesen                       unsigned MinSplatBits = 0, bool isBigEndian = false);
1412a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson
1413a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson  static inline bool classof(const BuildVectorSDNode *) { return true; }
1414a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson  static inline bool classof(const SDNode *N) {
1415a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson    return N->getOpcode() == ISD::BUILD_VECTOR;
1416a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson  }
1417a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson};
1418a27ea9e89f38e9bcca4d67defb0bae887a16d72cBob Wilson
141914471be9ab531cb677658704ea73b06d4f0b7585Dan Gohman/// SrcValueSDNode - An SDNode that holds an arbitrary LLVM IR Value. This is
142014471be9ab531cb677658704ea73b06d4f0b7585Dan Gohman/// used when the SelectionDAG needs to make a simple reference to something
142114471be9ab531cb677658704ea73b06d4f0b7585Dan Gohman/// in the LLVM IR representation.
142214471be9ab531cb677658704ea73b06d4f0b7585Dan Gohman///
14232d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthclass SrcValueSDNode : public SDNode {
14242d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  const Value *V;
14252d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  friend class SelectionDAG;
142669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  /// Create a SrcValue for a general value.
142769de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  explicit SrcValueSDNode(const Value *v)
1428b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::SRCVALUE, DebugLoc(), getSDVTList(MVT::Other)), V(v) {}
14292d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
14302d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthpublic:
143169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  /// getValue - return the contained Value.
14322d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  const Value *getValue() const { return V; }
14332d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
14342d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  static bool classof(const SrcValueSDNode *) { return true; }
14352d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  static bool classof(const SDNode *N) {
14362d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth    return N->getOpcode() == ISD::SRCVALUE;
14372d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  }
14382d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth};
1439decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner
1440decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattnerclass MDNodeSDNode : public SDNode {
1441decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  const MDNode *MD;
1442decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  friend class SelectionDAG;
1443decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  explicit MDNodeSDNode(const MDNode *md)
1444decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  : SDNode(ISD::MDNODE_SDNODE, DebugLoc(), getSDVTList(MVT::Other)), MD(md) {}
1445decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattnerpublic:
1446decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner
1447decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  const MDNode *getMD() const { return MD; }
1448decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner
1449decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  static bool classof(const MDNodeSDNode *) { return true; }
1450decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  static bool classof(const SDNode *N) {
1451decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner    return N->getOpcode() == ISD::MDNODE_SDNODE;
1452decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  }
1453decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner};
14542d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
145563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1456d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattnerclass RegisterSDNode : public SDNode {
145763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  unsigned Reg;
145863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1459e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  RegisterSDNode(unsigned reg, EVT VT)
1460b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::Register, DebugLoc(), getSDVTList(VT)), Reg(reg) {
146163e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  }
146263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
146363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
146463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  unsigned getReg() const { return Reg; }
146563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1466d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  static bool classof(const RegisterSDNode *) { return true; }
146763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1468d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return N->getOpcode() == ISD::Register;
146963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
147063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
147163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
14729cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesenclass RegisterMaskSDNode : public SDNode {
14739cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  // The memory for RegMask is not owned by the node.
14749cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  const uint32_t *RegMask;
14759cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  friend class SelectionDAG;
14769cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  RegisterMaskSDNode(const uint32_t *mask)
14779cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen    : SDNode(ISD::RegisterMask, DebugLoc(), getSDVTList(MVT::Untyped)),
14789cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen      RegMask(mask) {}
14799cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesenpublic:
14809cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen
14819cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  const uint32_t *getRegMask() const { return RegMask; }
14829cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen
14839cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  static bool classof(const RegisterMaskSDNode *) { return true; }
14849cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  static bool classof(const SDNode *N) {
14859cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen    return N->getOpcode() == ISD::RegisterMask;
14869cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  }
14879cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen};
14889cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen
14898c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohmanclass BlockAddressSDNode : public SDNode {
149046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const BlockAddress *BA;
149129cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  unsigned char TargetFlags;
14928c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  friend class SelectionDAG;
149346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  BlockAddressSDNode(unsigned NodeTy, EVT VT, const BlockAddress *ba,
149429cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman                     unsigned char Flags)
1495b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(NodeTy, DebugLoc(), getSDVTList(VT)),
149629cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman             BA(ba), TargetFlags(Flags) {
14978c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  }
14988c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohmanpublic:
149946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const BlockAddress *getBlockAddress() const { return BA; }
150029cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  unsigned char getTargetFlags() const { return TargetFlags; }
15018c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman
15028c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  static bool classof(const BlockAddressSDNode *) { return true; }
15038c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  static bool classof(const SDNode *N) {
15048c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman    return N->getOpcode() == ISD::BlockAddress ||
15058c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman           N->getOpcode() == ISD::TargetBlockAddress;
15068c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  }
15078c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman};
15088c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman
15097561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattnerclass EHLabelSDNode : public SDNode {
15104406604047423576e36657c7ede266ca42e79642Dan Gohman  SDUse Chain;
15117561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner  MCSymbol *Label;
15124406604047423576e36657c7ede266ca42e79642Dan Gohman  friend class SelectionDAG;
15137561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner  EHLabelSDNode(DebugLoc dl, SDValue ch, MCSymbol *L)
15147561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner    : SDNode(ISD::EH_LABEL, dl, getSDVTList(MVT::Other)), Label(L) {
15153edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    InitOperands(&Chain, ch);
15163edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
15174406604047423576e36657c7ede266ca42e79642Dan Gohmanpublic:
15187561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner  MCSymbol *getLabel() const { return Label; }
15194406604047423576e36657c7ede266ca42e79642Dan Gohman
15207561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner  static bool classof(const EHLabelSDNode *) { return true; }
15214406604047423576e36657c7ede266ca42e79642Dan Gohman  static bool classof(const SDNode *N) {
1522735afe14eea8049bf69210ce8a3512e391fc643fDan Gohman    return N->getOpcode() == ISD::EH_LABEL;
15234406604047423576e36657c7ede266ca42e79642Dan Gohman  }
15244406604047423576e36657c7ede266ca42e79642Dan Gohman};
15254406604047423576e36657c7ede266ca42e79642Dan Gohman
1526056292fd738924f3f7703725d8f630983794b5a5Bill Wendlingclass ExternalSymbolSDNode : public SDNode {
152763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  const char *Symbol;
15281af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  unsigned char TargetFlags;
15291af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner
153063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1531e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  ExternalSymbolSDNode(bool isTarget, const char *Sym, unsigned char TF, EVT VT)
1532056292fd738924f3f7703725d8f630983794b5a5Bill Wendling    : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol,
1533b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner             DebugLoc(), getSDVTList(VT)), Symbol(Sym), TargetFlags(TF) {
15343edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
153563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
1536056292fd738924f3f7703725d8f630983794b5a5Bill Wendling
153763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  const char *getSymbol() const { return Symbol; }
15381af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  unsigned char getTargetFlags() const { return TargetFlags; }
153963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
1540056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  static bool classof(const ExternalSymbolSDNode *) { return true; }
154163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
1542056292fd738924f3f7703725d8f630983794b5a5Bill Wendling    return N->getOpcode() == ISD::ExternalSymbol ||
1543056292fd738924f3f7703725d8f630983794b5a5Bill Wendling           N->getOpcode() == ISD::TargetExternalSymbol;
154463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
154563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
154663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
15477cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattnerclass CondCodeSDNode : public SDNode {
154863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  ISD::CondCode Condition;
154963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  friend class SelectionDAG;
1550423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman  explicit CondCodeSDNode(ISD::CondCode Cond)
1551b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::CONDCODE, DebugLoc(), getSDVTList(MVT::Other)),
1552b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner      Condition(Cond) {
155363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
155463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic:
155563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
15567cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ISD::CondCode get() const { return Condition; }
155763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
15587cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  static bool classof(const CondCodeSDNode *) { return true; }
155963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  static bool classof(const SDNode *N) {
15607cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    return N->getOpcode() == ISD::CONDCODE;
156163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner  }
156263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner};
15639008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
156477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang/// CvtRndSatSDNode - NOTE: avoid using this node as this may disappear in the
156577cdf30742284a173fe818417eb482224cdee8d4Mon P Wang/// future and most targets don't support it.
156677cdf30742284a173fe818417eb482224cdee8d4Mon P Wangclass CvtRndSatSDNode : public SDNode {
156777cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  ISD::CvtCode CvtCode;
156877cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  friend class SelectionDAG;
1569e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  explicit CvtRndSatSDNode(EVT VT, DebugLoc dl, const SDValue *Ops,
1570a04b75710910278334192b389c4c4c62600e162fDale Johannesen                           unsigned NumOps, ISD::CvtCode Code)
1571fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    : SDNode(ISD::CONVERT_RNDSAT, dl, getSDVTList(VT), Ops, NumOps),
1572a04b75710910278334192b389c4c4c62600e162fDale Johannesen      CvtCode(Code) {
1573a04b75710910278334192b389c4c4c62600e162fDale Johannesen    assert(NumOps == 5 && "wrong number of operations");
1574a04b75710910278334192b389c4c4c62600e162fDale Johannesen  }
157577cdf30742284a173fe818417eb482224cdee8d4Mon P Wangpublic:
157677cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  ISD::CvtCode getCvtCode() const { return CvtCode; }
157777cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
157877cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  static bool classof(const CvtRndSatSDNode *) { return true; }
157977cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  static bool classof(const SDNode *N) {
158077cdf30742284a173fe818417eb482224cdee8d4Mon P Wang    return N->getOpcode() == ISD::CONVERT_RNDSAT;
158177cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  }
158277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang};
158377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
1584e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson/// VTSDNode - This class is used to represent EVT's, which are used
158515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// to parameterize some operations.
158615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerclass VTSDNode : public SDNode {
1587e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ValueType;
158815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  friend class SelectionDAG;
1589e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  explicit VTSDNode(EVT VT)
1590b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    : SDNode(ISD::VALUETYPE, DebugLoc(), getSDVTList(MVT::Other)),
1591b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner      ValueType(VT) {
159263e3f14df6cf76f1a12de1153e1114f4b20b15a9Chris Lattner  }
159315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerpublic:
159415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner
1595e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT getVT() const { return ValueType; }
159615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner
159715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  static bool classof(const VTSDNode *) { return true; }
159815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  static bool classof(const SDNode *N) {
159915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner    return N->getOpcode() == ISD::VALUETYPE;
160015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  }
160115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner};
160215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner
16039de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel/// LSBaseSDNode - Base class for LoadSDNode and StoreSDNode
16049de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel///
160528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wangclass LSBaseSDNode : public MemSDNode {
16069de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel  //! Operand array for load and store
16079de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel  /*!
16089de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel    \note Moving this array to the base class captures more
16099de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel    common functionality shared between LoadSDNode and
16109de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel    StoreSDNode
16119de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel   */
16129cac5259fe237120a0c347d6d14e549005148f1bRoman Levenstein  SDUse Ops[4];
16139de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michelpublic:
1614d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman  LSBaseSDNode(ISD::NodeType NodeTy, DebugLoc dl, SDValue *Operands,
1615d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman               unsigned numOperands, SDVTList VTs, ISD::MemIndexedMode AM,
1616c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman               EVT MemVT, MachineMemOperand *MMO)
1617c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    : MemSDNode(NodeTy, dl, VTs, MemVT, MMO) {
1618a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    SubclassData |= AM << 2;
1619a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    assert(getAddressingMode() == AM && "MemIndexedMode encoding error!");
1620a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    InitOperands(Ops, Operands, numOperands);
16213edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    assert((getOffset().getOpcode() == ISD::UNDEF || isIndexed()) &&
16223edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen           "Only indexed loads and stores have a non-undef offset operand");
16233edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
16249de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel
1625475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getOffset() const {
162663602b8a69b2729f0789cd3c920aceef0ece64cbChris Lattner    return getOperand(getOpcode() == ISD::LOAD ? 2 : 3);
162763602b8a69b2729f0789cd3c920aceef0ece64cbChris Lattner  }
16289de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel
1629ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// getAddressingMode - Return the addressing mode for this load or store:
1630ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
1631ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  ISD::MemIndexedMode getAddressingMode() const {
1632a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    return ISD::MemIndexedMode((SubclassData >> 2) & 7);
1633ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  }
1634b625f2f8960de32bc973092aaee8ac62863006feDan Gohman
1635b625f2f8960de32bc973092aaee8ac62863006feDan Gohman  /// isIndexed - Return true if this is a pre/post inc/dec load/store.
1636ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
1637b625f2f8960de32bc973092aaee8ac62863006feDan Gohman
1638b625f2f8960de32bc973092aaee8ac62863006feDan Gohman  /// isUnindexed - Return true if this is NOT a pre/post inc/dec load/store.
1639ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
1640b625f2f8960de32bc973092aaee8ac62863006feDan Gohman
164113d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  static bool classof(const LSBaseSDNode *) { return true; }
1642b625f2f8960de32bc973092aaee8ac62863006feDan Gohman  static bool classof(const SDNode *N) {
1643b625f2f8960de32bc973092aaee8ac62863006feDan Gohman    return N->getOpcode() == ISD::LOAD ||
1644b625f2f8960de32bc973092aaee8ac62863006feDan Gohman           N->getOpcode() == ISD::STORE;
1645b625f2f8960de32bc973092aaee8ac62863006feDan Gohman  }
16469de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel};
16479de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michel
164824446e253a17720f6462288255ab5ebd13b8491fEvan Cheng/// LoadSDNode - This class is used to represent ISD::LOAD nodes.
164924446e253a17720f6462288255ab5ebd13b8491fEvan Cheng///
16509de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michelclass LoadSDNode : public LSBaseSDNode {
165124446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  friend class SelectionDAG;
16523edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  LoadSDNode(SDValue *ChainPtrOff, DebugLoc dl, SDVTList VTs,
1653c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman             ISD::MemIndexedMode AM, ISD::LoadExtType ETy, EVT MemVT,
1654c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman             MachineMemOperand *MMO)
16553edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    : LSBaseSDNode(ISD::LOAD, dl, ChainPtrOff, 3,
1656c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                   VTs, AM, MemVT, MMO) {
1657a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    SubclassData |= (unsigned short)ETy;
1658a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    assert(getExtensionType() == ETy && "LoadExtType encoding error!");
1659c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    assert(readMem() && "Load MachineMemOperand is not a load!");
1660c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    assert(!writeMem() && "Load MachineMemOperand is a store!");
16613edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
166224446e253a17720f6462288255ab5ebd13b8491fEvan Chengpublic:
166324446e253a17720f6462288255ab5ebd13b8491fEvan Cheng
1664ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// getExtensionType - Return whether this is a plain node,
1665ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// or one of the varieties of value-extending loads.
1666ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  ISD::LoadExtType getExtensionType() const {
1667a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    return ISD::LoadExtType(SubclassData & 3);
1668ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  }
1669ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman
1670475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getBasePtr() const { return getOperand(1); }
1671475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getOffset() const { return getOperand(2); }
1672d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
167324446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  static bool classof(const LoadSDNode *) { return true; }
167424446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  static bool classof(const SDNode *N) {
167524446e253a17720f6462288255ab5ebd13b8491fEvan Cheng    return N->getOpcode() == ISD::LOAD;
167624446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  }
167724446e253a17720f6462288255ab5ebd13b8491fEvan Cheng};
167824446e253a17720f6462288255ab5ebd13b8491fEvan Cheng
167924446e253a17720f6462288255ab5ebd13b8491fEvan Cheng/// StoreSDNode - This class is used to represent ISD::STORE nodes.
168024446e253a17720f6462288255ab5ebd13b8491fEvan Cheng///
16819de5d0dd42463f61c4ee2f9db5f3d08153c0dacfScott Michelclass StoreSDNode : public LSBaseSDNode {
168224446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  friend class SelectionDAG;
16833edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  StoreSDNode(SDValue *ChainValuePtrOff, DebugLoc dl, SDVTList VTs,
1684c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman              ISD::MemIndexedMode AM, bool isTrunc, EVT MemVT,
1685c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman              MachineMemOperand *MMO)
16863edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen    : LSBaseSDNode(ISD::STORE, dl, ChainValuePtrOff, 4,
1687c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                   VTs, AM, MemVT, MMO) {
1688a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    SubclassData |= (unsigned short)isTrunc;
1689a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman    assert(isTruncatingStore() == isTrunc && "isTrunc encoding error!");
1690c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    assert(!readMem() && "Store MachineMemOperand is a load!");
1691c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    assert(writeMem() && "Store MachineMemOperand is not a store!");
16923edb43e6208493dec85a2e87942f7a4d59073727Dale Johannesen  }
169324446e253a17720f6462288255ab5ebd13b8491fEvan Chengpublic:
169424446e253a17720f6462288255ab5ebd13b8491fEvan Cheng
1695ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// isTruncatingStore - Return true if the op does a truncation before store.
1696ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// For integers this is the same as doing a TRUNCATE and storing the result.
1697ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman  /// For floats, it is the same as doing an FP_ROUND and storing the result.
1698a7ce741ff0ab02510833854bfa6a1c8c265faee3Dan Gohman  bool isTruncatingStore() const { return SubclassData & 1; }
1699ea8a8651fae10bfea6149a512c01c0ebade4973fDan Gohman
1700475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getValue() const { return getOperand(1); }
1701475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getBasePtr() const { return getOperand(2); }
1702475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getOffset() const { return getOperand(3); }
1703d254a7fc0c354d165caee7e085ca0a95face4fa3Dan Gohman
17046d0b3295777f0e9e9cce27f3473c19f78e88f700Evan Cheng  static bool classof(const StoreSDNode *) { return true; }
170524446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  static bool classof(const SDNode *N) {
170624446e253a17720f6462288255ab5ebd13b8491fEvan Cheng    return N->getOpcode() == ISD::STORE;
170724446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  }
170824446e253a17720f6462288255ab5ebd13b8491fEvan Cheng};
170924446e253a17720f6462288255ab5ebd13b8491fEvan Cheng
1710c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman/// MachineSDNode - An SDNode that represents everything that will be needed
1711c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman/// to construct a MachineInstr. These nodes are created during the
1712c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman/// instruction selection proper phase.
1713c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman///
1714c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanclass MachineSDNode : public SDNode {
1715c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanpublic:
1716c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  typedef MachineMemOperand **mmo_iterator;
1717c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1718c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanprivate:
1719c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  friend class SelectionDAG;
1720c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineSDNode(unsigned Opc, const DebugLoc DL, SDVTList VTs)
1721c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    : SDNode(Opc, DL, VTs), MemRefs(0), MemRefsEnd(0) {}
1722c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1723c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// LocalOperands - Operands for this instruction, if they fit here. If
1724c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// they don't, this field is unused.
1725c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDUse LocalOperands[4];
1726c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1727c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MemRefs - Memory reference descriptions for this instruction.
1728c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  mmo_iterator MemRefs;
1729c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  mmo_iterator MemRefsEnd;
1730c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1731c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanpublic:
1732c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  mmo_iterator memoperands_begin() const { return MemRefs; }
1733c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  mmo_iterator memoperands_end() const { return MemRefsEnd; }
1734c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  bool memoperands_empty() const { return MemRefsEnd == MemRefs; }
1735c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1736c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// setMemRefs - Assign this MachineSDNodes's memory reference descriptor
1737c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// list. This does not transfer ownership.
1738c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) {
173939fe397421a23ea44e19b991e64b04f335f7bde6Owen Anderson    for (mmo_iterator MMI = NewMemRefs, MME = NewMemRefsEnd; MMI != MME; ++MMI)
174039fe397421a23ea44e19b991e64b04f335f7bde6Owen Anderson      assert(*MMI && "Null mem ref detected!");
1741c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    MemRefs = NewMemRefs;
1742c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    MemRefsEnd = NewMemRefsEnd;
1743c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  }
1744c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
1745c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  static bool classof(const MachineSDNode *) { return true; }
1746c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  static bool classof(const SDNode *N) {
1747c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman    return N->isMachineOpcode();
1748c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  }
1749c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman};
175015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner
17517362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greifclass SDNodeIterator : public std::iterator<std::forward_iterator_tag,
17527362ce08cb2c1f0b544b18dbc21630fb4baebcfcGabor Greif                                            SDNode, ptrdiff_t> {
17531080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  SDNode *Node;
17541080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  unsigned Operand;
1755ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
17561080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
17571080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerpublic:
17581080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  bool operator==(const SDNodeIterator& x) const {
17591080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return Operand == x.Operand;
17601080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
17611080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
17621080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
17631080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  const SDNodeIterator &operator=(const SDNodeIterator &I) {
17641080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
17651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    Operand = I.Operand;
17661080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return *this;
17671080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
1768ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
17691080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  pointer operator*() const {
1770ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return Node->getOperand(Operand).getNode();
17711080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
17721080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  pointer operator->() const { return operator*(); }
1773ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
17741080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  SDNodeIterator& operator++() {                // Preincrement
17751080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    ++Operand;
17761080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return *this;
17771080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
17781080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  SDNodeIterator operator++(int) { // Postincrement
1779ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman    SDNodeIterator tmp = *this; ++*this; return tmp;
17801080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
17815b69fe767ca0786ecb50e703f2da8ea09de5da7cDan Gohman  size_t operator-(SDNodeIterator Other) const {
17825b69fe767ca0786ecb50e703f2da8ea09de5da7cDan Gohman    assert(Node == Other.Node &&
17835b69fe767ca0786ecb50e703f2da8ea09de5da7cDan Gohman           "Cannot compare iterators of two different nodes!");
17845b69fe767ca0786ecb50e703f2da8ea09de5da7cDan Gohman    return Operand - Other.Operand;
17855b69fe767ca0786ecb50e703f2da8ea09de5da7cDan Gohman  }
17861080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
17871080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
17881080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static SDNodeIterator end  (SDNode *N) {
17891080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return SDNodeIterator(N, N->getNumOperands());
17901080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
17911080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
17921080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  unsigned getOperand() const { return Operand; }
17931080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  const SDNode *getNode() const { return Node; }
17941080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
17951080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
17961080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SDNode*> {
17971080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SDNode NodeType;
17981080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SDNodeIterator ChildIteratorType;
17991080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static inline NodeType *getEntryNode(SDNode *N) { return N; }
1800ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  static inline ChildIteratorType child_begin(NodeType *N) {
18011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return SDNodeIterator::begin(N);
18021080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
1803ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  static inline ChildIteratorType child_end(NodeType *N) {
18041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return SDNodeIterator::end(N);
18051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
18061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
18071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
18080e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman/// LargestSDNode - The largest SDNode class.
18090e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman///
18100e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohmantypedef LoadSDNode LargestSDNode;
18110e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman
1812fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman/// MostAlignedSDNode - The SDNode class with the greatest alignment
1813fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman/// requirement.
1814fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman///
181598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmantypedef GlobalAddressSDNode MostAlignedSDNode;
1816b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
1817c548428c5d7328592f4db6f6cd815af18b3152a3Evan Chengnamespace ISD {
1818186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng  /// isNormalLoad - Returns true if the specified node is a non-extending
1819186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng  /// and unindexed load.
1820186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng  inline bool isNormalLoad(const SDNode *N) {
1821c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    const LoadSDNode *Ld = dyn_cast<LoadSDNode>(N);
1822c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD &&
1823186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng      Ld->getAddressingMode() == ISD::UNINDEXED;
1824186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng  }
1825186edc8fa13d0e02d3c17563ad2bd78ac5963a67Evan Cheng
182624446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  /// isNON_EXTLoad - Returns true if the specified node is a non-extending
182724446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  /// load.
182824446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  inline bool isNON_EXTLoad(const SDNode *N) {
1829c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<LoadSDNode>(N) &&
183024446e253a17720f6462288255ab5ebd13b8491fEvan Cheng      cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;
183124446e253a17720f6462288255ab5ebd13b8491fEvan Cheng  }
183224446e253a17720f6462288255ab5ebd13b8491fEvan Cheng
1833c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  /// isEXTLoad - Returns true if the specified node is a EXTLOAD.
1834c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  ///
1835c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  inline bool isEXTLoad(const SDNode *N) {
1836c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<LoadSDNode>(N) &&
183724446e253a17720f6462288255ab5ebd13b8491fEvan Cheng      cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD;
1838c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  }
1839c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng
1840c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  /// isSEXTLoad - Returns true if the specified node is a SEXTLOAD.
1841c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  ///
1842c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  inline bool isSEXTLoad(const SDNode *N) {
1843c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<LoadSDNode>(N) &&
184424446e253a17720f6462288255ab5ebd13b8491fEvan Cheng      cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD;
1845c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  }
1846c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng
1847c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  /// isZEXTLoad - Returns true if the specified node is a ZEXTLOAD.
1848c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  ///
1849c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  inline bool isZEXTLoad(const SDNode *N) {
1850c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<LoadSDNode>(N) &&
185124446e253a17720f6462288255ab5ebd13b8491fEvan Cheng      cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD;
1852c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng  }
18538b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng
1854c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  /// isUNINDEXEDLoad - Returns true if the specified node is an unindexed load.
185502c50e4891841c28b2a743731dfc60744bb78879Evan Cheng  ///
185602c50e4891841c28b2a743731dfc60744bb78879Evan Cheng  inline bool isUNINDEXEDLoad(const SDNode *N) {
1857c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<LoadSDNode>(N) &&
185802c50e4891841c28b2a743731dfc60744bb78879Evan Cheng      cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
185902c50e4891841c28b2a743731dfc60744bb78879Evan Cheng  }
186002c50e4891841c28b2a743731dfc60744bb78879Evan Cheng
1861c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  /// isNormalStore - Returns true if the specified node is a non-truncating
1862c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  /// and unindexed store.
1863c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  inline bool isNormalStore(const SDNode *N) {
1864c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    const StoreSDNode *St = dyn_cast<StoreSDNode>(N);
1865c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return St && !St->isTruncatingStore() &&
1866c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands      St->getAddressingMode() == ISD::UNINDEXED;
1867c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  }
1868c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands
18698b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  /// isNON_TRUNCStore - Returns true if the specified node is a non-truncating
18708b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  /// store.
18718b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  inline bool isNON_TRUNCStore(const SDNode *N) {
1872c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<StoreSDNode>(N) && !cast<StoreSDNode>(N)->isTruncatingStore();
18738b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  }
18748b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng
18758b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  /// isTRUNCStore - Returns true if the specified node is a truncating
18768b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  /// store.
18778b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  inline bool isTRUNCStore(const SDNode *N) {
1878c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<StoreSDNode>(N) && cast<StoreSDNode>(N)->isTruncatingStore();
1879c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  }
1880c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands
1881c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  /// isUNINDEXEDStore - Returns true if the specified node is an
1882c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  /// unindexed store.
1883c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands  inline bool isUNINDEXEDStore(const SDNode *N) {
1884c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands    return isa<StoreSDNode>(N) &&
1885c8f88cc8c0b4ce1664520d5390c623f2c44e4555Duncan Sands      cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
18868b2794aeff151be8cdbd44786c1d0f94f8f2e427Evan Cheng  }
1887c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng}
1888c548428c5d7328592f4db6f6cd815af18b3152a3Evan Cheng
188963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm namespace
189063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner
189163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#endif
1892