LLVM API Documentation
00001 //===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file declares the SDNode class and derived classes, which are used to 00011 // represent the nodes and operations present in a SelectionDAG. These nodes 00012 // and operations are machine code level operations, with some similarities to 00013 // the GCC RTL representation. 00014 // 00015 // Clients should include the SelectionDAG.h file instead of this file directly. 00016 // 00017 //===----------------------------------------------------------------------===// 00018 00019 #ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H 00020 #define LLVM_CODEGEN_SELECTIONDAGNODES_H 00021 00022 #include "llvm/ADT/iterator_range.h" 00023 #include "llvm/ADT/BitVector.h" 00024 #include "llvm/ADT/FoldingSet.h" 00025 #include "llvm/ADT/GraphTraits.h" 00026 #include "llvm/ADT/STLExtras.h" 00027 #include "llvm/ADT/SmallPtrSet.h" 00028 #include "llvm/ADT/SmallVector.h" 00029 #include "llvm/ADT/ilist_node.h" 00030 #include "llvm/CodeGen/ISDOpcodes.h" 00031 #include "llvm/CodeGen/MachineMemOperand.h" 00032 #include "llvm/CodeGen/ValueTypes.h" 00033 #include "llvm/IR/Constants.h" 00034 #include "llvm/IR/DebugLoc.h" 00035 #include "llvm/IR/Instructions.h" 00036 #include "llvm/Support/DataTypes.h" 00037 #include "llvm/Support/MathExtras.h" 00038 #include <cassert> 00039 00040 namespace llvm { 00041 00042 class SelectionDAG; 00043 class GlobalValue; 00044 class MachineBasicBlock; 00045 class MachineConstantPoolValue; 00046 class SDNode; 00047 class Value; 00048 class MCSymbol; 00049 template <typename T> struct DenseMapInfo; 00050 template <typename T> struct simplify_type; 00051 template <typename T> struct ilist_traits; 00052 00053 /// isBinOpWithFlags - Returns true if the opcode is a binary operation 00054 /// with flags. 00055 static bool isBinOpWithFlags(unsigned Opcode) { 00056 switch (Opcode) { 00057 case ISD::SDIV: 00058 case ISD::UDIV: 00059 case ISD::SRA: 00060 case ISD::SRL: 00061 case ISD::MUL: 00062 case ISD::ADD: 00063 case ISD::SUB: 00064 case ISD::SHL: 00065 return true; 00066 default: 00067 return false; 00068 } 00069 } 00070 00071 void checkForCycles(const SDNode *N, const SelectionDAG *DAG = nullptr, 00072 bool force = false); 00073 00074 /// SDVTList - This represents a list of ValueType's that has been intern'd by 00075 /// a SelectionDAG. Instances of this simple value class are returned by 00076 /// SelectionDAG::getVTList(...). 00077 /// 00078 struct SDVTList { 00079 const EVT *VTs; 00080 unsigned int NumVTs; 00081 }; 00082 00083 namespace ISD { 00084 /// Node predicates 00085 00086 /// isBuildVectorAllOnes - Return true if the specified node is a 00087 /// BUILD_VECTOR where all of the elements are ~0 or undef. 00088 bool isBuildVectorAllOnes(const SDNode *N); 00089 00090 /// isBuildVectorAllZeros - Return true if the specified node is a 00091 /// BUILD_VECTOR where all of the elements are 0 or undef. 00092 bool isBuildVectorAllZeros(const SDNode *N); 00093 00094 /// \brief Return true if the specified node is a BUILD_VECTOR node of 00095 /// all ConstantSDNode or undef. 00096 bool isBuildVectorOfConstantSDNodes(const SDNode *N); 00097 00098 /// isScalarToVector - Return true if the specified node is a 00099 /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low 00100 /// element is not an undef. 00101 bool isScalarToVector(const SDNode *N); 00102 00103 /// allOperandsUndef - Return true if the node has at least one operand 00104 /// and all operands of the specified node are ISD::UNDEF. 00105 bool allOperandsUndef(const SDNode *N); 00106 } // end llvm:ISD namespace 00107 00108 //===----------------------------------------------------------------------===// 00109 /// SDValue - Unlike LLVM values, Selection DAG nodes may return multiple 00110 /// values as the result of a computation. Many nodes return multiple values, 00111 /// from loads (which define a token and a return value) to ADDC (which returns 00112 /// a result and a carry value), to calls (which may return an arbitrary number 00113 /// of values). 00114 /// 00115 /// As such, each use of a SelectionDAG computation must indicate the node that 00116 /// computes it as well as which return value to use from that node. This pair 00117 /// of information is represented with the SDValue value type. 00118 /// 00119 class SDValue { 00120 friend struct DenseMapInfo<SDValue>; 00121 00122 SDNode *Node; // The node defining the value we are using. 00123 unsigned ResNo; // Which return value of the node we are using. 00124 public: 00125 SDValue() : Node(nullptr), ResNo(0) {} 00126 SDValue(SDNode *node, unsigned resno); 00127 00128 /// get the index which selects a specific result in the SDNode 00129 unsigned getResNo() const { return ResNo; } 00130 00131 /// get the SDNode which holds the desired result 00132 SDNode *getNode() const { return Node; } 00133 00134 /// set the SDNode 00135 void setNode(SDNode *N) { Node = N; } 00136 00137 inline SDNode *operator->() const { return Node; } 00138 00139 bool operator==(const SDValue &O) const { 00140 return Node == O.Node && ResNo == O.ResNo; 00141 } 00142 bool operator!=(const SDValue &O) const { 00143 return !operator==(O); 00144 } 00145 bool operator<(const SDValue &O) const { 00146 return std::tie(Node, ResNo) < std::tie(O.Node, O.ResNo); 00147 } 00148 LLVM_EXPLICIT operator bool() const { 00149 return Node != nullptr; 00150 } 00151 00152 SDValue getValue(unsigned R) const { 00153 return SDValue(Node, R); 00154 } 00155 00156 // isOperandOf - Return true if this node is an operand of N. 00157 bool isOperandOf(SDNode *N) const; 00158 00159 /// getValueType - Return the ValueType of the referenced return value. 00160 /// 00161 inline EVT getValueType() const; 00162 00163 /// Return the simple ValueType of the referenced return value. 00164 MVT getSimpleValueType() const { 00165 return getValueType().getSimpleVT(); 00166 } 00167 00168 /// getValueSizeInBits - Returns the size of the value in bits. 00169 /// 00170 unsigned getValueSizeInBits() const { 00171 return getValueType().getSizeInBits(); 00172 } 00173 00174 unsigned getScalarValueSizeInBits() const { 00175 return getValueType().getScalarType().getSizeInBits(); 00176 } 00177 00178 // Forwarding methods - These forward to the corresponding methods in SDNode. 00179 inline unsigned getOpcode() const; 00180 inline unsigned getNumOperands() const; 00181 inline const SDValue &getOperand(unsigned i) const; 00182 inline uint64_t getConstantOperandVal(unsigned i) const; 00183 inline bool isTargetMemoryOpcode() const; 00184 inline bool isTargetOpcode() const; 00185 inline bool isMachineOpcode() const; 00186 inline unsigned getMachineOpcode() const; 00187 inline const DebugLoc getDebugLoc() const; 00188 inline void dump() const; 00189 inline void dumpr() const; 00190 00191 /// reachesChainWithoutSideEffects - Return true if this operand (which must 00192 /// be a chain) reaches the specified operand without crossing any 00193 /// side-effecting instructions. In practice, this looks through token 00194 /// factors and non-volatile loads. In order to remain efficient, this only 00195 /// looks a couple of nodes in, it does not do an exhaustive search. 00196 bool reachesChainWithoutSideEffects(SDValue Dest, 00197 unsigned Depth = 2) const; 00198 00199 /// use_empty - Return true if there are no nodes using value ResNo 00200 /// of Node. 00201 /// 00202 inline bool use_empty() const; 00203 00204 /// hasOneUse - Return true if there is exactly one node using value 00205 /// ResNo of Node. 00206 /// 00207 inline bool hasOneUse() const; 00208 }; 00209 00210 00211 template<> struct DenseMapInfo<SDValue> { 00212 static inline SDValue getEmptyKey() { 00213 SDValue V; 00214 V.ResNo = -1U; 00215 return V; 00216 } 00217 static inline SDValue getTombstoneKey() { 00218 SDValue V; 00219 V.ResNo = -2U; 00220 return V; 00221 } 00222 static unsigned getHashValue(const SDValue &Val) { 00223 return ((unsigned)((uintptr_t)Val.getNode() >> 4) ^ 00224 (unsigned)((uintptr_t)Val.getNode() >> 9)) + Val.getResNo(); 00225 } 00226 static bool isEqual(const SDValue &LHS, const SDValue &RHS) { 00227 return LHS == RHS; 00228 } 00229 }; 00230 template <> struct isPodLike<SDValue> { static const bool value = true; }; 00231 00232 00233 /// simplify_type specializations - Allow casting operators to work directly on 00234 /// SDValues as if they were SDNode*'s. 00235 template<> struct simplify_type<SDValue> { 00236 typedef SDNode* SimpleType; 00237 static SimpleType getSimplifiedValue(SDValue &Val) { 00238 return Val.getNode(); 00239 } 00240 }; 00241 template<> struct simplify_type<const SDValue> { 00242 typedef /*const*/ SDNode* SimpleType; 00243 static SimpleType getSimplifiedValue(const SDValue &Val) { 00244 return Val.getNode(); 00245 } 00246 }; 00247 00248 /// SDUse - Represents a use of a SDNode. This class holds an SDValue, 00249 /// which records the SDNode being used and the result number, a 00250 /// pointer to the SDNode using the value, and Next and Prev pointers, 00251 /// which link together all the uses of an SDNode. 00252 /// 00253 class SDUse { 00254 /// Val - The value being used. 00255 SDValue Val; 00256 /// User - The user of this value. 00257 SDNode *User; 00258 /// Prev, Next - Pointers to the uses list of the SDNode referred by 00259 /// this operand. 00260 SDUse **Prev, *Next; 00261 00262 SDUse(const SDUse &U) LLVM_DELETED_FUNCTION; 00263 void operator=(const SDUse &U) LLVM_DELETED_FUNCTION; 00264 00265 public: 00266 SDUse() : Val(), User(nullptr), Prev(nullptr), Next(nullptr) {} 00267 00268 /// Normally SDUse will just implicitly convert to an SDValue that it holds. 00269 operator const SDValue&() const { return Val; } 00270 00271 /// If implicit conversion to SDValue doesn't work, the get() method returns 00272 /// the SDValue. 00273 const SDValue &get() const { return Val; } 00274 00275 /// getUser - This returns the SDNode that contains this Use. 00276 SDNode *getUser() { return User; } 00277 00278 /// getNext - Get the next SDUse in the use list. 00279 SDUse *getNext() const { return Next; } 00280 00281 /// getNode - Convenience function for get().getNode(). 00282 SDNode *getNode() const { return Val.getNode(); } 00283 /// getResNo - Convenience function for get().getResNo(). 00284 unsigned getResNo() const { return Val.getResNo(); } 00285 /// getValueType - Convenience function for get().getValueType(). 00286 EVT getValueType() const { return Val.getValueType(); } 00287 00288 /// operator== - Convenience function for get().operator== 00289 bool operator==(const SDValue &V) const { 00290 return Val == V; 00291 } 00292 00293 /// operator!= - Convenience function for get().operator!= 00294 bool operator!=(const SDValue &V) const { 00295 return Val != V; 00296 } 00297 00298 /// operator< - Convenience function for get().operator< 00299 bool operator<(const SDValue &V) const { 00300 return Val < V; 00301 } 00302 00303 private: 00304 friend class SelectionDAG; 00305 friend class SDNode; 00306 00307 void setUser(SDNode *p) { User = p; } 00308 00309 /// set - Remove this use from its existing use list, assign it the 00310 /// given value, and add it to the new value's node's use list. 00311 inline void set(const SDValue &V); 00312 /// setInitial - like set, but only supports initializing a newly-allocated 00313 /// SDUse with a non-null value. 00314 inline void setInitial(const SDValue &V); 00315 /// setNode - like set, but only sets the Node portion of the value, 00316 /// leaving the ResNo portion unmodified. 00317 inline void setNode(SDNode *N); 00318 00319 void addToList(SDUse **List) { 00320 Next = *List; 00321 if (Next) Next->Prev = &Next; 00322 Prev = List; 00323 *List = this; 00324 } 00325 00326 void removeFromList() { 00327 *Prev = Next; 00328 if (Next) Next->Prev = Prev; 00329 } 00330 }; 00331 00332 /// simplify_type specializations - Allow casting operators to work directly on 00333 /// SDValues as if they were SDNode*'s. 00334 template<> struct simplify_type<SDUse> { 00335 typedef SDNode* SimpleType; 00336 static SimpleType getSimplifiedValue(SDUse &Val) { 00337 return Val.getNode(); 00338 } 00339 }; 00340 00341 00342 /// SDNode - Represents one node in the SelectionDAG. 00343 /// 00344 class SDNode : public FoldingSetNode, public ilist_node<SDNode> { 00345 private: 00346 /// NodeType - The operation that this node performs. 00347 /// 00348 int16_t NodeType; 00349 00350 /// OperandsNeedDelete - This is true if OperandList was new[]'d. If true, 00351 /// then they will be delete[]'d when the node is destroyed. 00352 uint16_t OperandsNeedDelete : 1; 00353 00354 /// HasDebugValue - This tracks whether this node has one or more dbg_value 00355 /// nodes corresponding to it. 00356 uint16_t HasDebugValue : 1; 00357 00358 protected: 00359 /// SubclassData - This member is defined by this class, but is not used for 00360 /// anything. Subclasses can use it to hold whatever state they find useful. 00361 /// This field is initialized to zero by the ctor. 00362 uint16_t SubclassData : 14; 00363 00364 private: 00365 /// NodeId - Unique id per SDNode in the DAG. 00366 int NodeId; 00367 00368 /// OperandList - The values that are used by this operation. 00369 /// 00370 SDUse *OperandList; 00371 00372 /// ValueList - The types of the values this node defines. SDNode's may 00373 /// define multiple values simultaneously. 00374 const EVT *ValueList; 00375 00376 /// UseList - List of uses for this SDNode. 00377 SDUse *UseList; 00378 00379 /// NumOperands/NumValues - The number of entries in the Operand/Value list. 00380 unsigned short NumOperands, NumValues; 00381 00382 /// debugLoc - source line information. 00383 DebugLoc debugLoc; 00384 00385 // The ordering of the SDNodes. It roughly corresponds to the ordering of the 00386 // original LLVM instructions. 00387 // This is used for turning off scheduling, because we'll forgo 00388 // the normal scheduling algorithms and output the instructions according to 00389 // this ordering. 00390 unsigned IROrder; 00391 00392 /// getValueTypeList - Return a pointer to the specified value type. 00393 static const EVT *getValueTypeList(EVT VT); 00394 00395 friend class SelectionDAG; 00396 friend struct ilist_traits<SDNode>; 00397 00398 public: 00399 //===--------------------------------------------------------------------===// 00400 // Accessors 00401 // 00402 00403 /// getOpcode - Return the SelectionDAG opcode value for this node. For 00404 /// pre-isel nodes (those for which isMachineOpcode returns false), these 00405 /// are the opcode values in the ISD and <target>ISD namespaces. For 00406 /// post-isel opcodes, see getMachineOpcode. 00407 unsigned getOpcode() const { return (unsigned short)NodeType; } 00408 00409 /// isTargetOpcode - Test if this node has a target-specific opcode (in the 00410 /// <target>ISD namespace). 00411 bool isTargetOpcode() const { return NodeType >= ISD::BUILTIN_OP_END; } 00412 00413 /// isTargetMemoryOpcode - Test if this node has a target-specific 00414 /// memory-referencing opcode (in the <target>ISD namespace and 00415 /// greater than FIRST_TARGET_MEMORY_OPCODE). 00416 bool isTargetMemoryOpcode() const { 00417 return NodeType >= ISD::FIRST_TARGET_MEMORY_OPCODE; 00418 } 00419 00420 /// Test if this node is a memory intrinsic (with valid pointer information). 00421 /// INTRINSIC_W_CHAIN and INTRINSIC_VOID nodes are sometimes created for 00422 /// non-memory intrinsics (with chains) that are not really instances of 00423 /// MemSDNode. For such nodes, we need some extra state to determine the 00424 /// proper classof relationship. 00425 bool isMemIntrinsic() const { 00426 return (NodeType == ISD::INTRINSIC_W_CHAIN || 00427 NodeType == ISD::INTRINSIC_VOID) && ((SubclassData >> 13) & 1); 00428 } 00429 00430 /// isMachineOpcode - Test if this node has a post-isel opcode, directly 00431 /// corresponding to a MachineInstr opcode. 00432 bool isMachineOpcode() const { return NodeType < 0; } 00433 00434 /// getMachineOpcode - This may only be called if isMachineOpcode returns 00435 /// true. It returns the MachineInstr opcode value that the node's opcode 00436 /// corresponds to. 00437 unsigned getMachineOpcode() const { 00438 assert(isMachineOpcode() && "Not a MachineInstr opcode!"); 00439 return ~NodeType; 00440 } 00441 00442 /// getHasDebugValue - get this bit. 00443 bool getHasDebugValue() const { return HasDebugValue; } 00444 00445 /// setHasDebugValue - set this bit. 00446 void setHasDebugValue(bool b) { HasDebugValue = b; } 00447 00448 /// use_empty - Return true if there are no uses of this node. 00449 /// 00450 bool use_empty() const { return UseList == nullptr; } 00451 00452 /// hasOneUse - Return true if there is exactly one use of this node. 00453 /// 00454 bool hasOneUse() const { 00455 return !use_empty() && std::next(use_begin()) == use_end(); 00456 } 00457 00458 /// use_size - Return the number of uses of this node. This method takes 00459 /// time proportional to the number of uses. 00460 /// 00461 size_t use_size() const { return std::distance(use_begin(), use_end()); } 00462 00463 /// getNodeId - Return the unique node id. 00464 /// 00465 int getNodeId() const { return NodeId; } 00466 00467 /// setNodeId - Set unique node id. 00468 void setNodeId(int Id) { NodeId = Id; } 00469 00470 /// getIROrder - Return the node ordering. 00471 /// 00472 unsigned getIROrder() const { return IROrder; } 00473 00474 /// setIROrder - Set the node ordering. 00475 /// 00476 void setIROrder(unsigned Order) { IROrder = Order; } 00477 00478 /// getDebugLoc - Return the source location info. 00479 const DebugLoc getDebugLoc() const { return debugLoc; } 00480 00481 /// setDebugLoc - Set source location info. Try to avoid this, putting 00482 /// it in the constructor is preferable. 00483 void setDebugLoc(const DebugLoc dl) { debugLoc = dl; } 00484 00485 /// use_iterator - This class provides iterator support for SDUse 00486 /// operands that use a specific SDNode. 00487 class use_iterator 00488 : public std::iterator<std::forward_iterator_tag, SDUse, ptrdiff_t> { 00489 SDUse *Op; 00490 explicit use_iterator(SDUse *op) : Op(op) { 00491 } 00492 friend class SDNode; 00493 public: 00494 typedef std::iterator<std::forward_iterator_tag, 00495 SDUse, ptrdiff_t>::reference reference; 00496 typedef std::iterator<std::forward_iterator_tag, 00497 SDUse, ptrdiff_t>::pointer pointer; 00498 00499 use_iterator(const use_iterator &I) : Op(I.Op) {} 00500 use_iterator() : Op(nullptr) {} 00501 00502 bool operator==(const use_iterator &x) const { 00503 return Op == x.Op; 00504 } 00505 bool operator!=(const use_iterator &x) const { 00506 return !operator==(x); 00507 } 00508 00509 /// atEnd - return true if this iterator is at the end of uses list. 00510 bool atEnd() const { return Op == nullptr; } 00511 00512 // Iterator traversal: forward iteration only. 00513 use_iterator &operator++() { // Preincrement 00514 assert(Op && "Cannot increment end iterator!"); 00515 Op = Op->getNext(); 00516 return *this; 00517 } 00518 00519 use_iterator operator++(int) { // Postincrement 00520 use_iterator tmp = *this; ++*this; return tmp; 00521 } 00522 00523 /// Retrieve a pointer to the current user node. 00524 SDNode *operator*() const { 00525 assert(Op && "Cannot dereference end iterator!"); 00526 return Op->getUser(); 00527 } 00528 00529 SDNode *operator->() const { return operator*(); } 00530 00531 SDUse &getUse() const { return *Op; } 00532 00533 /// getOperandNo - Retrieve the operand # of this use in its user. 00534 /// 00535 unsigned getOperandNo() const { 00536 assert(Op && "Cannot dereference end iterator!"); 00537 return (unsigned)(Op - Op->getUser()->OperandList); 00538 } 00539 }; 00540 00541 /// use_begin/use_end - Provide iteration support to walk over all uses 00542 /// of an SDNode. 00543 00544 use_iterator use_begin() const { 00545 return use_iterator(UseList); 00546 } 00547 00548 static use_iterator use_end() { return use_iterator(nullptr); } 00549 00550 inline iterator_range<use_iterator> uses() { 00551 return iterator_range<use_iterator>(use_begin(), use_end()); 00552 } 00553 inline iterator_range<use_iterator> uses() const { 00554 return iterator_range<use_iterator>(use_begin(), use_end()); 00555 } 00556 00557 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 00558 /// indicated value. This method ignores uses of other values defined by this 00559 /// operation. 00560 bool hasNUsesOfValue(unsigned NUses, unsigned Value) const; 00561 00562 /// hasAnyUseOfValue - Return true if there are any use of the indicated 00563 /// value. This method ignores uses of other values defined by this operation. 00564 bool hasAnyUseOfValue(unsigned Value) const; 00565 00566 /// isOnlyUserOf - Return true if this node is the only use of N. 00567 /// 00568 bool isOnlyUserOf(SDNode *N) const; 00569 00570 /// isOperandOf - Return true if this node is an operand of N. 00571 /// 00572 bool isOperandOf(SDNode *N) const; 00573 00574 /// isPredecessorOf - Return true if this node is a predecessor of N. 00575 /// NOTE: Implemented on top of hasPredecessor and every bit as 00576 /// expensive. Use carefully. 00577 bool isPredecessorOf(const SDNode *N) const { 00578 return N->hasPredecessor(this); 00579 } 00580 00581 /// hasPredecessor - Return true if N is a predecessor of this node. 00582 /// N is either an operand of this node, or can be reached by recursively 00583 /// traversing up the operands. 00584 /// NOTE: This is an expensive method. Use it carefully. 00585 bool hasPredecessor(const SDNode *N) const; 00586 00587 /// hasPredecesorHelper - Return true if N is a predecessor of this node. 00588 /// N is either an operand of this node, or can be reached by recursively 00589 /// traversing up the operands. 00590 /// In this helper the Visited and worklist sets are held externally to 00591 /// cache predecessors over multiple invocations. If you want to test for 00592 /// multiple predecessors this method is preferable to multiple calls to 00593 /// hasPredecessor. Be sure to clear Visited and Worklist if the DAG 00594 /// changes. 00595 /// NOTE: This is still very expensive. Use carefully. 00596 bool hasPredecessorHelper(const SDNode *N, 00597 SmallPtrSetImpl<const SDNode *> &Visited, 00598 SmallVectorImpl<const SDNode *> &Worklist) const; 00599 00600 /// getNumOperands - Return the number of values used by this operation. 00601 /// 00602 unsigned getNumOperands() const { return NumOperands; } 00603 00604 /// getConstantOperandVal - Helper method returns the integer value of a 00605 /// ConstantSDNode operand. 00606 uint64_t getConstantOperandVal(unsigned Num) const; 00607 00608 const SDValue &getOperand(unsigned Num) const { 00609 assert(Num < NumOperands && "Invalid child # of SDNode!"); 00610 return OperandList[Num]; 00611 } 00612 00613 typedef SDUse* op_iterator; 00614 op_iterator op_begin() const { return OperandList; } 00615 op_iterator op_end() const { return OperandList+NumOperands; } 00616 ArrayRef<SDUse> ops() const { return makeArrayRef(op_begin(), op_end()); } 00617 00618 SDVTList getVTList() const { 00619 SDVTList X = { ValueList, NumValues }; 00620 return X; 00621 } 00622 00623 /// getGluedNode - If this node has a glue operand, return the node 00624 /// to which the glue operand points. Otherwise return NULL. 00625 SDNode *getGluedNode() const { 00626 if (getNumOperands() != 0 && 00627 getOperand(getNumOperands()-1).getValueType() == MVT::Glue) 00628 return getOperand(getNumOperands()-1).getNode(); 00629 return nullptr; 00630 } 00631 00632 // If this is a pseudo op, like copyfromreg, look to see if there is a 00633 // real target node glued to it. If so, return the target node. 00634 const SDNode *getGluedMachineNode() const { 00635 const SDNode *FoundNode = this; 00636 00637 // Climb up glue edges until a machine-opcode node is found, or the 00638 // end of the chain is reached. 00639 while (!FoundNode->isMachineOpcode()) { 00640 const SDNode *N = FoundNode->getGluedNode(); 00641 if (!N) break; 00642 FoundNode = N; 00643 } 00644 00645 return FoundNode; 00646 } 00647 00648 /// getGluedUser - If this node has a glue value with a user, return 00649 /// the user (there is at most one). Otherwise return NULL. 00650 SDNode *getGluedUser() const { 00651 for (use_iterator UI = use_begin(), UE = use_end(); UI != UE; ++UI) 00652 if (UI.getUse().get().getValueType() == MVT::Glue) 00653 return *UI; 00654 return nullptr; 00655 } 00656 00657 /// getNumValues - Return the number of values defined/returned by this 00658 /// operator. 00659 /// 00660 unsigned getNumValues() const { return NumValues; } 00661 00662 /// getValueType - Return the type of a specified result. 00663 /// 00664 EVT getValueType(unsigned ResNo) const { 00665 assert(ResNo < NumValues && "Illegal result number!"); 00666 return ValueList[ResNo]; 00667 } 00668 00669 /// Return the type of a specified result as a simple type. 00670 /// 00671 MVT getSimpleValueType(unsigned ResNo) const { 00672 return getValueType(ResNo).getSimpleVT(); 00673 } 00674 00675 /// getValueSizeInBits - Returns MVT::getSizeInBits(getValueType(ResNo)). 00676 /// 00677 unsigned getValueSizeInBits(unsigned ResNo) const { 00678 return getValueType(ResNo).getSizeInBits(); 00679 } 00680 00681 typedef const EVT* value_iterator; 00682 value_iterator value_begin() const { return ValueList; } 00683 value_iterator value_end() const { return ValueList+NumValues; } 00684 00685 /// getOperationName - Return the opcode of this operation for printing. 00686 /// 00687 std::string getOperationName(const SelectionDAG *G = nullptr) const; 00688 static const char* getIndexedModeName(ISD::MemIndexedMode AM); 00689 void print_types(raw_ostream &OS, const SelectionDAG *G) const; 00690 void print_details(raw_ostream &OS, const SelectionDAG *G) const; 00691 void print(raw_ostream &OS, const SelectionDAG *G = nullptr) const; 00692 void printr(raw_ostream &OS, const SelectionDAG *G = nullptr) const; 00693 00694 /// printrFull - Print a SelectionDAG node and all children down to 00695 /// the leaves. The given SelectionDAG allows target-specific nodes 00696 /// to be printed in human-readable form. Unlike printr, this will 00697 /// print the whole DAG, including children that appear multiple 00698 /// times. 00699 /// 00700 void printrFull(raw_ostream &O, const SelectionDAG *G = nullptr) const; 00701 00702 /// printrWithDepth - Print a SelectionDAG node and children up to 00703 /// depth "depth." The given SelectionDAG allows target-specific 00704 /// nodes to be printed in human-readable form. Unlike printr, this 00705 /// will print children that appear multiple times wherever they are 00706 /// used. 00707 /// 00708 void printrWithDepth(raw_ostream &O, const SelectionDAG *G = nullptr, 00709 unsigned depth = 100) const; 00710 00711 00712 /// dump - Dump this node, for debugging. 00713 void dump() const; 00714 00715 /// dumpr - Dump (recursively) this node and its use-def subgraph. 00716 void dumpr() const; 00717 00718 /// dump - Dump this node, for debugging. 00719 /// The given SelectionDAG allows target-specific nodes to be printed 00720 /// in human-readable form. 00721 void dump(const SelectionDAG *G) const; 00722 00723 /// dumpr - Dump (recursively) this node and its use-def subgraph. 00724 /// The given SelectionDAG allows target-specific nodes to be printed 00725 /// in human-readable form. 00726 void dumpr(const SelectionDAG *G) const; 00727 00728 /// dumprFull - printrFull to dbgs(). The given SelectionDAG allows 00729 /// target-specific nodes to be printed in human-readable form. 00730 /// Unlike dumpr, this will print the whole DAG, including children 00731 /// that appear multiple times. 00732 /// 00733 void dumprFull(const SelectionDAG *G = nullptr) const; 00734 00735 /// dumprWithDepth - printrWithDepth to dbgs(). The given 00736 /// SelectionDAG allows target-specific nodes to be printed in 00737 /// human-readable form. Unlike dumpr, this will print children 00738 /// that appear multiple times wherever they are used. 00739 /// 00740 void dumprWithDepth(const SelectionDAG *G = nullptr, 00741 unsigned depth = 100) const; 00742 00743 /// Profile - Gather unique data for the node. 00744 /// 00745 void Profile(FoldingSetNodeID &ID) const; 00746 00747 /// addUse - This method should only be used by the SDUse class. 00748 /// 00749 void addUse(SDUse &U) { U.addToList(&UseList); } 00750 00751 protected: 00752 static SDVTList getSDVTList(EVT VT) { 00753 SDVTList Ret = { getValueTypeList(VT), 1 }; 00754 return Ret; 00755 } 00756 00757 SDNode(unsigned Opc, unsigned Order, const DebugLoc dl, SDVTList VTs, 00758 ArrayRef<SDValue> Ops) 00759 : NodeType(Opc), OperandsNeedDelete(true), HasDebugValue(false), 00760 SubclassData(0), NodeId(-1), 00761 OperandList(Ops.size() ? new SDUse[Ops.size()] : nullptr), 00762 ValueList(VTs.VTs), UseList(nullptr), 00763 NumOperands(Ops.size()), NumValues(VTs.NumVTs), 00764 debugLoc(dl), IROrder(Order) { 00765 for (unsigned i = 0; i != Ops.size(); ++i) { 00766 OperandList[i].setUser(this); 00767 OperandList[i].setInitial(Ops[i]); 00768 } 00769 checkForCycles(this); 00770 } 00771 00772 /// This constructor adds no operands itself; operands can be 00773 /// set later with InitOperands. 00774 SDNode(unsigned Opc, unsigned Order, const DebugLoc dl, SDVTList VTs) 00775 : NodeType(Opc), OperandsNeedDelete(false), HasDebugValue(false), 00776 SubclassData(0), NodeId(-1), OperandList(nullptr), ValueList(VTs.VTs), 00777 UseList(nullptr), NumOperands(0), NumValues(VTs.NumVTs), debugLoc(dl), 00778 IROrder(Order) {} 00779 00780 /// InitOperands - Initialize the operands list of this with 1 operand. 00781 void InitOperands(SDUse *Ops, const SDValue &Op0) { 00782 Ops[0].setUser(this); 00783 Ops[0].setInitial(Op0); 00784 NumOperands = 1; 00785 OperandList = Ops; 00786 checkForCycles(this); 00787 } 00788 00789 /// InitOperands - Initialize the operands list of this with 2 operands. 00790 void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1) { 00791 Ops[0].setUser(this); 00792 Ops[0].setInitial(Op0); 00793 Ops[1].setUser(this); 00794 Ops[1].setInitial(Op1); 00795 NumOperands = 2; 00796 OperandList = Ops; 00797 checkForCycles(this); 00798 } 00799 00800 /// InitOperands - Initialize the operands list of this with 3 operands. 00801 void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1, 00802 const SDValue &Op2) { 00803 Ops[0].setUser(this); 00804 Ops[0].setInitial(Op0); 00805 Ops[1].setUser(this); 00806 Ops[1].setInitial(Op1); 00807 Ops[2].setUser(this); 00808 Ops[2].setInitial(Op2); 00809 NumOperands = 3; 00810 OperandList = Ops; 00811 checkForCycles(this); 00812 } 00813 00814 /// InitOperands - Initialize the operands list of this with 4 operands. 00815 void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1, 00816 const SDValue &Op2, const SDValue &Op3) { 00817 Ops[0].setUser(this); 00818 Ops[0].setInitial(Op0); 00819 Ops[1].setUser(this); 00820 Ops[1].setInitial(Op1); 00821 Ops[2].setUser(this); 00822 Ops[2].setInitial(Op2); 00823 Ops[3].setUser(this); 00824 Ops[3].setInitial(Op3); 00825 NumOperands = 4; 00826 OperandList = Ops; 00827 checkForCycles(this); 00828 } 00829 00830 /// InitOperands - Initialize the operands list of this with N operands. 00831 void InitOperands(SDUse *Ops, const SDValue *Vals, unsigned N) { 00832 for (unsigned i = 0; i != N; ++i) { 00833 Ops[i].setUser(this); 00834 Ops[i].setInitial(Vals[i]); 00835 } 00836 NumOperands = N; 00837 OperandList = Ops; 00838 checkForCycles(this); 00839 } 00840 00841 /// DropOperands - Release the operands and set this node to have 00842 /// zero operands. 00843 void DropOperands(); 00844 }; 00845 00846 /// Wrapper class for IR location info (IR ordering and DebugLoc) to be passed 00847 /// into SDNode creation functions. 00848 /// When an SDNode is created from the DAGBuilder, the DebugLoc is extracted 00849 /// from the original Instruction, and IROrder is the ordinal position of 00850 /// the instruction. 00851 /// When an SDNode is created after the DAG is being built, both DebugLoc and 00852 /// the IROrder are propagated from the original SDNode. 00853 /// So SDLoc class provides two constructors besides the default one, one to 00854 /// be used by the DAGBuilder, the other to be used by others. 00855 class SDLoc { 00856 private: 00857 // Ptr could be used for either Instruction* or SDNode*. It is used for 00858 // Instruction* if IROrder is not -1. 00859 const void *Ptr; 00860 int IROrder; 00861 00862 public: 00863 SDLoc() : Ptr(nullptr), IROrder(0) {} 00864 SDLoc(const SDNode *N) : Ptr(N), IROrder(-1) { 00865 assert(N && "null SDNode"); 00866 } 00867 SDLoc(const SDValue V) : Ptr(V.getNode()), IROrder(-1) { 00868 assert(Ptr && "null SDNode"); 00869 } 00870 SDLoc(const Instruction *I, int Order) : Ptr(I), IROrder(Order) { 00871 assert(Order >= 0 && "bad IROrder"); 00872 } 00873 unsigned getIROrder() { 00874 if (IROrder >= 0 || Ptr == nullptr) { 00875 return (unsigned)IROrder; 00876 } 00877 const SDNode *N = (const SDNode*)(Ptr); 00878 return N->getIROrder(); 00879 } 00880 DebugLoc getDebugLoc() { 00881 if (!Ptr) { 00882 return DebugLoc(); 00883 } 00884 if (IROrder >= 0) { 00885 const Instruction *I = (const Instruction*)(Ptr); 00886 return I->getDebugLoc(); 00887 } 00888 const SDNode *N = (const SDNode*)(Ptr); 00889 return N->getDebugLoc(); 00890 } 00891 }; 00892 00893 00894 // Define inline functions from the SDValue class. 00895 00896 inline SDValue::SDValue(SDNode *node, unsigned resno) 00897 : Node(node), ResNo(resno) { 00898 assert((!Node || ResNo < Node->getNumValues()) && 00899 "Invalid result number for the given node!"); 00900 assert(ResNo < -2U && "Cannot use result numbers reserved for DenseMaps."); 00901 } 00902 00903 inline unsigned SDValue::getOpcode() const { 00904 return Node->getOpcode(); 00905 } 00906 inline EVT SDValue::getValueType() const { 00907 return Node->getValueType(ResNo); 00908 } 00909 inline unsigned SDValue::getNumOperands() const { 00910 return Node->getNumOperands(); 00911 } 00912 inline const SDValue &SDValue::getOperand(unsigned i) const { 00913 return Node->getOperand(i); 00914 } 00915 inline uint64_t SDValue::getConstantOperandVal(unsigned i) const { 00916 return Node->getConstantOperandVal(i); 00917 } 00918 inline bool SDValue::isTargetOpcode() const { 00919 return Node->isTargetOpcode(); 00920 } 00921 inline bool SDValue::isTargetMemoryOpcode() const { 00922 return Node->isTargetMemoryOpcode(); 00923 } 00924 inline bool SDValue::isMachineOpcode() const { 00925 return Node->isMachineOpcode(); 00926 } 00927 inline unsigned SDValue::getMachineOpcode() const { 00928 return Node->getMachineOpcode(); 00929 } 00930 inline bool SDValue::use_empty() const { 00931 return !Node->hasAnyUseOfValue(ResNo); 00932 } 00933 inline bool SDValue::hasOneUse() const { 00934 return Node->hasNUsesOfValue(1, ResNo); 00935 } 00936 inline const DebugLoc SDValue::getDebugLoc() const { 00937 return Node->getDebugLoc(); 00938 } 00939 inline void SDValue::dump() const { 00940 return Node->dump(); 00941 } 00942 inline void SDValue::dumpr() const { 00943 return Node->dumpr(); 00944 } 00945 // Define inline functions from the SDUse class. 00946 00947 inline void SDUse::set(const SDValue &V) { 00948 if (Val.getNode()) removeFromList(); 00949 Val = V; 00950 if (V.getNode()) V.getNode()->addUse(*this); 00951 } 00952 00953 inline void SDUse::setInitial(const SDValue &V) { 00954 Val = V; 00955 V.getNode()->addUse(*this); 00956 } 00957 00958 inline void SDUse::setNode(SDNode *N) { 00959 if (Val.getNode()) removeFromList(); 00960 Val.setNode(N); 00961 if (N) N->addUse(*this); 00962 } 00963 00964 /// UnarySDNode - This class is used for single-operand SDNodes. This is solely 00965 /// to allow co-allocation of node operands with the node itself. 00966 class UnarySDNode : public SDNode { 00967 SDUse Op; 00968 public: 00969 UnarySDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 00970 SDValue X) 00971 : SDNode(Opc, Order, dl, VTs) { 00972 InitOperands(&Op, X); 00973 } 00974 }; 00975 00976 /// BinarySDNode - This class is used for two-operand SDNodes. This is solely 00977 /// to allow co-allocation of node operands with the node itself. 00978 class BinarySDNode : public SDNode { 00979 SDUse Ops[2]; 00980 public: 00981 BinarySDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 00982 SDValue X, SDValue Y) 00983 : SDNode(Opc, Order, dl, VTs) { 00984 InitOperands(Ops, X, Y); 00985 } 00986 }; 00987 00988 /// BinaryWithFlagsSDNode - This class is an extension of BinarySDNode 00989 /// used from those opcodes that have associated extra flags. 00990 class BinaryWithFlagsSDNode : public BinarySDNode { 00991 enum { NUW = (1 << 0), NSW = (1 << 1), EXACT = (1 << 2) }; 00992 00993 public: 00994 BinaryWithFlagsSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 00995 SDValue X, SDValue Y) 00996 : BinarySDNode(Opc, Order, dl, VTs, X, Y) {} 00997 /// getRawSubclassData - Return the SubclassData value, which contains an 00998 /// encoding of the flags. 00999 /// This function should be used to add subclass data to the NodeID value. 01000 unsigned getRawSubclassData() const { return SubclassData; } 01001 void setHasNoUnsignedWrap(bool b) { 01002 SubclassData = (SubclassData & ~NUW) | (b ? NUW : 0); 01003 } 01004 void setHasNoSignedWrap(bool b) { 01005 SubclassData = (SubclassData & ~NSW) | (b ? NSW : 0); 01006 } 01007 void setIsExact(bool b) { 01008 SubclassData = (SubclassData & ~EXACT) | (b ? EXACT : 0); 01009 } 01010 bool hasNoUnsignedWrap() const { return SubclassData & NUW; } 01011 bool hasNoSignedWrap() const { return SubclassData & NSW; } 01012 bool isExact() const { return SubclassData & EXACT; } 01013 static bool classof(const SDNode *N) { 01014 return isBinOpWithFlags(N->getOpcode()); 01015 } 01016 }; 01017 01018 /// TernarySDNode - This class is used for three-operand SDNodes. This is solely 01019 /// to allow co-allocation of node operands with the node itself. 01020 class TernarySDNode : public SDNode { 01021 SDUse Ops[3]; 01022 public: 01023 TernarySDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 01024 SDValue X, SDValue Y, SDValue Z) 01025 : SDNode(Opc, Order, dl, VTs) { 01026 InitOperands(Ops, X, Y, Z); 01027 } 01028 }; 01029 01030 01031 /// HandleSDNode - This class is used to form a handle around another node that 01032 /// is persistent and is updated across invocations of replaceAllUsesWith on its 01033 /// operand. This node should be directly created by end-users and not added to 01034 /// the AllNodes list. 01035 class HandleSDNode : public SDNode { 01036 SDUse Op; 01037 public: 01038 explicit HandleSDNode(SDValue X) 01039 : SDNode(ISD::HANDLENODE, 0, DebugLoc(), getSDVTList(MVT::Other)) { 01040 InitOperands(&Op, X); 01041 } 01042 ~HandleSDNode(); 01043 const SDValue &getValue() const { return Op; } 01044 }; 01045 01046 class AddrSpaceCastSDNode : public UnarySDNode { 01047 private: 01048 unsigned SrcAddrSpace; 01049 unsigned DestAddrSpace; 01050 01051 public: 01052 AddrSpaceCastSDNode(unsigned Order, DebugLoc dl, EVT VT, SDValue X, 01053 unsigned SrcAS, unsigned DestAS); 01054 01055 unsigned getSrcAddressSpace() const { return SrcAddrSpace; } 01056 unsigned getDestAddressSpace() const { return DestAddrSpace; } 01057 01058 static bool classof(const SDNode *N) { 01059 return N->getOpcode() == ISD::ADDRSPACECAST; 01060 } 01061 }; 01062 01063 /// Abstact virtual class for operations for memory operations 01064 class MemSDNode : public SDNode { 01065 private: 01066 // MemoryVT - VT of in-memory value. 01067 EVT MemoryVT; 01068 01069 protected: 01070 /// MMO - Memory reference information. 01071 MachineMemOperand *MMO; 01072 01073 public: 01074 MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 01075 EVT MemoryVT, MachineMemOperand *MMO); 01076 01077 MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 01078 ArrayRef<SDValue> Ops, EVT MemoryVT, MachineMemOperand *MMO); 01079 01080 bool readMem() const { return MMO->isLoad(); } 01081 bool writeMem() const { return MMO->isStore(); } 01082 01083 /// Returns alignment and volatility of the memory access 01084 unsigned getOriginalAlignment() const { 01085 return MMO->getBaseAlignment(); 01086 } 01087 unsigned getAlignment() const { 01088 return MMO->getAlignment(); 01089 } 01090 01091 /// getRawSubclassData - Return the SubclassData value, which contains an 01092 /// encoding of the volatile flag, as well as bits used by subclasses. This 01093 /// function should only be used to compute a FoldingSetNodeID value. 01094 unsigned getRawSubclassData() const { 01095 return SubclassData; 01096 } 01097 01098 // We access subclass data here so that we can check consistency 01099 // with MachineMemOperand information. 01100 bool isVolatile() const { return (SubclassData >> 5) & 1; } 01101 bool isNonTemporal() const { return (SubclassData >> 6) & 1; } 01102 bool isInvariant() const { return (SubclassData >> 7) & 1; } 01103 01104 AtomicOrdering getOrdering() const { 01105 return AtomicOrdering((SubclassData >> 8) & 15); 01106 } 01107 SynchronizationScope getSynchScope() const { 01108 return SynchronizationScope((SubclassData >> 12) & 1); 01109 } 01110 01111 // Returns the offset from the location of the access. 01112 int64_t getSrcValueOffset() const { return MMO->getOffset(); } 01113 01114 /// Returns the AA info that describes the dereference. 01115 AAMDNodes getAAInfo() const { return MMO->getAAInfo(); } 01116 01117 /// Returns the Ranges that describes the dereference. 01118 const MDNode *getRanges() const { return MMO->getRanges(); } 01119 01120 /// getMemoryVT - Return the type of the in-memory value. 01121 EVT getMemoryVT() const { return MemoryVT; } 01122 01123 /// getMemOperand - Return a MachineMemOperand object describing the memory 01124 /// reference performed by operation. 01125 MachineMemOperand *getMemOperand() const { return MMO; } 01126 01127 const MachinePointerInfo &getPointerInfo() const { 01128 return MMO->getPointerInfo(); 01129 } 01130 01131 /// getAddressSpace - Return the address space for the associated pointer 01132 unsigned getAddressSpace() const { 01133 return getPointerInfo().getAddrSpace(); 01134 } 01135 01136 /// refineAlignment - Update this MemSDNode's MachineMemOperand information 01137 /// to reflect the alignment of NewMMO, if it has a greater alignment. 01138 /// This must only be used when the new alignment applies to all users of 01139 /// this MachineMemOperand. 01140 void refineAlignment(const MachineMemOperand *NewMMO) { 01141 MMO->refineAlignment(NewMMO); 01142 } 01143 01144 const SDValue &getChain() const { return getOperand(0); } 01145 const SDValue &getBasePtr() const { 01146 return getOperand(getOpcode() == ISD::STORE ? 2 : 1); 01147 } 01148 01149 // Methods to support isa and dyn_cast 01150 static bool classof(const SDNode *N) { 01151 // For some targets, we lower some target intrinsics to a MemIntrinsicNode 01152 // with either an intrinsic or a target opcode. 01153 return N->getOpcode() == ISD::LOAD || 01154 N->getOpcode() == ISD::STORE || 01155 N->getOpcode() == ISD::PREFETCH || 01156 N->getOpcode() == ISD::ATOMIC_CMP_SWAP || 01157 N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS || 01158 N->getOpcode() == ISD::ATOMIC_SWAP || 01159 N->getOpcode() == ISD::ATOMIC_LOAD_ADD || 01160 N->getOpcode() == ISD::ATOMIC_LOAD_SUB || 01161 N->getOpcode() == ISD::ATOMIC_LOAD_AND || 01162 N->getOpcode() == ISD::ATOMIC_LOAD_OR || 01163 N->getOpcode() == ISD::ATOMIC_LOAD_XOR || 01164 N->getOpcode() == ISD::ATOMIC_LOAD_NAND || 01165 N->getOpcode() == ISD::ATOMIC_LOAD_MIN || 01166 N->getOpcode() == ISD::ATOMIC_LOAD_MAX || 01167 N->getOpcode() == ISD::ATOMIC_LOAD_UMIN || 01168 N->getOpcode() == ISD::ATOMIC_LOAD_UMAX || 01169 N->getOpcode() == ISD::ATOMIC_LOAD || 01170 N->getOpcode() == ISD::ATOMIC_STORE || 01171 N->isMemIntrinsic() || 01172 N->isTargetMemoryOpcode(); 01173 } 01174 }; 01175 01176 /// AtomicSDNode - A SDNode reprenting atomic operations. 01177 /// 01178 class AtomicSDNode : public MemSDNode { 01179 SDUse Ops[4]; 01180 01181 /// For cmpxchg instructions, the ordering requirements when a store does not 01182 /// occur. 01183 AtomicOrdering FailureOrdering; 01184 01185 void InitAtomic(AtomicOrdering SuccessOrdering, 01186 AtomicOrdering FailureOrdering, 01187 SynchronizationScope SynchScope) { 01188 // This must match encodeMemSDNodeFlags() in SelectionDAG.cpp. 01189 assert((SuccessOrdering & 15) == SuccessOrdering && 01190 "Ordering may not require more than 4 bits!"); 01191 assert((FailureOrdering & 15) == FailureOrdering && 01192 "Ordering may not require more than 4 bits!"); 01193 assert((SynchScope & 1) == SynchScope && 01194 "SynchScope may not require more than 1 bit!"); 01195 SubclassData |= SuccessOrdering << 8; 01196 SubclassData |= SynchScope << 12; 01197 this->FailureOrdering = FailureOrdering; 01198 assert(getSuccessOrdering() == SuccessOrdering && 01199 "Ordering encoding error!"); 01200 assert(getFailureOrdering() == FailureOrdering && 01201 "Ordering encoding error!"); 01202 assert(getSynchScope() == SynchScope && "Synch-scope encoding error!"); 01203 } 01204 01205 public: 01206 // Opc: opcode for atomic 01207 // VTL: value type list 01208 // Chain: memory chain for operaand 01209 // Ptr: address to update as a SDValue 01210 // Cmp: compare value 01211 // Swp: swap value 01212 // SrcVal: address to update as a Value (used for MemOperand) 01213 // Align: alignment of memory 01214 AtomicSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTL, 01215 EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, 01216 MachineMemOperand *MMO, AtomicOrdering Ordering, 01217 SynchronizationScope SynchScope) 01218 : MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) { 01219 InitAtomic(Ordering, Ordering, SynchScope); 01220 InitOperands(Ops, Chain, Ptr, Cmp, Swp); 01221 } 01222 AtomicSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTL, 01223 EVT MemVT, 01224 SDValue Chain, SDValue Ptr, 01225 SDValue Val, MachineMemOperand *MMO, 01226 AtomicOrdering Ordering, SynchronizationScope SynchScope) 01227 : MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) { 01228 InitAtomic(Ordering, Ordering, SynchScope); 01229 InitOperands(Ops, Chain, Ptr, Val); 01230 } 01231 AtomicSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTL, 01232 EVT MemVT, 01233 SDValue Chain, SDValue Ptr, 01234 MachineMemOperand *MMO, 01235 AtomicOrdering Ordering, SynchronizationScope SynchScope) 01236 : MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) { 01237 InitAtomic(Ordering, Ordering, SynchScope); 01238 InitOperands(Ops, Chain, Ptr); 01239 } 01240 AtomicSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTL, EVT MemVT, 01241 const SDValue* AllOps, SDUse *DynOps, unsigned NumOps, 01242 MachineMemOperand *MMO, 01243 AtomicOrdering SuccessOrdering, AtomicOrdering FailureOrdering, 01244 SynchronizationScope SynchScope) 01245 : MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) { 01246 InitAtomic(SuccessOrdering, FailureOrdering, SynchScope); 01247 assert((DynOps || NumOps <= array_lengthof(Ops)) && 01248 "Too many ops for internal storage!"); 01249 InitOperands(DynOps ? DynOps : Ops, AllOps, NumOps); 01250 } 01251 01252 const SDValue &getBasePtr() const { return getOperand(1); } 01253 const SDValue &getVal() const { return getOperand(2); } 01254 01255 AtomicOrdering getSuccessOrdering() const { 01256 return getOrdering(); 01257 } 01258 01259 // Not quite enough room in SubclassData for everything, so failure gets its 01260 // own field. 01261 AtomicOrdering getFailureOrdering() const { 01262 return FailureOrdering; 01263 } 01264 01265 bool isCompareAndSwap() const { 01266 unsigned Op = getOpcode(); 01267 return Op == ISD::ATOMIC_CMP_SWAP || Op == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS; 01268 } 01269 01270 // Methods to support isa and dyn_cast 01271 static bool classof(const SDNode *N) { 01272 return N->getOpcode() == ISD::ATOMIC_CMP_SWAP || 01273 N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS || 01274 N->getOpcode() == ISD::ATOMIC_SWAP || 01275 N->getOpcode() == ISD::ATOMIC_LOAD_ADD || 01276 N->getOpcode() == ISD::ATOMIC_LOAD_SUB || 01277 N->getOpcode() == ISD::ATOMIC_LOAD_AND || 01278 N->getOpcode() == ISD::ATOMIC_LOAD_OR || 01279 N->getOpcode() == ISD::ATOMIC_LOAD_XOR || 01280 N->getOpcode() == ISD::ATOMIC_LOAD_NAND || 01281 N->getOpcode() == ISD::ATOMIC_LOAD_MIN || 01282 N->getOpcode() == ISD::ATOMIC_LOAD_MAX || 01283 N->getOpcode() == ISD::ATOMIC_LOAD_UMIN || 01284 N->getOpcode() == ISD::ATOMIC_LOAD_UMAX || 01285 N->getOpcode() == ISD::ATOMIC_LOAD || 01286 N->getOpcode() == ISD::ATOMIC_STORE; 01287 } 01288 }; 01289 01290 /// MemIntrinsicSDNode - This SDNode is used for target intrinsics that touch 01291 /// memory and need an associated MachineMemOperand. Its opcode may be 01292 /// INTRINSIC_VOID, INTRINSIC_W_CHAIN, PREFETCH, or a target-specific opcode 01293 /// with a value not less than FIRST_TARGET_MEMORY_OPCODE. 01294 class MemIntrinsicSDNode : public MemSDNode { 01295 public: 01296 MemIntrinsicSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 01297 ArrayRef<SDValue> Ops, EVT MemoryVT, 01298 MachineMemOperand *MMO) 01299 : MemSDNode(Opc, Order, dl, VTs, Ops, MemoryVT, MMO) { 01300 SubclassData |= 1u << 13; 01301 } 01302 01303 // Methods to support isa and dyn_cast 01304 static bool classof(const SDNode *N) { 01305 // We lower some target intrinsics to their target opcode 01306 // early a node with a target opcode can be of this class 01307 return N->isMemIntrinsic() || 01308 N->getOpcode() == ISD::PREFETCH || 01309 N->isTargetMemoryOpcode(); 01310 } 01311 }; 01312 01313 /// ShuffleVectorSDNode - This SDNode is used to implement the code generator 01314 /// support for the llvm IR shufflevector instruction. It combines elements 01315 /// from two input vectors into a new input vector, with the selection and 01316 /// ordering of elements determined by an array of integers, referred to as 01317 /// the shuffle mask. For input vectors of width N, mask indices of 0..N-1 01318 /// refer to elements from the LHS input, and indices from N to 2N-1 the RHS. 01319 /// An index of -1 is treated as undef, such that the code generator may put 01320 /// any value in the corresponding element of the result. 01321 class ShuffleVectorSDNode : public SDNode { 01322 SDUse Ops[2]; 01323 01324 // The memory for Mask is owned by the SelectionDAG's OperandAllocator, and 01325 // is freed when the SelectionDAG object is destroyed. 01326 const int *Mask; 01327 protected: 01328 friend class SelectionDAG; 01329 ShuffleVectorSDNode(EVT VT, unsigned Order, DebugLoc dl, SDValue N1, 01330 SDValue N2, const int *M) 01331 : SDNode(ISD::VECTOR_SHUFFLE, Order, dl, getSDVTList(VT)), Mask(M) { 01332 InitOperands(Ops, N1, N2); 01333 } 01334 public: 01335 01336 ArrayRef<int> getMask() const { 01337 EVT VT = getValueType(0); 01338 return makeArrayRef(Mask, VT.getVectorNumElements()); 01339 } 01340 int getMaskElt(unsigned Idx) const { 01341 assert(Idx < getValueType(0).getVectorNumElements() && "Idx out of range!"); 01342 return Mask[Idx]; 01343 } 01344 01345 bool isSplat() const { return isSplatMask(Mask, getValueType(0)); } 01346 int getSplatIndex() const { 01347 assert(isSplat() && "Cannot get splat index for non-splat!"); 01348 EVT VT = getValueType(0); 01349 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i) { 01350 if (Mask[i] >= 0) 01351 return Mask[i]; 01352 } 01353 llvm_unreachable("Splat with all undef indices?"); 01354 } 01355 static bool isSplatMask(const int *Mask, EVT VT); 01356 01357 static bool classof(const SDNode *N) { 01358 return N->getOpcode() == ISD::VECTOR_SHUFFLE; 01359 } 01360 }; 01361 01362 class ConstantSDNode : public SDNode { 01363 const ConstantInt *Value; 01364 friend class SelectionDAG; 01365 ConstantSDNode(bool isTarget, bool isOpaque, const ConstantInt *val, EVT VT) 01366 : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, 01367 0, DebugLoc(), getSDVTList(VT)), Value(val) { 01368 SubclassData |= (uint16_t)isOpaque; 01369 } 01370 public: 01371 01372 const ConstantInt *getConstantIntValue() const { return Value; } 01373 const APInt &getAPIntValue() const { return Value->getValue(); } 01374 uint64_t getZExtValue() const { return Value->getZExtValue(); } 01375 int64_t getSExtValue() const { return Value->getSExtValue(); } 01376 01377 bool isOne() const { return Value->isOne(); } 01378 bool isNullValue() const { return Value->isNullValue(); } 01379 bool isAllOnesValue() const { return Value->isAllOnesValue(); } 01380 01381 bool isOpaque() const { return SubclassData & 1; } 01382 01383 static bool classof(const SDNode *N) { 01384 return N->getOpcode() == ISD::Constant || 01385 N->getOpcode() == ISD::TargetConstant; 01386 } 01387 }; 01388 01389 class ConstantFPSDNode : public SDNode { 01390 const ConstantFP *Value; 01391 friend class SelectionDAG; 01392 ConstantFPSDNode(bool isTarget, const ConstantFP *val, EVT VT) 01393 : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP, 01394 0, DebugLoc(), getSDVTList(VT)), Value(val) { 01395 } 01396 public: 01397 01398 const APFloat& getValueAPF() const { return Value->getValueAPF(); } 01399 const ConstantFP *getConstantFPValue() const { return Value; } 01400 01401 /// isZero - Return true if the value is positive or negative zero. 01402 bool isZero() const { return Value->isZero(); } 01403 01404 /// isNaN - Return true if the value is a NaN. 01405 bool isNaN() const { return Value->isNaN(); } 01406 01407 /// isExactlyValue - We don't rely on operator== working on double values, as 01408 /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 01409 /// As such, this method can be used to do an exact bit-for-bit comparison of 01410 /// two floating point values. 01411 01412 /// We leave the version with the double argument here because it's just so 01413 /// convenient to write "2.0" and the like. Without this function we'd 01414 /// have to duplicate its logic everywhere it's called. 01415 bool isExactlyValue(double V) const { 01416 bool ignored; 01417 APFloat Tmp(V); 01418 Tmp.convert(Value->getValueAPF().getSemantics(), 01419 APFloat::rmNearestTiesToEven, &ignored); 01420 return isExactlyValue(Tmp); 01421 } 01422 bool isExactlyValue(const APFloat& V) const; 01423 01424 static bool isValueValidForType(EVT VT, const APFloat& Val); 01425 01426 static bool classof(const SDNode *N) { 01427 return N->getOpcode() == ISD::ConstantFP || 01428 N->getOpcode() == ISD::TargetConstantFP; 01429 } 01430 }; 01431 01432 class GlobalAddressSDNode : public SDNode { 01433 const GlobalValue *TheGlobal; 01434 int64_t Offset; 01435 unsigned char TargetFlags; 01436 friend class SelectionDAG; 01437 GlobalAddressSDNode(unsigned Opc, unsigned Order, DebugLoc DL, 01438 const GlobalValue *GA, EVT VT, int64_t o, 01439 unsigned char TargetFlags); 01440 public: 01441 01442 const GlobalValue *getGlobal() const { return TheGlobal; } 01443 int64_t getOffset() const { return Offset; } 01444 unsigned char getTargetFlags() const { return TargetFlags; } 01445 // Return the address space this GlobalAddress belongs to. 01446 unsigned getAddressSpace() const; 01447 01448 static bool classof(const SDNode *N) { 01449 return N->getOpcode() == ISD::GlobalAddress || 01450 N->getOpcode() == ISD::TargetGlobalAddress || 01451 N->getOpcode() == ISD::GlobalTLSAddress || 01452 N->getOpcode() == ISD::TargetGlobalTLSAddress; 01453 } 01454 }; 01455 01456 class FrameIndexSDNode : public SDNode { 01457 int FI; 01458 friend class SelectionDAG; 01459 FrameIndexSDNode(int fi, EVT VT, bool isTarg) 01460 : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex, 01461 0, DebugLoc(), getSDVTList(VT)), FI(fi) { 01462 } 01463 public: 01464 01465 int getIndex() const { return FI; } 01466 01467 static bool classof(const SDNode *N) { 01468 return N->getOpcode() == ISD::FrameIndex || 01469 N->getOpcode() == ISD::TargetFrameIndex; 01470 } 01471 }; 01472 01473 class JumpTableSDNode : public SDNode { 01474 int JTI; 01475 unsigned char TargetFlags; 01476 friend class SelectionDAG; 01477 JumpTableSDNode(int jti, EVT VT, bool isTarg, unsigned char TF) 01478 : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, 01479 0, DebugLoc(), getSDVTList(VT)), JTI(jti), TargetFlags(TF) { 01480 } 01481 public: 01482 01483 int getIndex() const { return JTI; } 01484 unsigned char getTargetFlags() const { return TargetFlags; } 01485 01486 static bool classof(const SDNode *N) { 01487 return N->getOpcode() == ISD::JumpTable || 01488 N->getOpcode() == ISD::TargetJumpTable; 01489 } 01490 }; 01491 01492 class ConstantPoolSDNode : public SDNode { 01493 union { 01494 const Constant *ConstVal; 01495 MachineConstantPoolValue *MachineCPVal; 01496 } Val; 01497 int Offset; // It's a MachineConstantPoolValue if top bit is set. 01498 unsigned Alignment; // Minimum alignment requirement of CP (not log2 value). 01499 unsigned char TargetFlags; 01500 friend class SelectionDAG; 01501 ConstantPoolSDNode(bool isTarget, const Constant *c, EVT VT, int o, 01502 unsigned Align, unsigned char TF) 01503 : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 01504 DebugLoc(), getSDVTList(VT)), Offset(o), Alignment(Align), 01505 TargetFlags(TF) { 01506 assert(Offset >= 0 && "Offset is too large"); 01507 Val.ConstVal = c; 01508 } 01509 ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v, 01510 EVT VT, int o, unsigned Align, unsigned char TF) 01511 : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 01512 DebugLoc(), getSDVTList(VT)), Offset(o), Alignment(Align), 01513 TargetFlags(TF) { 01514 assert(Offset >= 0 && "Offset is too large"); 01515 Val.MachineCPVal = v; 01516 Offset |= 1 << (sizeof(unsigned)*CHAR_BIT-1); 01517 } 01518 public: 01519 01520 bool isMachineConstantPoolEntry() const { 01521 return Offset < 0; 01522 } 01523 01524 const Constant *getConstVal() const { 01525 assert(!isMachineConstantPoolEntry() && "Wrong constantpool type"); 01526 return Val.ConstVal; 01527 } 01528 01529 MachineConstantPoolValue *getMachineCPVal() const { 01530 assert(isMachineConstantPoolEntry() && "Wrong constantpool type"); 01531 return Val.MachineCPVal; 01532 } 01533 01534 int getOffset() const { 01535 return Offset & ~(1 << (sizeof(unsigned)*CHAR_BIT-1)); 01536 } 01537 01538 // Return the alignment of this constant pool object, which is either 0 (for 01539 // default alignment) or the desired value. 01540 unsigned getAlignment() const { return Alignment; } 01541 unsigned char getTargetFlags() const { return TargetFlags; } 01542 01543 Type *getType() const; 01544 01545 static bool classof(const SDNode *N) { 01546 return N->getOpcode() == ISD::ConstantPool || 01547 N->getOpcode() == ISD::TargetConstantPool; 01548 } 01549 }; 01550 01551 /// Completely target-dependent object reference. 01552 class TargetIndexSDNode : public SDNode { 01553 unsigned char TargetFlags; 01554 int Index; 01555 int64_t Offset; 01556 friend class SelectionDAG; 01557 public: 01558 01559 TargetIndexSDNode(int Idx, EVT VT, int64_t Ofs, unsigned char TF) 01560 : SDNode(ISD::TargetIndex, 0, DebugLoc(), getSDVTList(VT)), 01561 TargetFlags(TF), Index(Idx), Offset(Ofs) {} 01562 public: 01563 01564 unsigned char getTargetFlags() const { return TargetFlags; } 01565 int getIndex() const { return Index; } 01566 int64_t getOffset() const { return Offset; } 01567 01568 static bool classof(const SDNode *N) { 01569 return N->getOpcode() == ISD::TargetIndex; 01570 } 01571 }; 01572 01573 class BasicBlockSDNode : public SDNode { 01574 MachineBasicBlock *MBB; 01575 friend class SelectionDAG; 01576 /// Debug info is meaningful and potentially useful here, but we create 01577 /// blocks out of order when they're jumped to, which makes it a bit 01578 /// harder. Let's see if we need it first. 01579 explicit BasicBlockSDNode(MachineBasicBlock *mbb) 01580 : SDNode(ISD::BasicBlock, 0, DebugLoc(), getSDVTList(MVT::Other)), MBB(mbb) 01581 {} 01582 public: 01583 01584 MachineBasicBlock *getBasicBlock() const { return MBB; } 01585 01586 static bool classof(const SDNode *N) { 01587 return N->getOpcode() == ISD::BasicBlock; 01588 } 01589 }; 01590 01591 /// BuildVectorSDNode - A "pseudo-class" with methods for operating on 01592 /// BUILD_VECTORs. 01593 class BuildVectorSDNode : public SDNode { 01594 // These are constructed as SDNodes and then cast to BuildVectorSDNodes. 01595 explicit BuildVectorSDNode() LLVM_DELETED_FUNCTION; 01596 public: 01597 /// isConstantSplat - Check if this is a constant splat, and if so, find the 01598 /// smallest element size that splats the vector. If MinSplatBits is 01599 /// nonzero, the element size must be at least that large. Note that the 01600 /// splat element may be the entire vector (i.e., a one element vector). 01601 /// Returns the splat element value in SplatValue. Any undefined bits in 01602 /// that value are zero, and the corresponding bits in the SplatUndef mask 01603 /// are set. The SplatBitSize value is set to the splat element size in 01604 /// bits. HasAnyUndefs is set to true if any bits in the vector are 01605 /// undefined. isBigEndian describes the endianness of the target. 01606 bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, 01607 unsigned &SplatBitSize, bool &HasAnyUndefs, 01608 unsigned MinSplatBits = 0, 01609 bool isBigEndian = false) const; 01610 01611 /// \brief Returns the splatted value or a null value if this is not a splat. 01612 /// 01613 /// If passed a non-null UndefElements bitvector, it will resize it to match 01614 /// the vector width and set the bits where elements are undef. 01615 SDValue getSplatValue(BitVector *UndefElements = nullptr) const; 01616 01617 /// \brief Returns the splatted constant or null if this is not a constant 01618 /// splat. 01619 /// 01620 /// If passed a non-null UndefElements bitvector, it will resize it to match 01621 /// the vector width and set the bits where elements are undef. 01622 ConstantSDNode * 01623 getConstantSplatNode(BitVector *UndefElements = nullptr) const; 01624 01625 /// \brief Returns the splatted constant FP or null if this is not a constant 01626 /// FP splat. 01627 /// 01628 /// If passed a non-null UndefElements bitvector, it will resize it to match 01629 /// the vector width and set the bits where elements are undef. 01630 ConstantFPSDNode * 01631 getConstantFPSplatNode(BitVector *UndefElements = nullptr) const; 01632 01633 bool isConstant() const; 01634 01635 static inline bool classof(const SDNode *N) { 01636 return N->getOpcode() == ISD::BUILD_VECTOR; 01637 } 01638 }; 01639 01640 /// SrcValueSDNode - An SDNode that holds an arbitrary LLVM IR Value. This is 01641 /// used when the SelectionDAG needs to make a simple reference to something 01642 /// in the LLVM IR representation. 01643 /// 01644 class SrcValueSDNode : public SDNode { 01645 const Value *V; 01646 friend class SelectionDAG; 01647 /// Create a SrcValue for a general value. 01648 explicit SrcValueSDNode(const Value *v) 01649 : SDNode(ISD::SRCVALUE, 0, DebugLoc(), getSDVTList(MVT::Other)), V(v) {} 01650 01651 public: 01652 /// getValue - return the contained Value. 01653 const Value *getValue() const { return V; } 01654 01655 static bool classof(const SDNode *N) { 01656 return N->getOpcode() == ISD::SRCVALUE; 01657 } 01658 }; 01659 01660 class MDNodeSDNode : public SDNode { 01661 const MDNode *MD; 01662 friend class SelectionDAG; 01663 explicit MDNodeSDNode(const MDNode *md) 01664 : SDNode(ISD::MDNODE_SDNODE, 0, DebugLoc(), getSDVTList(MVT::Other)), MD(md) 01665 {} 01666 public: 01667 01668 const MDNode *getMD() const { return MD; } 01669 01670 static bool classof(const SDNode *N) { 01671 return N->getOpcode() == ISD::MDNODE_SDNODE; 01672 } 01673 }; 01674 01675 class RegisterSDNode : public SDNode { 01676 unsigned Reg; 01677 friend class SelectionDAG; 01678 RegisterSDNode(unsigned reg, EVT VT) 01679 : SDNode(ISD::Register, 0, DebugLoc(), getSDVTList(VT)), Reg(reg) { 01680 } 01681 public: 01682 01683 unsigned getReg() const { return Reg; } 01684 01685 static bool classof(const SDNode *N) { 01686 return N->getOpcode() == ISD::Register; 01687 } 01688 }; 01689 01690 class RegisterMaskSDNode : public SDNode { 01691 // The memory for RegMask is not owned by the node. 01692 const uint32_t *RegMask; 01693 friend class SelectionDAG; 01694 RegisterMaskSDNode(const uint32_t *mask) 01695 : SDNode(ISD::RegisterMask, 0, DebugLoc(), getSDVTList(MVT::Untyped)), 01696 RegMask(mask) {} 01697 public: 01698 01699 const uint32_t *getRegMask() const { return RegMask; } 01700 01701 static bool classof(const SDNode *N) { 01702 return N->getOpcode() == ISD::RegisterMask; 01703 } 01704 }; 01705 01706 class BlockAddressSDNode : public SDNode { 01707 const BlockAddress *BA; 01708 int64_t Offset; 01709 unsigned char TargetFlags; 01710 friend class SelectionDAG; 01711 BlockAddressSDNode(unsigned NodeTy, EVT VT, const BlockAddress *ba, 01712 int64_t o, unsigned char Flags) 01713 : SDNode(NodeTy, 0, DebugLoc(), getSDVTList(VT)), 01714 BA(ba), Offset(o), TargetFlags(Flags) { 01715 } 01716 public: 01717 const BlockAddress *getBlockAddress() const { return BA; } 01718 int64_t getOffset() const { return Offset; } 01719 unsigned char getTargetFlags() const { return TargetFlags; } 01720 01721 static bool classof(const SDNode *N) { 01722 return N->getOpcode() == ISD::BlockAddress || 01723 N->getOpcode() == ISD::TargetBlockAddress; 01724 } 01725 }; 01726 01727 class EHLabelSDNode : public SDNode { 01728 SDUse Chain; 01729 MCSymbol *Label; 01730 friend class SelectionDAG; 01731 EHLabelSDNode(unsigned Order, DebugLoc dl, SDValue ch, MCSymbol *L) 01732 : SDNode(ISD::EH_LABEL, Order, dl, getSDVTList(MVT::Other)), Label(L) { 01733 InitOperands(&Chain, ch); 01734 } 01735 public: 01736 MCSymbol *getLabel() const { return Label; } 01737 01738 static bool classof(const SDNode *N) { 01739 return N->getOpcode() == ISD::EH_LABEL; 01740 } 01741 }; 01742 01743 class ExternalSymbolSDNode : public SDNode { 01744 const char *Symbol; 01745 unsigned char TargetFlags; 01746 01747 friend class SelectionDAG; 01748 ExternalSymbolSDNode(bool isTarget, const char *Sym, unsigned char TF, EVT VT) 01749 : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol, 01750 0, DebugLoc(), getSDVTList(VT)), Symbol(Sym), TargetFlags(TF) { 01751 } 01752 public: 01753 01754 const char *getSymbol() const { return Symbol; } 01755 unsigned char getTargetFlags() const { return TargetFlags; } 01756 01757 static bool classof(const SDNode *N) { 01758 return N->getOpcode() == ISD::ExternalSymbol || 01759 N->getOpcode() == ISD::TargetExternalSymbol; 01760 } 01761 }; 01762 01763 class CondCodeSDNode : public SDNode { 01764 ISD::CondCode Condition; 01765 friend class SelectionDAG; 01766 explicit CondCodeSDNode(ISD::CondCode Cond) 01767 : SDNode(ISD::CONDCODE, 0, DebugLoc(), getSDVTList(MVT::Other)), 01768 Condition(Cond) { 01769 } 01770 public: 01771 01772 ISD::CondCode get() const { return Condition; } 01773 01774 static bool classof(const SDNode *N) { 01775 return N->getOpcode() == ISD::CONDCODE; 01776 } 01777 }; 01778 01779 /// CvtRndSatSDNode - NOTE: avoid using this node as this may disappear in the 01780 /// future and most targets don't support it. 01781 class CvtRndSatSDNode : public SDNode { 01782 ISD::CvtCode CvtCode; 01783 friend class SelectionDAG; 01784 explicit CvtRndSatSDNode(EVT VT, unsigned Order, DebugLoc dl, 01785 ArrayRef<SDValue> Ops, ISD::CvtCode Code) 01786 : SDNode(ISD::CONVERT_RNDSAT, Order, dl, getSDVTList(VT), Ops), 01787 CvtCode(Code) { 01788 assert(Ops.size() == 5 && "wrong number of operations"); 01789 } 01790 public: 01791 ISD::CvtCode getCvtCode() const { return CvtCode; } 01792 01793 static bool classof(const SDNode *N) { 01794 return N->getOpcode() == ISD::CONVERT_RNDSAT; 01795 } 01796 }; 01797 01798 /// VTSDNode - This class is used to represent EVT's, which are used 01799 /// to parameterize some operations. 01800 class VTSDNode : public SDNode { 01801 EVT ValueType; 01802 friend class SelectionDAG; 01803 explicit VTSDNode(EVT VT) 01804 : SDNode(ISD::VALUETYPE, 0, DebugLoc(), getSDVTList(MVT::Other)), 01805 ValueType(VT) { 01806 } 01807 public: 01808 01809 EVT getVT() const { return ValueType; } 01810 01811 static bool classof(const SDNode *N) { 01812 return N->getOpcode() == ISD::VALUETYPE; 01813 } 01814 }; 01815 01816 /// LSBaseSDNode - Base class for LoadSDNode and StoreSDNode 01817 /// 01818 class LSBaseSDNode : public MemSDNode { 01819 //! Operand array for load and store 01820 /*! 01821 \note Moving this array to the base class captures more 01822 common functionality shared between LoadSDNode and 01823 StoreSDNode 01824 */ 01825 SDUse Ops[4]; 01826 public: 01827 LSBaseSDNode(ISD::NodeType NodeTy, unsigned Order, DebugLoc dl, 01828 SDValue *Operands, unsigned numOperands, 01829 SDVTList VTs, ISD::MemIndexedMode AM, EVT MemVT, 01830 MachineMemOperand *MMO) 01831 : MemSDNode(NodeTy, Order, dl, VTs, MemVT, MMO) { 01832 SubclassData |= AM << 2; 01833 assert(getAddressingMode() == AM && "MemIndexedMode encoding error!"); 01834 InitOperands(Ops, Operands, numOperands); 01835 assert((getOffset().getOpcode() == ISD::UNDEF || isIndexed()) && 01836 "Only indexed loads and stores have a non-undef offset operand"); 01837 } 01838 01839 const SDValue &getOffset() const { 01840 return getOperand(getOpcode() == ISD::LOAD ? 2 : 3); 01841 } 01842 01843 /// getAddressingMode - Return the addressing mode for this load or store: 01844 /// unindexed, pre-inc, pre-dec, post-inc, or post-dec. 01845 ISD::MemIndexedMode getAddressingMode() const { 01846 return ISD::MemIndexedMode((SubclassData >> 2) & 7); 01847 } 01848 01849 /// isIndexed - Return true if this is a pre/post inc/dec load/store. 01850 bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; } 01851 01852 /// isUnindexed - Return true if this is NOT a pre/post inc/dec load/store. 01853 bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; } 01854 01855 static bool classof(const SDNode *N) { 01856 return N->getOpcode() == ISD::LOAD || 01857 N->getOpcode() == ISD::STORE; 01858 } 01859 }; 01860 01861 /// LoadSDNode - This class is used to represent ISD::LOAD nodes. 01862 /// 01863 class LoadSDNode : public LSBaseSDNode { 01864 friend class SelectionDAG; 01865 LoadSDNode(SDValue *ChainPtrOff, unsigned Order, DebugLoc dl, SDVTList VTs, 01866 ISD::MemIndexedMode AM, ISD::LoadExtType ETy, EVT MemVT, 01867 MachineMemOperand *MMO) 01868 : LSBaseSDNode(ISD::LOAD, Order, dl, ChainPtrOff, 3, VTs, AM, MemVT, MMO) { 01869 SubclassData |= (unsigned short)ETy; 01870 assert(getExtensionType() == ETy && "LoadExtType encoding error!"); 01871 assert(readMem() && "Load MachineMemOperand is not a load!"); 01872 assert(!writeMem() && "Load MachineMemOperand is a store!"); 01873 } 01874 public: 01875 01876 /// getExtensionType - Return whether this is a plain node, 01877 /// or one of the varieties of value-extending loads. 01878 ISD::LoadExtType getExtensionType() const { 01879 return ISD::LoadExtType(SubclassData & 3); 01880 } 01881 01882 const SDValue &getBasePtr() const { return getOperand(1); } 01883 const SDValue &getOffset() const { return getOperand(2); } 01884 01885 static bool classof(const SDNode *N) { 01886 return N->getOpcode() == ISD::LOAD; 01887 } 01888 }; 01889 01890 /// StoreSDNode - This class is used to represent ISD::STORE nodes. 01891 /// 01892 class StoreSDNode : public LSBaseSDNode { 01893 friend class SelectionDAG; 01894 StoreSDNode(SDValue *ChainValuePtrOff, unsigned Order, DebugLoc dl, 01895 SDVTList VTs, ISD::MemIndexedMode AM, bool isTrunc, EVT MemVT, 01896 MachineMemOperand *MMO) 01897 : LSBaseSDNode(ISD::STORE, Order, dl, ChainValuePtrOff, 4, 01898 VTs, AM, MemVT, MMO) { 01899 SubclassData |= (unsigned short)isTrunc; 01900 assert(isTruncatingStore() == isTrunc && "isTrunc encoding error!"); 01901 assert(!readMem() && "Store MachineMemOperand is a load!"); 01902 assert(writeMem() && "Store MachineMemOperand is not a store!"); 01903 } 01904 public: 01905 01906 /// isTruncatingStore - Return true if the op does a truncation before store. 01907 /// For integers this is the same as doing a TRUNCATE and storing the result. 01908 /// For floats, it is the same as doing an FP_ROUND and storing the result. 01909 bool isTruncatingStore() const { return SubclassData & 1; } 01910 01911 const SDValue &getValue() const { return getOperand(1); } 01912 const SDValue &getBasePtr() const { return getOperand(2); } 01913 const SDValue &getOffset() const { return getOperand(3); } 01914 01915 static bool classof(const SDNode *N) { 01916 return N->getOpcode() == ISD::STORE; 01917 } 01918 }; 01919 01920 /// MachineSDNode - An SDNode that represents everything that will be needed 01921 /// to construct a MachineInstr. These nodes are created during the 01922 /// instruction selection proper phase. 01923 /// 01924 class MachineSDNode : public SDNode { 01925 public: 01926 typedef MachineMemOperand **mmo_iterator; 01927 01928 private: 01929 friend class SelectionDAG; 01930 MachineSDNode(unsigned Opc, unsigned Order, const DebugLoc DL, SDVTList VTs) 01931 : SDNode(Opc, Order, DL, VTs), MemRefs(nullptr), MemRefsEnd(nullptr) {} 01932 01933 /// LocalOperands - Operands for this instruction, if they fit here. If 01934 /// they don't, this field is unused. 01935 SDUse LocalOperands[4]; 01936 01937 /// MemRefs - Memory reference descriptions for this instruction. 01938 mmo_iterator MemRefs; 01939 mmo_iterator MemRefsEnd; 01940 01941 public: 01942 mmo_iterator memoperands_begin() const { return MemRefs; } 01943 mmo_iterator memoperands_end() const { return MemRefsEnd; } 01944 bool memoperands_empty() const { return MemRefsEnd == MemRefs; } 01945 01946 /// setMemRefs - Assign this MachineSDNodes's memory reference descriptor 01947 /// list. This does not transfer ownership. 01948 void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) { 01949 for (mmo_iterator MMI = NewMemRefs, MME = NewMemRefsEnd; MMI != MME; ++MMI) 01950 assert(*MMI && "Null mem ref detected!"); 01951 MemRefs = NewMemRefs; 01952 MemRefsEnd = NewMemRefsEnd; 01953 } 01954 01955 static bool classof(const SDNode *N) { 01956 return N->isMachineOpcode(); 01957 } 01958 }; 01959 01960 class SDNodeIterator : public std::iterator<std::forward_iterator_tag, 01961 SDNode, ptrdiff_t> { 01962 const SDNode *Node; 01963 unsigned Operand; 01964 01965 SDNodeIterator(const SDNode *N, unsigned Op) : Node(N), Operand(Op) {} 01966 public: 01967 bool operator==(const SDNodeIterator& x) const { 01968 return Operand == x.Operand; 01969 } 01970 bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } 01971 01972 const SDNodeIterator &operator=(const SDNodeIterator &I) { 01973 assert(I.Node == Node && "Cannot assign iterators to two different nodes!"); 01974 Operand = I.Operand; 01975 return *this; 01976 } 01977 01978 pointer operator*() const { 01979 return Node->getOperand(Operand).getNode(); 01980 } 01981 pointer operator->() const { return operator*(); } 01982 01983 SDNodeIterator& operator++() { // Preincrement 01984 ++Operand; 01985 return *this; 01986 } 01987 SDNodeIterator operator++(int) { // Postincrement 01988 SDNodeIterator tmp = *this; ++*this; return tmp; 01989 } 01990 size_t operator-(SDNodeIterator Other) const { 01991 assert(Node == Other.Node && 01992 "Cannot compare iterators of two different nodes!"); 01993 return Operand - Other.Operand; 01994 } 01995 01996 static SDNodeIterator begin(const SDNode *N) { return SDNodeIterator(N, 0); } 01997 static SDNodeIterator end (const SDNode *N) { 01998 return SDNodeIterator(N, N->getNumOperands()); 01999 } 02000 02001 unsigned getOperand() const { return Operand; } 02002 const SDNode *getNode() const { return Node; } 02003 }; 02004 02005 template <> struct GraphTraits<SDNode*> { 02006 typedef SDNode NodeType; 02007 typedef SDNodeIterator ChildIteratorType; 02008 static inline NodeType *getEntryNode(SDNode *N) { return N; } 02009 static inline ChildIteratorType child_begin(NodeType *N) { 02010 return SDNodeIterator::begin(N); 02011 } 02012 static inline ChildIteratorType child_end(NodeType *N) { 02013 return SDNodeIterator::end(N); 02014 } 02015 }; 02016 02017 /// LargestSDNode - The largest SDNode class. 02018 /// 02019 typedef AtomicSDNode LargestSDNode; 02020 02021 /// MostAlignedSDNode - The SDNode class with the greatest alignment 02022 /// requirement. 02023 /// 02024 typedef GlobalAddressSDNode MostAlignedSDNode; 02025 02026 namespace ISD { 02027 /// isNormalLoad - Returns true if the specified node is a non-extending 02028 /// and unindexed load. 02029 inline bool isNormalLoad(const SDNode *N) { 02030 const LoadSDNode *Ld = dyn_cast<LoadSDNode>(N); 02031 return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD && 02032 Ld->getAddressingMode() == ISD::UNINDEXED; 02033 } 02034 02035 /// isNON_EXTLoad - Returns true if the specified node is a non-extending 02036 /// load. 02037 inline bool isNON_EXTLoad(const SDNode *N) { 02038 return isa<LoadSDNode>(N) && 02039 cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; 02040 } 02041 02042 /// isEXTLoad - Returns true if the specified node is a EXTLOAD. 02043 /// 02044 inline bool isEXTLoad(const SDNode *N) { 02045 return isa<LoadSDNode>(N) && 02046 cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD; 02047 } 02048 02049 /// isSEXTLoad - Returns true if the specified node is a SEXTLOAD. 02050 /// 02051 inline bool isSEXTLoad(const SDNode *N) { 02052 return isa<LoadSDNode>(N) && 02053 cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD; 02054 } 02055 02056 /// isZEXTLoad - Returns true if the specified node is a ZEXTLOAD. 02057 /// 02058 inline bool isZEXTLoad(const SDNode *N) { 02059 return isa<LoadSDNode>(N) && 02060 cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD; 02061 } 02062 02063 /// isUNINDEXEDLoad - Returns true if the specified node is an unindexed load. 02064 /// 02065 inline bool isUNINDEXEDLoad(const SDNode *N) { 02066 return isa<LoadSDNode>(N) && 02067 cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; 02068 } 02069 02070 /// isNormalStore - Returns true if the specified node is a non-truncating 02071 /// and unindexed store. 02072 inline bool isNormalStore(const SDNode *N) { 02073 const StoreSDNode *St = dyn_cast<StoreSDNode>(N); 02074 return St && !St->isTruncatingStore() && 02075 St->getAddressingMode() == ISD::UNINDEXED; 02076 } 02077 02078 /// isNON_TRUNCStore - Returns true if the specified node is a non-truncating 02079 /// store. 02080 inline bool isNON_TRUNCStore(const SDNode *N) { 02081 return isa<StoreSDNode>(N) && !cast<StoreSDNode>(N)->isTruncatingStore(); 02082 } 02083 02084 /// isTRUNCStore - Returns true if the specified node is a truncating 02085 /// store. 02086 inline bool isTRUNCStore(const SDNode *N) { 02087 return isa<StoreSDNode>(N) && cast<StoreSDNode>(N)->isTruncatingStore(); 02088 } 02089 02090 /// isUNINDEXEDStore - Returns true if the specified node is an 02091 /// unindexed store. 02092 inline bool isUNINDEXEDStore(const SDNode *N) { 02093 return isa<StoreSDNode>(N) && 02094 cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; 02095 } 02096 } 02097 02098 } // end llvm namespace 02099 02100 #endif