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