SelectionDAGNodes.h revision 1e559443a17d1b335f697551c6263ba60d5dd827
1//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the SDNode class and derived classes, which are used to
11// represent the nodes and operations present in a SelectionDAG.  These nodes
12// and operations are machine code level operations, with some similarities to
13// the GCC RTL representation.
14//
15// Clients should include the SelectionDAG.h file instead of this file directly.
16//
17//===----------------------------------------------------------------------===//
18
19#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H
20#define LLVM_CODEGEN_SELECTIONDAGNODES_H
21
22#include "llvm/Constants.h"
23#include "llvm/ADT/FoldingSet.h"
24#include "llvm/ADT/GraphTraits.h"
25#include "llvm/ADT/ilist_node.h"
26#include "llvm/ADT/SmallVector.h"
27#include "llvm/ADT/STLExtras.h"
28#include "llvm/CodeGen/ValueTypes.h"
29#include "llvm/CodeGen/MachineMemOperand.h"
30#include "llvm/Support/MathExtras.h"
31#include "llvm/System/DataTypes.h"
32#include "llvm/Support/DebugLoc.h"
33#include <cassert>
34
35namespace llvm {
36
37class SelectionDAG;
38class GlobalValue;
39class MachineBasicBlock;
40class MachineConstantPoolValue;
41class SDNode;
42class Value;
43template <typename T> struct DenseMapInfo;
44template <typename T> struct simplify_type;
45template <typename T> struct ilist_traits;
46
47void checkForCycles(const SDNode *N);
48
49/// SDVTList - This represents a list of ValueType's that has been intern'd by
50/// a SelectionDAG.  Instances of this simple value class are returned by
51/// SelectionDAG::getVTList(...).
52///
53struct SDVTList {
54  const EVT *VTs;
55  unsigned int NumVTs;
56};
57
58/// ISD namespace - This namespace contains an enum which represents all of the
59/// SelectionDAG node types and value types.
60///
61namespace ISD {
62
63  //===--------------------------------------------------------------------===//
64  /// ISD::NodeType enum - This enum defines the target-independent operators
65  /// for a SelectionDAG.
66  ///
67  /// Targets may also define target-dependent operator codes for SDNodes. For
68  /// example, on x86, these are the enum values in the X86ISD namespace.
69  /// Targets should aim to use target-independent operators to model their
70  /// instruction sets as much as possible, and only use target-dependent
71  /// operators when they have special requirements.
72  ///
73  /// Finally, during and after selection proper, SNodes may use special
74  /// operator codes that correspond directly with MachineInstr opcodes. These
75  /// are used to represent selected instructions. See the isMachineOpcode()
76  /// and getMachineOpcode() member functions of SDNode.
77  ///
78  enum NodeType {
79    // DELETED_NODE - This is an illegal value that is used to catch
80    // errors.  This opcode is not a legal opcode for any node.
81    DELETED_NODE,
82
83    // EntryToken - This is the marker used to indicate the start of the region.
84    EntryToken,
85
86    // TokenFactor - This node takes multiple tokens as input and produces a
87    // single token result.  This is used to represent the fact that the operand
88    // operators are independent of each other.
89    TokenFactor,
90
91    // AssertSext, AssertZext - These nodes record if a register contains a
92    // value that has already been zero or sign extended from a narrower type.
93    // These nodes take two operands.  The first is the node that has already
94    // been extended, and the second is a value type node indicating the width
95    // of the extension
96    AssertSext, AssertZext,
97
98    // Various leaf nodes.
99    BasicBlock, VALUETYPE, CONDCODE, Register,
100    Constant, ConstantFP,
101    GlobalAddress, GlobalTLSAddress, FrameIndex,
102    JumpTable, ConstantPool, ExternalSymbol, BlockAddress,
103
104    // The address of the GOT
105    GLOBAL_OFFSET_TABLE,
106
107    // FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and
108    // llvm.returnaddress on the DAG.  These nodes take one operand, the index
109    // of the frame or return address to return.  An index of zero corresponds
110    // to the current function's frame or return address, an index of one to the
111    // parent's frame or return address, and so on.
112    FRAMEADDR, RETURNADDR,
113
114    // FRAME_TO_ARGS_OFFSET - This node represents offset from frame pointer to
115    // first (possible) on-stack argument. This is needed for correct stack
116    // adjustment during unwind.
117    FRAME_TO_ARGS_OFFSET,
118
119    // RESULT, OUTCHAIN = EXCEPTIONADDR(INCHAIN) - This node represents the
120    // address of the exception block on entry to an landing pad block.
121    EXCEPTIONADDR,
122
123    // RESULT, OUTCHAIN = LSDAADDR(INCHAIN) - This node represents the
124    // address of the Language Specific Data Area for the enclosing function.
125    LSDAADDR,
126
127    // RESULT, OUTCHAIN = EHSELECTION(INCHAIN, EXCEPTION) - This node represents
128    // the selection index of the exception thrown.
129    EHSELECTION,
130
131    // OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents
132    // 'eh_return' gcc dwarf builtin, which is used to return from
133    // exception. The general meaning is: adjust stack by OFFSET and pass
134    // execution to HANDLER. Many platform-related details also :)
135    EH_RETURN,
136
137    // TargetConstant* - Like Constant*, but the DAG does not do any folding or
138    // simplification of the constant.
139    TargetConstant,
140    TargetConstantFP,
141
142    // TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or
143    // anything else with this node, and this is valid in the target-specific
144    // dag, turning into a GlobalAddress operand.
145    TargetGlobalAddress,
146    TargetGlobalTLSAddress,
147    TargetFrameIndex,
148    TargetJumpTable,
149    TargetConstantPool,
150    TargetExternalSymbol,
151    TargetBlockAddress,
152
153    /// RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...)
154    /// This node represents a target intrinsic function with no side effects.
155    /// The first operand is the ID number of the intrinsic from the
156    /// llvm::Intrinsic namespace.  The operands to the intrinsic follow.  The
157    /// node has returns the result of the intrinsic.
158    INTRINSIC_WO_CHAIN,
159
160    /// RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...)
161    /// This node represents a target intrinsic function with side effects that
162    /// returns a result.  The first operand is a chain pointer.  The second is
163    /// the ID number of the intrinsic from the llvm::Intrinsic namespace.  The
164    /// operands to the intrinsic follow.  The node has two results, the result
165    /// of the intrinsic and an output chain.
166    INTRINSIC_W_CHAIN,
167
168    /// OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...)
169    /// This node represents a target intrinsic function with side effects that
170    /// does not return a result.  The first operand is a chain pointer.  The
171    /// second is the ID number of the intrinsic from the llvm::Intrinsic
172    /// namespace.  The operands to the intrinsic follow.
173    INTRINSIC_VOID,
174
175    // CopyToReg - This node has three operands: a chain, a register number to
176    // set to this value, and a value.
177    CopyToReg,
178
179    // CopyFromReg - This node indicates that the input value is a virtual or
180    // physical register that is defined outside of the scope of this
181    // SelectionDAG.  The register is available from the RegisterSDNode object.
182    CopyFromReg,
183
184    // UNDEF - An undefined node
185    UNDEF,
186
187    // EXTRACT_ELEMENT - This is used to get the lower or upper (determined by
188    // a Constant, which is required to be operand #1) half of the integer or
189    // float value specified as operand #0.  This is only for use before
190    // legalization, for values that will be broken into multiple registers.
191    EXTRACT_ELEMENT,
192
193    // BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.  Given
194    // two values of the same integer value type, this produces a value twice as
195    // big.  Like EXTRACT_ELEMENT, this can only be used before legalization.
196    BUILD_PAIR,
197
198    // MERGE_VALUES - This node takes multiple discrete operands and returns
199    // them all as its individual results.  This nodes has exactly the same
200    // number of inputs and outputs. This node is useful for some pieces of the
201    // code generator that want to think about a single node with multiple
202    // results, not multiple nodes.
203    MERGE_VALUES,
204
205    // Simple integer binary arithmetic operators.
206    ADD, SUB, MUL, SDIV, UDIV, SREM, UREM,
207
208    // SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing
209    // a signed/unsigned value of type i[2*N], and return the full value as
210    // two results, each of type iN.
211    SMUL_LOHI, UMUL_LOHI,
212
213    // SDIVREM/UDIVREM - Divide two integers and produce both a quotient and
214    // remainder result.
215    SDIVREM, UDIVREM,
216
217    // CARRY_FALSE - This node is used when folding other nodes,
218    // like ADDC/SUBC, which indicate the carry result is always false.
219    CARRY_FALSE,
220
221    // Carry-setting nodes for multiple precision addition and subtraction.
222    // These nodes take two operands of the same value type, and produce two
223    // results.  The first result is the normal add or sub result, the second
224    // result is the carry flag result.
225    ADDC, SUBC,
226
227    // Carry-using nodes for multiple precision addition and subtraction.  These
228    // nodes take three operands: The first two are the normal lhs and rhs to
229    // the add or sub, and the third is the input carry flag.  These nodes
230    // produce two results; the normal result of the add or sub, and the output
231    // carry flag.  These nodes both read and write a carry flag to allow them
232    // to them to be chained together for add and sub of arbitrarily large
233    // values.
234    ADDE, SUBE,
235
236    // RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
237    // These nodes take two operands: the normal LHS and RHS to the add. They
238    // produce two results: the normal result of the add, and a boolean that
239    // indicates if an overflow occured (*not* a flag, because it may be stored
240    // to memory, etc.).  If the type of the boolean is not i1 then the high
241    // bits conform to getBooleanContents.
242    // These nodes are generated from the llvm.[su]add.with.overflow intrinsics.
243    SADDO, UADDO,
244
245    // Same for subtraction
246    SSUBO, USUBO,
247
248    // Same for multiplication
249    SMULO, UMULO,
250
251    // Simple binary floating point operators.
252    FADD, FSUB, FMUL, FDIV, FREM,
253
254    // FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.  NOTE: This
255    // DAG node does not require that X and Y have the same type, just that they
256    // are both floating point.  X and the result must have the same type.
257    // FCOPYSIGN(f32, f64) is allowed.
258    FCOPYSIGN,
259
260    // INT = FGETSIGN(FP) - Return the sign bit of the specified floating point
261    // value as an integer 0/1 value.
262    FGETSIGN,
263
264    /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a vector with the
265    /// specified, possibly variable, elements.  The number of elements is
266    /// required to be a power of two.  The types of the operands must all be
267    /// the same and must match the vector element type, except that integer
268    /// types are allowed to be larger than the element type, in which case
269    /// the operands are implicitly truncated.
270    BUILD_VECTOR,
271
272    /// INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element
273    /// at IDX replaced with VAL.  If the type of VAL is larger than the vector
274    /// element type then VAL is truncated before replacement.
275    INSERT_VECTOR_ELT,
276
277    /// EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR
278    /// identified by the (potentially variable) element number IDX.  If the
279    /// return type is an integer type larger than the element type of the
280    /// vector, the result is extended to the width of the return type.
281    EXTRACT_VECTOR_ELT,
282
283    /// CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of
284    /// vector type with the same length and element type, this produces a
285    /// concatenated vector result value, with length equal to the sum of the
286    /// lengths of the input vectors.
287    CONCAT_VECTORS,
288
289    /// EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR (an
290    /// vector value) starting with the (potentially variable) element number
291    /// IDX, which must be a multiple of the result vector length.
292    EXTRACT_SUBVECTOR,
293
294    /// VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as
295    /// VEC1/VEC2.  A VECTOR_SHUFFLE node also contains an array of constant int
296    /// values that indicate which value (or undef) each result element will
297    /// get.  These constant ints are accessible through the
298    /// ShuffleVectorSDNode class.  This is quite similar to the Altivec
299    /// 'vperm' instruction, except that the indices must be constants and are
300    /// in terms of the element size of VEC1/VEC2, not in terms of bytes.
301    VECTOR_SHUFFLE,
302
303    /// SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a
304    /// scalar value into element 0 of the resultant vector type.  The top
305    /// elements 1 to N-1 of the N-element vector are undefined.  The type
306    /// of the operand must match the vector element type, except when they
307    /// are integer types.  In this case the operand is allowed to be wider
308    /// than the vector element type, and is implicitly truncated to it.
309    SCALAR_TO_VECTOR,
310
311    // MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing
312    // an unsigned/signed value of type i[2*N], then return the top part.
313    MULHU, MULHS,
314
315    // Bitwise operators - logical and, logical or, logical xor, shift left,
316    // shift right algebraic (shift in sign bits), shift right logical (shift in
317    // zeroes), rotate left, rotate right, and byteswap.
318    AND, OR, XOR, SHL, SRA, SRL, ROTL, ROTR, BSWAP,
319
320    // Counting operators
321    CTTZ, CTLZ, CTPOP,
322
323    // Select(COND, TRUEVAL, FALSEVAL).  If the type of the boolean COND is not
324    // i1 then the high bits must conform to getBooleanContents.
325    SELECT,
326
327    // Select with condition operator - This selects between a true value and
328    // a false value (ops #2 and #3) based on the boolean result of comparing
329    // the lhs and rhs (ops #0 and #1) of a conditional expression with the
330    // condition code in op #4, a CondCodeSDNode.
331    SELECT_CC,
332
333    // SetCC operator - This evaluates to a true value iff the condition is
334    // true.  If the result value type is not i1 then the high bits conform
335    // to getBooleanContents.  The operands to this are the left and right
336    // operands to compare (ops #0, and #1) and the condition code to compare
337    // them with (op #2) as a CondCodeSDNode.
338    SETCC,
339
340    // RESULT = VSETCC(LHS, RHS, COND) operator - This evaluates to a vector of
341    // integer elements with all bits of the result elements set to true if the
342    // comparison is true or all cleared if the comparison is false.  The
343    // operands to this are the left and right operands to compare (LHS/RHS) and
344    // the condition code to compare them with (COND) as a CondCodeSDNode.
345    VSETCC,
346
347    // SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded
348    // integer shift operations, just like ADD/SUB_PARTS.  The operation
349    // ordering is:
350    //       [Lo,Hi] = op [LoLHS,HiLHS], Amt
351    SHL_PARTS, SRA_PARTS, SRL_PARTS,
352
353    // Conversion operators.  These are all single input single output
354    // operations.  For all of these, the result type must be strictly
355    // wider or narrower (depending on the operation) than the source
356    // type.
357
358    // SIGN_EXTEND - Used for integer types, replicating the sign bit
359    // into new bits.
360    SIGN_EXTEND,
361
362    // ZERO_EXTEND - Used for integer types, zeroing the new bits.
363    ZERO_EXTEND,
364
365    // ANY_EXTEND - Used for integer types.  The high bits are undefined.
366    ANY_EXTEND,
367
368    // TRUNCATE - Completely drop the high bits.
369    TRUNCATE,
370
371    // [SU]INT_TO_FP - These operators convert integers (whose interpreted sign
372    // depends on the first letter) to floating point.
373    SINT_TO_FP,
374    UINT_TO_FP,
375
376    // SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to
377    // sign extend a small value in a large integer register (e.g. sign
378    // extending the low 8 bits of a 32-bit register to fill the top 24 bits
379    // with the 7th bit).  The size of the smaller type is indicated by the 1th
380    // operand, a ValueType node.
381    SIGN_EXTEND_INREG,
382
383    /// FP_TO_[US]INT - Convert a floating point value to a signed or unsigned
384    /// integer.
385    FP_TO_SINT,
386    FP_TO_UINT,
387
388    /// X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type
389    /// down to the precision of the destination VT.  TRUNC is a flag, which is
390    /// always an integer that is zero or one.  If TRUNC is 0, this is a
391    /// normal rounding, if it is 1, this FP_ROUND is known to not change the
392    /// value of Y.
393    ///
394    /// The TRUNC = 1 case is used in cases where we know that the value will
395    /// not be modified by the node, because Y is not using any of the extra
396    /// precision of source type.  This allows certain transformations like
397    /// FP_EXTEND(FP_ROUND(X,1)) -> X which are not safe for
398    /// FP_EXTEND(FP_ROUND(X,0)) because the extra bits aren't removed.
399    FP_ROUND,
400
401    // FLT_ROUNDS_ - Returns current rounding mode:
402    // -1 Undefined
403    //  0 Round to 0
404    //  1 Round to nearest
405    //  2 Round to +inf
406    //  3 Round to -inf
407    FLT_ROUNDS_,
408
409    /// X = FP_ROUND_INREG(Y, VT) - This operator takes an FP register, and
410    /// rounds it to a floating point value.  It then promotes it and returns it
411    /// in a register of the same size.  This operation effectively just
412    /// discards excess precision.  The type to round down to is specified by
413    /// the VT operand, a VTSDNode.
414    FP_ROUND_INREG,
415
416    /// X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
417    FP_EXTEND,
418
419    // BIT_CONVERT - This operator converts between integer, vector and FP
420    // values, as if the value was stored to memory with one type and loaded
421    // from the same address with the other type (or equivalently for vector
422    // format conversions, etc).  The source and result are required to have
423    // the same bit size (e.g.  f32 <-> i32).  This can also be used for
424    // int-to-int or fp-to-fp conversions, but that is a noop, deleted by
425    // getNode().
426    BIT_CONVERT,
427
428    // CONVERT_RNDSAT - This operator is used to support various conversions
429    // between various types (float, signed, unsigned and vectors of those
430    // types) with rounding and saturation. NOTE: Avoid using this operator as
431    // most target don't support it and the operator might be removed in the
432    // future. It takes the following arguments:
433    //   0) value
434    //   1) dest type (type to convert to)
435    //   2) src type (type to convert from)
436    //   3) rounding imm
437    //   4) saturation imm
438    //   5) ISD::CvtCode indicating the type of conversion to do
439    CONVERT_RNDSAT,
440
441    // FNEG, FABS, FSQRT, FSIN, FCOS, FPOWI, FPOW,
442    // FLOG, FLOG2, FLOG10, FEXP, FEXP2,
443    // FCEIL, FTRUNC, FRINT, FNEARBYINT, FFLOOR - Perform various unary floating
444    // point operations. These are inspired by libm.
445    FNEG, FABS, FSQRT, FSIN, FCOS, FPOWI, FPOW,
446    FLOG, FLOG2, FLOG10, FEXP, FEXP2,
447    FCEIL, FTRUNC, FRINT, FNEARBYINT, FFLOOR,
448
449    // LOAD and STORE have token chains as their first operand, then the same
450    // operands as an LLVM load/store instruction, then an offset node that
451    // is added / subtracted from the base pointer to form the address (for
452    // indexed memory ops).
453    LOAD, STORE,
454
455    // DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned
456    // to a specified boundary.  This node always has two return values: a new
457    // stack pointer value and a chain. The first operand is the token chain,
458    // the second is the number of bytes to allocate, and the third is the
459    // alignment boundary.  The size is guaranteed to be a multiple of the stack
460    // alignment, and the alignment is guaranteed to be bigger than the stack
461    // alignment (if required) or 0 to get standard stack alignment.
462    DYNAMIC_STACKALLOC,
463
464    // Control flow instructions.  These all have token chains.
465
466    // BR - Unconditional branch.  The first operand is the chain
467    // operand, the second is the MBB to branch to.
468    BR,
469
470    // BRIND - Indirect branch.  The first operand is the chain, the second
471    // is the value to branch to, which must be of the same type as the target's
472    // pointer type.
473    BRIND,
474
475    // BR_JT - Jumptable branch. The first operand is the chain, the second
476    // is the jumptable index, the last one is the jumptable entry index.
477    BR_JT,
478
479    // BRCOND - Conditional branch.  The first operand is the chain, the
480    // second is the condition, the third is the block to branch to if the
481    // condition is true.  If the type of the condition is not i1, then the
482    // high bits must conform to getBooleanContents.
483    BRCOND,
484
485    // BR_CC - Conditional branch.  The behavior is like that of SELECT_CC, in
486    // that the condition is represented as condition code, and two nodes to
487    // compare, rather than as a combined SetCC node.  The operands in order are
488    // chain, cc, lhs, rhs, block to branch to if condition is true.
489    BR_CC,
490
491    // INLINEASM - Represents an inline asm block.  This node always has two
492    // return values: a chain and a flag result.  The inputs are as follows:
493    //   Operand #0   : Input chain.
494    //   Operand #1   : a ExternalSymbolSDNode with a pointer to the asm string.
495    //   Operand #2n+2: A RegisterNode.
496    //   Operand #2n+3: A TargetConstant, indicating if the reg is a use/def
497    //   Operand #last: Optional, an incoming flag.
498    INLINEASM,
499
500    // EH_LABEL - Represents a label in mid basic block used to track
501    // locations needed for debug and exception handling tables.  These nodes
502    // take a chain as input and return a chain.
503    EH_LABEL,
504
505    // STACKSAVE - STACKSAVE has one operand, an input chain.  It produces a
506    // value, the same type as the pointer type for the system, and an output
507    // chain.
508    STACKSAVE,
509
510    // STACKRESTORE has two operands, an input chain and a pointer to restore to
511    // it returns an output chain.
512    STACKRESTORE,
513
514    // CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of
515    // a call sequence, and carry arbitrary information that target might want
516    // to know.  The first operand is a chain, the rest are specified by the
517    // target and not touched by the DAG optimizers.
518    // CALLSEQ_START..CALLSEQ_END pairs may not be nested.
519    CALLSEQ_START,  // Beginning of a call sequence
520    CALLSEQ_END,    // End of a call sequence
521
522    // VAARG - VAARG has three operands: an input chain, a pointer, and a
523    // SRCVALUE.  It returns a pair of values: the vaarg value and a new chain.
524    VAARG,
525
526    // VACOPY - VACOPY has five operands: an input chain, a destination pointer,
527    // a source pointer, a SRCVALUE for the destination, and a SRCVALUE for the
528    // source.
529    VACOPY,
530
531    // VAEND, VASTART - VAEND and VASTART have three operands: an input chain, a
532    // pointer, and a SRCVALUE.
533    VAEND, VASTART,
534
535    // SRCVALUE - This is a node type that holds a Value* that is used to
536    // make reference to a value in the LLVM IR.
537    SRCVALUE,
538
539    // PCMARKER - This corresponds to the pcmarker intrinsic.
540    PCMARKER,
541
542    // READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
543    // The only operand is a chain and a value and a chain are produced.  The
544    // value is the contents of the architecture specific cycle counter like
545    // register (or other high accuracy low latency clock source)
546    READCYCLECOUNTER,
547
548    // HANDLENODE node - Used as a handle for various purposes.
549    HANDLENODE,
550
551    // TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
552    // It takes as input a token chain, the pointer to the trampoline,
553    // the pointer to the nested function, the pointer to pass for the
554    // 'nest' parameter, a SRCVALUE for the trampoline and another for
555    // the nested function (allowing targets to access the original
556    // Function*).  It produces the result of the intrinsic and a token
557    // chain as output.
558    TRAMPOLINE,
559
560    // TRAP - Trapping instruction
561    TRAP,
562
563    // PREFETCH - This corresponds to a prefetch intrinsic. It takes chains are
564    // their first operand. The other operands are the address to prefetch,
565    // read / write specifier, and locality specifier.
566    PREFETCH,
567
568    // OUTCHAIN = MEMBARRIER(INCHAIN, load-load, load-store, store-load,
569    //                       store-store, device)
570    // This corresponds to the memory.barrier intrinsic.
571    // it takes an input chain, 4 operands to specify the type of barrier, an
572    // operand specifying if the barrier applies to device and uncached memory
573    // and produces an output chain.
574    MEMBARRIER,
575
576    // Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap)
577    // this corresponds to the atomic.lcs intrinsic.
578    // cmp is compared to *ptr, and if equal, swap is stored in *ptr.
579    // the return is always the original value in *ptr
580    ATOMIC_CMP_SWAP,
581
582    // Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt)
583    // this corresponds to the atomic.swap intrinsic.
584    // amt is stored to *ptr atomically.
585    // the return is always the original value in *ptr
586    ATOMIC_SWAP,
587
588    // Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN, ptr, amt)
589    // this corresponds to the atomic.load.[OpName] intrinsic.
590    // op(*ptr, amt) is stored to *ptr atomically.
591    // the return is always the original value in *ptr
592    ATOMIC_LOAD_ADD,
593    ATOMIC_LOAD_SUB,
594    ATOMIC_LOAD_AND,
595    ATOMIC_LOAD_OR,
596    ATOMIC_LOAD_XOR,
597    ATOMIC_LOAD_NAND,
598    ATOMIC_LOAD_MIN,
599    ATOMIC_LOAD_MAX,
600    ATOMIC_LOAD_UMIN,
601    ATOMIC_LOAD_UMAX,
602
603    /// BUILTIN_OP_END - This must be the last enum value in this list.
604    /// The target-specific pre-isel opcode values start here.
605    BUILTIN_OP_END
606  };
607
608  /// FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations
609  /// which do not reference a specific memory location should be less than
610  /// this value. Those that do must not be less than this value, and can
611  /// be used with SelectionDAG::getMemIntrinsicNode.
612  static const int FIRST_TARGET_MEMORY_OPCODE = BUILTIN_OP_END+80;
613
614  /// Node predicates
615
616  /// isBuildVectorAllOnes - Return true if the specified node is a
617  /// BUILD_VECTOR where all of the elements are ~0 or undef.
618  bool isBuildVectorAllOnes(const SDNode *N);
619
620  /// isBuildVectorAllZeros - Return true if the specified node is a
621  /// BUILD_VECTOR where all of the elements are 0 or undef.
622  bool isBuildVectorAllZeros(const SDNode *N);
623
624  /// isScalarToVector - Return true if the specified node is a
625  /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
626  /// element is not an undef.
627  bool isScalarToVector(const SDNode *N);
628
629  //===--------------------------------------------------------------------===//
630  /// MemIndexedMode enum - This enum defines the load / store indexed
631  /// addressing modes.
632  ///
633  /// UNINDEXED    "Normal" load / store. The effective address is already
634  ///              computed and is available in the base pointer. The offset
635  ///              operand is always undefined. In addition to producing a
636  ///              chain, an unindexed load produces one value (result of the
637  ///              load); an unindexed store does not produce a value.
638  ///
639  /// PRE_INC      Similar to the unindexed mode where the effective address is
640  /// PRE_DEC      the value of the base pointer add / subtract the offset.
641  ///              It considers the computation as being folded into the load /
642  ///              store operation (i.e. the load / store does the address
643  ///              computation as well as performing the memory transaction).
644  ///              The base operand is always undefined. In addition to
645  ///              producing a chain, pre-indexed load produces two values
646  ///              (result of the load and the result of the address
647  ///              computation); a pre-indexed store produces one value (result
648  ///              of the address computation).
649  ///
650  /// POST_INC     The effective address is the value of the base pointer. The
651  /// POST_DEC     value of the offset operand is then added to / subtracted
652  ///              from the base after memory transaction. In addition to
653  ///              producing a chain, post-indexed load produces two values
654  ///              (the result of the load and the result of the base +/- offset
655  ///              computation); a post-indexed store produces one value (the
656  ///              the result of the base +/- offset computation).
657  ///
658  enum MemIndexedMode {
659    UNINDEXED = 0,
660    PRE_INC,
661    PRE_DEC,
662    POST_INC,
663    POST_DEC,
664    LAST_INDEXED_MODE
665  };
666
667  //===--------------------------------------------------------------------===//
668  /// LoadExtType enum - This enum defines the three variants of LOADEXT
669  /// (load with extension).
670  ///
671  /// SEXTLOAD loads the integer operand and sign extends it to a larger
672  ///          integer result type.
673  /// ZEXTLOAD loads the integer operand and zero extends it to a larger
674  ///          integer result type.
675  /// EXTLOAD  is used for three things: floating point extending loads,
676  ///          integer extending loads [the top bits are undefined], and vector
677  ///          extending loads [load into low elt].
678  ///
679  enum LoadExtType {
680    NON_EXTLOAD = 0,
681    EXTLOAD,
682    SEXTLOAD,
683    ZEXTLOAD,
684    LAST_LOADEXT_TYPE
685  };
686
687  //===--------------------------------------------------------------------===//
688  /// ISD::CondCode enum - These are ordered carefully to make the bitfields
689  /// below work out, when considering SETFALSE (something that never exists
690  /// dynamically) as 0.  "U" -> Unsigned (for integer operands) or Unordered
691  /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal
692  /// to.  If the "N" column is 1, the result of the comparison is undefined if
693  /// the input is a NAN.
694  ///
695  /// All of these (except for the 'always folded ops') should be handled for
696  /// floating point.  For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT,
697  /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used.
698  ///
699  /// Note that these are laid out in a specific order to allow bit-twiddling
700  /// to transform conditions.
701  enum CondCode {
702    // Opcode          N U L G E       Intuitive operation
703    SETFALSE,      //    0 0 0 0       Always false (always folded)
704    SETOEQ,        //    0 0 0 1       True if ordered and equal
705    SETOGT,        //    0 0 1 0       True if ordered and greater than
706    SETOGE,        //    0 0 1 1       True if ordered and greater than or equal
707    SETOLT,        //    0 1 0 0       True if ordered and less than
708    SETOLE,        //    0 1 0 1       True if ordered and less than or equal
709    SETONE,        //    0 1 1 0       True if ordered and operands are unequal
710    SETO,          //    0 1 1 1       True if ordered (no nans)
711    SETUO,         //    1 0 0 0       True if unordered: isnan(X) | isnan(Y)
712    SETUEQ,        //    1 0 0 1       True if unordered or equal
713    SETUGT,        //    1 0 1 0       True if unordered or greater than
714    SETUGE,        //    1 0 1 1       True if unordered, greater than, or equal
715    SETULT,        //    1 1 0 0       True if unordered or less than
716    SETULE,        //    1 1 0 1       True if unordered, less than, or equal
717    SETUNE,        //    1 1 1 0       True if unordered or not equal
718    SETTRUE,       //    1 1 1 1       Always true (always folded)
719    // Don't care operations: undefined if the input is a nan.
720    SETFALSE2,     //  1 X 0 0 0       Always false (always folded)
721    SETEQ,         //  1 X 0 0 1       True if equal
722    SETGT,         //  1 X 0 1 0       True if greater than
723    SETGE,         //  1 X 0 1 1       True if greater than or equal
724    SETLT,         //  1 X 1 0 0       True if less than
725    SETLE,         //  1 X 1 0 1       True if less than or equal
726    SETNE,         //  1 X 1 1 0       True if not equal
727    SETTRUE2,      //  1 X 1 1 1       Always true (always folded)
728
729    SETCC_INVALID       // Marker value.
730  };
731
732  /// isSignedIntSetCC - Return true if this is a setcc instruction that
733  /// performs a signed comparison when used with integer operands.
734  inline bool isSignedIntSetCC(CondCode Code) {
735    return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE;
736  }
737
738  /// isUnsignedIntSetCC - Return true if this is a setcc instruction that
739  /// performs an unsigned comparison when used with integer operands.
740  inline bool isUnsignedIntSetCC(CondCode Code) {
741    return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE;
742  }
743
744  /// isTrueWhenEqual - Return true if the specified condition returns true if
745  /// the two operands to the condition are equal.  Note that if one of the two
746  /// operands is a NaN, this value is meaningless.
747  inline bool isTrueWhenEqual(CondCode Cond) {
748    return ((int)Cond & 1) != 0;
749  }
750
751  /// getUnorderedFlavor - This function returns 0 if the condition is always
752  /// false if an operand is a NaN, 1 if the condition is always true if the
753  /// operand is a NaN, and 2 if the condition is undefined if the operand is a
754  /// NaN.
755  inline unsigned getUnorderedFlavor(CondCode Cond) {
756    return ((int)Cond >> 3) & 3;
757  }
758
759  /// getSetCCInverse - Return the operation corresponding to !(X op Y), where
760  /// 'op' is a valid SetCC operation.
761  CondCode getSetCCInverse(CondCode Operation, bool isInteger);
762
763  /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)
764  /// when given the operation for (X op Y).
765  CondCode getSetCCSwappedOperands(CondCode Operation);
766
767  /// getSetCCOrOperation - Return the result of a logical OR between different
768  /// comparisons of identical values: ((X op1 Y) | (X op2 Y)).  This
769  /// function returns SETCC_INVALID if it is not possible to represent the
770  /// resultant comparison.
771  CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, bool isInteger);
772
773  /// getSetCCAndOperation - Return the result of a logical AND between
774  /// different comparisons of identical values: ((X op1 Y) & (X op2 Y)).  This
775  /// function returns SETCC_INVALID if it is not possible to represent the
776  /// resultant comparison.
777  CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger);
778
779  //===--------------------------------------------------------------------===//
780  /// CvtCode enum - This enum defines the various converts CONVERT_RNDSAT
781  /// supports.
782  enum CvtCode {
783    CVT_FF,     // Float from Float
784    CVT_FS,     // Float from Signed
785    CVT_FU,     // Float from Unsigned
786    CVT_SF,     // Signed from Float
787    CVT_UF,     // Unsigned from Float
788    CVT_SS,     // Signed from Signed
789    CVT_SU,     // Signed from Unsigned
790    CVT_US,     // Unsigned from Signed
791    CVT_UU,     // Unsigned from Unsigned
792    CVT_INVALID // Marker - Invalid opcode
793  };
794}  // end llvm::ISD namespace
795
796
797//===----------------------------------------------------------------------===//
798/// SDValue - Unlike LLVM values, Selection DAG nodes may return multiple
799/// values as the result of a computation.  Many nodes return multiple values,
800/// from loads (which define a token and a return value) to ADDC (which returns
801/// a result and a carry value), to calls (which may return an arbitrary number
802/// of values).
803///
804/// As such, each use of a SelectionDAG computation must indicate the node that
805/// computes it as well as which return value to use from that node.  This pair
806/// of information is represented with the SDValue value type.
807///
808class SDValue {
809  SDNode *Node;       // The node defining the value we are using.
810  unsigned ResNo;     // Which return value of the node we are using.
811public:
812  SDValue() : Node(0), ResNo(0) {}
813  SDValue(SDNode *node, unsigned resno) : Node(node), ResNo(resno) {}
814
815  /// get the index which selects a specific result in the SDNode
816  unsigned getResNo() const { return ResNo; }
817
818  /// get the SDNode which holds the desired result
819  SDNode *getNode() const { return Node; }
820
821  /// set the SDNode
822  void setNode(SDNode *N) { Node = N; }
823
824  inline SDNode *operator->() const { return Node; }
825
826  bool operator==(const SDValue &O) const {
827    return Node == O.Node && ResNo == O.ResNo;
828  }
829  bool operator!=(const SDValue &O) const {
830    return !operator==(O);
831  }
832  bool operator<(const SDValue &O) const {
833    return Node < O.Node || (Node == O.Node && ResNo < O.ResNo);
834  }
835
836  SDValue getValue(unsigned R) const {
837    return SDValue(Node, R);
838  }
839
840  // isOperandOf - Return true if this node is an operand of N.
841  bool isOperandOf(SDNode *N) const;
842
843  /// getValueType - Return the ValueType of the referenced return value.
844  ///
845  inline EVT getValueType() const;
846
847  /// getValueSizeInBits - Returns the size of the value in bits.
848  ///
849  unsigned getValueSizeInBits() const {
850    return getValueType().getSizeInBits();
851  }
852
853  // Forwarding methods - These forward to the corresponding methods in SDNode.
854  inline unsigned getOpcode() const;
855  inline unsigned getNumOperands() const;
856  inline const SDValue &getOperand(unsigned i) const;
857  inline uint64_t getConstantOperandVal(unsigned i) const;
858  inline bool isTargetMemoryOpcode() const;
859  inline bool isTargetOpcode() const;
860  inline bool isMachineOpcode() const;
861  inline unsigned getMachineOpcode() const;
862  inline const DebugLoc getDebugLoc() const;
863
864
865  /// reachesChainWithoutSideEffects - Return true if this operand (which must
866  /// be a chain) reaches the specified operand without crossing any
867  /// side-effecting instructions.  In practice, this looks through token
868  /// factors and non-volatile loads.  In order to remain efficient, this only
869  /// looks a couple of nodes in, it does not do an exhaustive search.
870  bool reachesChainWithoutSideEffects(SDValue Dest,
871                                      unsigned Depth = 2) const;
872
873  /// use_empty - Return true if there are no nodes using value ResNo
874  /// of Node.
875  ///
876  inline bool use_empty() const;
877
878  /// hasOneUse - Return true if there is exactly one node using value
879  /// ResNo of Node.
880  ///
881  inline bool hasOneUse() const;
882};
883
884
885template<> struct DenseMapInfo<SDValue> {
886  static inline SDValue getEmptyKey() {
887    return SDValue((SDNode*)-1, -1U);
888  }
889  static inline SDValue getTombstoneKey() {
890    return SDValue((SDNode*)-1, 0);
891  }
892  static unsigned getHashValue(const SDValue &Val) {
893    return ((unsigned)((uintptr_t)Val.getNode() >> 4) ^
894            (unsigned)((uintptr_t)Val.getNode() >> 9)) + Val.getResNo();
895  }
896  static bool isEqual(const SDValue &LHS, const SDValue &RHS) {
897    return LHS == RHS;
898  }
899};
900template <> struct isPodLike<SDValue> { static const bool value = true; };
901
902
903/// simplify_type specializations - Allow casting operators to work directly on
904/// SDValues as if they were SDNode*'s.
905template<> struct simplify_type<SDValue> {
906  typedef SDNode* SimpleType;
907  static SimpleType getSimplifiedValue(const SDValue &Val) {
908    return static_cast<SimpleType>(Val.getNode());
909  }
910};
911template<> struct simplify_type<const SDValue> {
912  typedef SDNode* SimpleType;
913  static SimpleType getSimplifiedValue(const SDValue &Val) {
914    return static_cast<SimpleType>(Val.getNode());
915  }
916};
917
918/// SDUse - Represents a use of a SDNode. This class holds an SDValue,
919/// which records the SDNode being used and the result number, a
920/// pointer to the SDNode using the value, and Next and Prev pointers,
921/// which link together all the uses of an SDNode.
922///
923class SDUse {
924  /// Val - The value being used.
925  SDValue Val;
926  /// User - The user of this value.
927  SDNode *User;
928  /// Prev, Next - Pointers to the uses list of the SDNode referred by
929  /// this operand.
930  SDUse **Prev, *Next;
931
932  SDUse(const SDUse &U);          // Do not implement
933  void operator=(const SDUse &U); // Do not implement
934
935public:
936  SDUse() : Val(), User(NULL), Prev(NULL), Next(NULL) {}
937
938  /// Normally SDUse will just implicitly convert to an SDValue that it holds.
939  operator const SDValue&() const { return Val; }
940
941  /// If implicit conversion to SDValue doesn't work, the get() method returns
942  /// the SDValue.
943  const SDValue &get() const { return Val; }
944
945  /// getUser - This returns the SDNode that contains this Use.
946  SDNode *getUser() { return User; }
947
948  /// getNext - Get the next SDUse in the use list.
949  SDUse *getNext() const { return Next; }
950
951  /// getNode - Convenience function for get().getNode().
952  SDNode *getNode() const { return Val.getNode(); }
953  /// getResNo - Convenience function for get().getResNo().
954  unsigned getResNo() const { return Val.getResNo(); }
955  /// getValueType - Convenience function for get().getValueType().
956  EVT getValueType() const { return Val.getValueType(); }
957
958  /// operator== - Convenience function for get().operator==
959  bool operator==(const SDValue &V) const {
960    return Val == V;
961  }
962
963  /// operator!= - Convenience function for get().operator!=
964  bool operator!=(const SDValue &V) const {
965    return Val != V;
966  }
967
968  /// operator< - Convenience function for get().operator<
969  bool operator<(const SDValue &V) const {
970    return Val < V;
971  }
972
973private:
974  friend class SelectionDAG;
975  friend class SDNode;
976
977  void setUser(SDNode *p) { User = p; }
978
979  /// set - Remove this use from its existing use list, assign it the
980  /// given value, and add it to the new value's node's use list.
981  inline void set(const SDValue &V);
982  /// setInitial - like set, but only supports initializing a newly-allocated
983  /// SDUse with a non-null value.
984  inline void setInitial(const SDValue &V);
985  /// setNode - like set, but only sets the Node portion of the value,
986  /// leaving the ResNo portion unmodified.
987  inline void setNode(SDNode *N);
988
989  void addToList(SDUse **List) {
990    Next = *List;
991    if (Next) Next->Prev = &Next;
992    Prev = List;
993    *List = this;
994  }
995
996  void removeFromList() {
997    *Prev = Next;
998    if (Next) Next->Prev = Prev;
999  }
1000};
1001
1002/// simplify_type specializations - Allow casting operators to work directly on
1003/// SDValues as if they were SDNode*'s.
1004template<> struct simplify_type<SDUse> {
1005  typedef SDNode* SimpleType;
1006  static SimpleType getSimplifiedValue(const SDUse &Val) {
1007    return static_cast<SimpleType>(Val.getNode());
1008  }
1009};
1010template<> struct simplify_type<const SDUse> {
1011  typedef SDNode* SimpleType;
1012  static SimpleType getSimplifiedValue(const SDUse &Val) {
1013    return static_cast<SimpleType>(Val.getNode());
1014  }
1015};
1016
1017
1018/// SDNode - Represents one node in the SelectionDAG.
1019///
1020class SDNode : public FoldingSetNode, public ilist_node<SDNode> {
1021private:
1022  /// NodeType - The operation that this node performs.
1023  ///
1024  int16_t NodeType;
1025
1026  /// OperandsNeedDelete - This is true if OperandList was new[]'d.  If true,
1027  /// then they will be delete[]'d when the node is destroyed.
1028  uint16_t OperandsNeedDelete : 1;
1029
1030protected:
1031  /// SubclassData - This member is defined by this class, but is not used for
1032  /// anything.  Subclasses can use it to hold whatever state they find useful.
1033  /// This field is initialized to zero by the ctor.
1034  uint16_t SubclassData : 15;
1035
1036private:
1037  /// NodeId - Unique id per SDNode in the DAG.
1038  int NodeId;
1039
1040  /// OperandList - The values that are used by this operation.
1041  ///
1042  SDUse *OperandList;
1043
1044  /// ValueList - The types of the values this node defines.  SDNode's may
1045  /// define multiple values simultaneously.
1046  const EVT *ValueList;
1047
1048  /// UseList - List of uses for this SDNode.
1049  SDUse *UseList;
1050
1051  /// NumOperands/NumValues - The number of entries in the Operand/Value list.
1052  unsigned short NumOperands, NumValues;
1053
1054  /// debugLoc - source line information.
1055  DebugLoc debugLoc;
1056
1057  /// getValueTypeList - Return a pointer to the specified value type.
1058  static const EVT *getValueTypeList(EVT VT);
1059
1060  friend class SelectionDAG;
1061  friend struct ilist_traits<SDNode>;
1062
1063public:
1064  //===--------------------------------------------------------------------===//
1065  //  Accessors
1066  //
1067
1068  /// getOpcode - Return the SelectionDAG opcode value for this node. For
1069  /// pre-isel nodes (those for which isMachineOpcode returns false), these
1070  /// are the opcode values in the ISD and <target>ISD namespaces. For
1071  /// post-isel opcodes, see getMachineOpcode.
1072  unsigned getOpcode()  const { return (unsigned short)NodeType; }
1073
1074  /// isTargetOpcode - Test if this node has a target-specific opcode (in the
1075  /// \<target\>ISD namespace).
1076  bool isTargetOpcode() const { return NodeType >= ISD::BUILTIN_OP_END; }
1077
1078  /// isTargetMemoryOpcode - Test if this node has a target-specific
1079  /// memory-referencing opcode (in the \<target\>ISD namespace and
1080  /// greater than FIRST_TARGET_MEMORY_OPCODE).
1081  bool isTargetMemoryOpcode() const {
1082    return NodeType >= ISD::FIRST_TARGET_MEMORY_OPCODE;
1083  }
1084
1085  /// isMachineOpcode - Test if this node has a post-isel opcode, directly
1086  /// corresponding to a MachineInstr opcode.
1087  bool isMachineOpcode() const { return NodeType < 0; }
1088
1089  /// getMachineOpcode - This may only be called if isMachineOpcode returns
1090  /// true. It returns the MachineInstr opcode value that the node's opcode
1091  /// corresponds to.
1092  unsigned getMachineOpcode() const {
1093    assert(isMachineOpcode() && "Not a MachineInstr opcode!");
1094    return ~NodeType;
1095  }
1096
1097  /// use_empty - Return true if there are no uses of this node.
1098  ///
1099  bool use_empty() const { return UseList == NULL; }
1100
1101  /// hasOneUse - Return true if there is exactly one use of this node.
1102  ///
1103  bool hasOneUse() const {
1104    return !use_empty() && llvm::next(use_begin()) == use_end();
1105  }
1106
1107  /// use_size - Return the number of uses of this node. This method takes
1108  /// time proportional to the number of uses.
1109  ///
1110  size_t use_size() const { return std::distance(use_begin(), use_end()); }
1111
1112  /// getNodeId - Return the unique node id.
1113  ///
1114  int getNodeId() const { return NodeId; }
1115
1116  /// setNodeId - Set unique node id.
1117  void setNodeId(int Id) { NodeId = Id; }
1118
1119  /// getDebugLoc - Return the source location info.
1120  const DebugLoc getDebugLoc() const { return debugLoc; }
1121
1122  /// setDebugLoc - Set source location info.  Try to avoid this, putting
1123  /// it in the constructor is preferable.
1124  void setDebugLoc(const DebugLoc dl) { debugLoc = dl; }
1125
1126  /// use_iterator - This class provides iterator support for SDUse
1127  /// operands that use a specific SDNode.
1128  class use_iterator
1129    : public std::iterator<std::forward_iterator_tag, SDUse, ptrdiff_t> {
1130    SDUse *Op;
1131    explicit use_iterator(SDUse *op) : Op(op) {
1132    }
1133    friend class SDNode;
1134  public:
1135    typedef std::iterator<std::forward_iterator_tag,
1136                          SDUse, ptrdiff_t>::reference reference;
1137    typedef std::iterator<std::forward_iterator_tag,
1138                          SDUse, ptrdiff_t>::pointer pointer;
1139
1140    use_iterator(const use_iterator &I) : Op(I.Op) {}
1141    use_iterator() : Op(0) {}
1142
1143    bool operator==(const use_iterator &x) const {
1144      return Op == x.Op;
1145    }
1146    bool operator!=(const use_iterator &x) const {
1147      return !operator==(x);
1148    }
1149
1150    /// atEnd - return true if this iterator is at the end of uses list.
1151    bool atEnd() const { return Op == 0; }
1152
1153    // Iterator traversal: forward iteration only.
1154    use_iterator &operator++() {          // Preincrement
1155      assert(Op && "Cannot increment end iterator!");
1156      Op = Op->getNext();
1157      return *this;
1158    }
1159
1160    use_iterator operator++(int) {        // Postincrement
1161      use_iterator tmp = *this; ++*this; return tmp;
1162    }
1163
1164    /// Retrieve a pointer to the current user node.
1165    SDNode *operator*() const {
1166      assert(Op && "Cannot dereference end iterator!");
1167      return Op->getUser();
1168    }
1169
1170    SDNode *operator->() const { return operator*(); }
1171
1172    SDUse &getUse() const { return *Op; }
1173
1174    /// getOperandNo - Retrieve the operand # of this use in its user.
1175    ///
1176    unsigned getOperandNo() const {
1177      assert(Op && "Cannot dereference end iterator!");
1178      return (unsigned)(Op - Op->getUser()->OperandList);
1179    }
1180  };
1181
1182  /// use_begin/use_end - Provide iteration support to walk over all uses
1183  /// of an SDNode.
1184
1185  use_iterator use_begin() const {
1186    return use_iterator(UseList);
1187  }
1188
1189  static use_iterator use_end() { return use_iterator(0); }
1190
1191
1192  /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
1193  /// indicated value.  This method ignores uses of other values defined by this
1194  /// operation.
1195  bool hasNUsesOfValue(unsigned NUses, unsigned Value) const;
1196
1197  /// hasAnyUseOfValue - Return true if there are any use of the indicated
1198  /// value. This method ignores uses of other values defined by this operation.
1199  bool hasAnyUseOfValue(unsigned Value) const;
1200
1201  /// isOnlyUserOf - Return true if this node is the only use of N.
1202  ///
1203  bool isOnlyUserOf(SDNode *N) const;
1204
1205  /// isOperandOf - Return true if this node is an operand of N.
1206  ///
1207  bool isOperandOf(SDNode *N) const;
1208
1209  /// isPredecessorOf - Return true if this node is a predecessor of N. This
1210  /// node is either an operand of N or it can be reached by recursively
1211  /// traversing up the operands.
1212  /// NOTE: this is an expensive method. Use it carefully.
1213  bool isPredecessorOf(SDNode *N) const;
1214
1215  /// getNumOperands - Return the number of values used by this operation.
1216  ///
1217  unsigned getNumOperands() const { return NumOperands; }
1218
1219  /// getConstantOperandVal - Helper method returns the integer value of a
1220  /// ConstantSDNode operand.
1221  uint64_t getConstantOperandVal(unsigned Num) const;
1222
1223  const SDValue &getOperand(unsigned Num) const {
1224    assert(Num < NumOperands && "Invalid child # of SDNode!");
1225    return OperandList[Num];
1226  }
1227
1228  typedef SDUse* op_iterator;
1229  op_iterator op_begin() const { return OperandList; }
1230  op_iterator op_end() const { return OperandList+NumOperands; }
1231
1232  SDVTList getVTList() const {
1233    SDVTList X = { ValueList, NumValues };
1234    return X;
1235  }
1236
1237  /// getFlaggedNode - If this node has a flag operand, return the node
1238  /// to which the flag operand points. Otherwise return NULL.
1239  SDNode *getFlaggedNode() const {
1240    if (getNumOperands() != 0 &&
1241      getOperand(getNumOperands()-1).getValueType().getSimpleVT() == MVT::Flag)
1242      return getOperand(getNumOperands()-1).getNode();
1243    return 0;
1244  }
1245
1246  // If this is a pseudo op, like copyfromreg, look to see if there is a
1247  // real target node flagged to it.  If so, return the target node.
1248  const SDNode *getFlaggedMachineNode() const {
1249    const SDNode *FoundNode = this;
1250
1251    // Climb up flag edges until a machine-opcode node is found, or the
1252    // end of the chain is reached.
1253    while (!FoundNode->isMachineOpcode()) {
1254      const SDNode *N = FoundNode->getFlaggedNode();
1255      if (!N) break;
1256      FoundNode = N;
1257    }
1258
1259    return FoundNode;
1260  }
1261
1262  /// getNumValues - Return the number of values defined/returned by this
1263  /// operator.
1264  ///
1265  unsigned getNumValues() const { return NumValues; }
1266
1267  /// getValueType - Return the type of a specified result.
1268  ///
1269  EVT getValueType(unsigned ResNo) const {
1270    assert(ResNo < NumValues && "Illegal result number!");
1271    return ValueList[ResNo];
1272  }
1273
1274  /// getValueSizeInBits - Returns MVT::getSizeInBits(getValueType(ResNo)).
1275  ///
1276  unsigned getValueSizeInBits(unsigned ResNo) const {
1277    return getValueType(ResNo).getSizeInBits();
1278  }
1279
1280  typedef const EVT* value_iterator;
1281  value_iterator value_begin() const { return ValueList; }
1282  value_iterator value_end() const { return ValueList+NumValues; }
1283
1284  /// getOperationName - Return the opcode of this operation for printing.
1285  ///
1286  std::string getOperationName(const SelectionDAG *G = 0) const;
1287  static const char* getIndexedModeName(ISD::MemIndexedMode AM);
1288  void print_types(raw_ostream &OS, const SelectionDAG *G) const;
1289  void print_details(raw_ostream &OS, const SelectionDAG *G) const;
1290  void print(raw_ostream &OS, const SelectionDAG *G = 0) const;
1291  void printr(raw_ostream &OS, const SelectionDAG *G = 0) const;
1292
1293  /// printrFull - Print a SelectionDAG node and all children down to
1294  /// the leaves.  The given SelectionDAG allows target-specific nodes
1295  /// to be printed in human-readable form.  Unlike printr, this will
1296  /// print the whole DAG, including children that appear multiple
1297  /// times.
1298  ///
1299  void printrFull(raw_ostream &O, const SelectionDAG *G = 0) const;
1300
1301  /// printrWithDepth - Print a SelectionDAG node and children up to
1302  /// depth "depth."  The given SelectionDAG allows target-specific
1303  /// nodes to be printed in human-readable form.  Unlike printr, this
1304  /// will print children that appear multiple times wherever they are
1305  /// used.
1306  ///
1307  void printrWithDepth(raw_ostream &O, const SelectionDAG *G = 0,
1308                       unsigned depth = 100) const;
1309
1310
1311  /// dump - Dump this node, for debugging.
1312  void dump() const;
1313
1314  /// dumpr - Dump (recursively) this node and its use-def subgraph.
1315  void dumpr() const;
1316
1317  /// dump - Dump this node, for debugging.
1318  /// The given SelectionDAG allows target-specific nodes to be printed
1319  /// in human-readable form.
1320  void dump(const SelectionDAG *G) const;
1321
1322  /// dumpr - Dump (recursively) this node and its use-def subgraph.
1323  /// The given SelectionDAG allows target-specific nodes to be printed
1324  /// in human-readable form.
1325  void dumpr(const SelectionDAG *G) const;
1326
1327  /// dumprFull - printrFull to dbgs().  The given SelectionDAG allows
1328  /// target-specific nodes to be printed in human-readable form.
1329  /// Unlike dumpr, this will print the whole DAG, including children
1330  /// that appear multiple times.
1331  ///
1332  void dumprFull(const SelectionDAG *G = 0) const;
1333
1334  /// dumprWithDepth - printrWithDepth to dbgs().  The given
1335  /// SelectionDAG allows target-specific nodes to be printed in
1336  /// human-readable form.  Unlike dumpr, this will print children
1337  /// that appear multiple times wherever they are used.
1338  ///
1339  void dumprWithDepth(const SelectionDAG *G = 0, unsigned depth = 100) const;
1340
1341
1342  static bool classof(const SDNode *) { return true; }
1343
1344  /// Profile - Gather unique data for the node.
1345  ///
1346  void Profile(FoldingSetNodeID &ID) const;
1347
1348  /// addUse - This method should only be used by the SDUse class.
1349  ///
1350  void addUse(SDUse &U) { U.addToList(&UseList); }
1351
1352protected:
1353  static SDVTList getSDVTList(EVT VT) {
1354    SDVTList Ret = { getValueTypeList(VT), 1 };
1355    return Ret;
1356  }
1357
1358  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs, const SDValue *Ops,
1359         unsigned NumOps)
1360    : NodeType(Opc), OperandsNeedDelete(true), SubclassData(0),
1361      NodeId(-1),
1362      OperandList(NumOps ? new SDUse[NumOps] : 0),
1363      ValueList(VTs.VTs), UseList(NULL),
1364      NumOperands(NumOps), NumValues(VTs.NumVTs),
1365      debugLoc(dl) {
1366    for (unsigned i = 0; i != NumOps; ++i) {
1367      OperandList[i].setUser(this);
1368      OperandList[i].setInitial(Ops[i]);
1369    }
1370    checkForCycles(this);
1371  }
1372
1373  /// This constructor adds no operands itself; operands can be
1374  /// set later with InitOperands.
1375  SDNode(unsigned Opc, const DebugLoc dl, SDVTList VTs)
1376    : NodeType(Opc), OperandsNeedDelete(false), SubclassData(0),
1377      NodeId(-1), OperandList(0), ValueList(VTs.VTs), UseList(NULL),
1378      NumOperands(0), NumValues(VTs.NumVTs),
1379      debugLoc(dl) {}
1380
1381  /// InitOperands - Initialize the operands list of this with 1 operand.
1382  void InitOperands(SDUse *Ops, const SDValue &Op0) {
1383    Ops[0].setUser(this);
1384    Ops[0].setInitial(Op0);
1385    NumOperands = 1;
1386    OperandList = Ops;
1387    checkForCycles(this);
1388  }
1389
1390  /// InitOperands - Initialize the operands list of this with 2 operands.
1391  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1) {
1392    Ops[0].setUser(this);
1393    Ops[0].setInitial(Op0);
1394    Ops[1].setUser(this);
1395    Ops[1].setInitial(Op1);
1396    NumOperands = 2;
1397    OperandList = Ops;
1398    checkForCycles(this);
1399  }
1400
1401  /// InitOperands - Initialize the operands list of this with 3 operands.
1402  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
1403                    const SDValue &Op2) {
1404    Ops[0].setUser(this);
1405    Ops[0].setInitial(Op0);
1406    Ops[1].setUser(this);
1407    Ops[1].setInitial(Op1);
1408    Ops[2].setUser(this);
1409    Ops[2].setInitial(Op2);
1410    NumOperands = 3;
1411    OperandList = Ops;
1412    checkForCycles(this);
1413  }
1414
1415  /// InitOperands - Initialize the operands list of this with 4 operands.
1416  void InitOperands(SDUse *Ops, const SDValue &Op0, const SDValue &Op1,
1417                    const SDValue &Op2, const SDValue &Op3) {
1418    Ops[0].setUser(this);
1419    Ops[0].setInitial(Op0);
1420    Ops[1].setUser(this);
1421    Ops[1].setInitial(Op1);
1422    Ops[2].setUser(this);
1423    Ops[2].setInitial(Op2);
1424    Ops[3].setUser(this);
1425    Ops[3].setInitial(Op3);
1426    NumOperands = 4;
1427    OperandList = Ops;
1428    checkForCycles(this);
1429  }
1430
1431  /// InitOperands - Initialize the operands list of this with N operands.
1432  void InitOperands(SDUse *Ops, const SDValue *Vals, unsigned N) {
1433    for (unsigned i = 0; i != N; ++i) {
1434      Ops[i].setUser(this);
1435      Ops[i].setInitial(Vals[i]);
1436    }
1437    NumOperands = N;
1438    OperandList = Ops;
1439    checkForCycles(this);
1440  }
1441
1442  /// DropOperands - Release the operands and set this node to have
1443  /// zero operands.
1444  void DropOperands();
1445};
1446
1447
1448// Define inline functions from the SDValue class.
1449
1450inline unsigned SDValue::getOpcode() const {
1451  return Node->getOpcode();
1452}
1453inline EVT SDValue::getValueType() const {
1454  return Node->getValueType(ResNo);
1455}
1456inline unsigned SDValue::getNumOperands() const {
1457  return Node->getNumOperands();
1458}
1459inline const SDValue &SDValue::getOperand(unsigned i) const {
1460  return Node->getOperand(i);
1461}
1462inline uint64_t SDValue::getConstantOperandVal(unsigned i) const {
1463  return Node->getConstantOperandVal(i);
1464}
1465inline bool SDValue::isTargetOpcode() const {
1466  return Node->isTargetOpcode();
1467}
1468inline bool SDValue::isTargetMemoryOpcode() const {
1469  return Node->isTargetMemoryOpcode();
1470}
1471inline bool SDValue::isMachineOpcode() const {
1472  return Node->isMachineOpcode();
1473}
1474inline unsigned SDValue::getMachineOpcode() const {
1475  return Node->getMachineOpcode();
1476}
1477inline bool SDValue::use_empty() const {
1478  return !Node->hasAnyUseOfValue(ResNo);
1479}
1480inline bool SDValue::hasOneUse() const {
1481  return Node->hasNUsesOfValue(1, ResNo);
1482}
1483inline const DebugLoc SDValue::getDebugLoc() const {
1484  return Node->getDebugLoc();
1485}
1486
1487// Define inline functions from the SDUse class.
1488
1489inline void SDUse::set(const SDValue &V) {
1490  if (Val.getNode()) removeFromList();
1491  Val = V;
1492  if (V.getNode()) V.getNode()->addUse(*this);
1493}
1494
1495inline void SDUse::setInitial(const SDValue &V) {
1496  Val = V;
1497  V.getNode()->addUse(*this);
1498}
1499
1500inline void SDUse::setNode(SDNode *N) {
1501  if (Val.getNode()) removeFromList();
1502  Val.setNode(N);
1503  if (N) N->addUse(*this);
1504}
1505
1506/// UnarySDNode - This class is used for single-operand SDNodes.  This is solely
1507/// to allow co-allocation of node operands with the node itself.
1508class UnarySDNode : public SDNode {
1509  SDUse Op;
1510public:
1511  UnarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X)
1512    : SDNode(Opc, dl, VTs) {
1513    InitOperands(&Op, X);
1514  }
1515};
1516
1517/// BinarySDNode - This class is used for two-operand SDNodes.  This is solely
1518/// to allow co-allocation of node operands with the node itself.
1519class BinarySDNode : public SDNode {
1520  SDUse Ops[2];
1521public:
1522  BinarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y)
1523    : SDNode(Opc, dl, VTs) {
1524    InitOperands(Ops, X, Y);
1525  }
1526};
1527
1528/// TernarySDNode - This class is used for three-operand SDNodes. This is solely
1529/// to allow co-allocation of node operands with the node itself.
1530class TernarySDNode : public SDNode {
1531  SDUse Ops[3];
1532public:
1533  TernarySDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, SDValue X, SDValue Y,
1534                SDValue Z)
1535    : SDNode(Opc, dl, VTs) {
1536    InitOperands(Ops, X, Y, Z);
1537  }
1538};
1539
1540
1541/// HandleSDNode - This class is used to form a handle around another node that
1542/// is persistant and is updated across invocations of replaceAllUsesWith on its
1543/// operand.  This node should be directly created by end-users and not added to
1544/// the AllNodes list.
1545class HandleSDNode : public SDNode {
1546  SDUse Op;
1547public:
1548  // FIXME: Remove the "noinline" attribute once <rdar://problem/5852746> is
1549  // fixed.
1550#ifdef __GNUC__
1551  explicit __attribute__((__noinline__)) HandleSDNode(SDValue X)
1552#else
1553  explicit HandleSDNode(SDValue X)
1554#endif
1555    : SDNode(ISD::HANDLENODE, DebugLoc::getUnknownLoc(),
1556             getSDVTList(MVT::Other)) {
1557    InitOperands(&Op, X);
1558  }
1559  ~HandleSDNode();
1560  const SDValue &getValue() const { return Op; }
1561};
1562
1563/// Abstact virtual class for operations for memory operations
1564class MemSDNode : public SDNode {
1565private:
1566  // MemoryVT - VT of in-memory value.
1567  EVT MemoryVT;
1568
1569protected:
1570  /// MMO - Memory reference information.
1571  MachineMemOperand *MMO;
1572
1573public:
1574  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT MemoryVT,
1575            MachineMemOperand *MMO);
1576
1577  MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, const SDValue *Ops,
1578            unsigned NumOps, EVT MemoryVT, MachineMemOperand *MMO);
1579
1580  bool readMem() const { return MMO->isLoad(); }
1581  bool writeMem() const { return MMO->isStore(); }
1582
1583  /// Returns alignment and volatility of the memory access
1584  unsigned getOriginalAlignment() const {
1585    return MMO->getBaseAlignment();
1586  }
1587  unsigned getAlignment() const {
1588    return MMO->getAlignment();
1589  }
1590
1591  /// getRawSubclassData - Return the SubclassData value, which contains an
1592  /// encoding of the volatile flag, as well as bits used by subclasses. This
1593  /// function should only be used to compute a FoldingSetNodeID value.
1594  unsigned getRawSubclassData() const {
1595    return SubclassData;
1596  }
1597
1598  bool isVolatile() const { return (SubclassData >> 5) & 1; }
1599  bool isNonTemporal() const { return MMO->isNonTemporal(); }
1600
1601  /// Returns the SrcValue and offset that describes the location of the access
1602  const Value *getSrcValue() const { return MMO->getValue(); }
1603  int64_t getSrcValueOffset() const { return MMO->getOffset(); }
1604
1605  /// getMemoryVT - Return the type of the in-memory value.
1606  EVT getMemoryVT() const { return MemoryVT; }
1607
1608  /// getMemOperand - Return a MachineMemOperand object describing the memory
1609  /// reference performed by operation.
1610  MachineMemOperand *getMemOperand() const { return MMO; }
1611
1612  /// refineAlignment - Update this MemSDNode's MachineMemOperand information
1613  /// to reflect the alignment of NewMMO, if it has a greater alignment.
1614  /// This must only be used when the new alignment applies to all users of
1615  /// this MachineMemOperand.
1616  void refineAlignment(const MachineMemOperand *NewMMO) {
1617    MMO->refineAlignment(NewMMO);
1618  }
1619
1620  const SDValue &getChain() const { return getOperand(0); }
1621  const SDValue &getBasePtr() const {
1622    return getOperand(getOpcode() == ISD::STORE ? 2 : 1);
1623  }
1624
1625  // Methods to support isa and dyn_cast
1626  static bool classof(const MemSDNode *) { return true; }
1627  static bool classof(const SDNode *N) {
1628    // For some targets, we lower some target intrinsics to a MemIntrinsicNode
1629    // with either an intrinsic or a target opcode.
1630    return N->getOpcode() == ISD::LOAD                ||
1631           N->getOpcode() == ISD::STORE               ||
1632           N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
1633           N->getOpcode() == ISD::ATOMIC_SWAP         ||
1634           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
1635           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
1636           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
1637           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
1638           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
1639           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
1640           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
1641           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
1642           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
1643           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX    ||
1644           N->isTargetMemoryOpcode();
1645  }
1646};
1647
1648/// AtomicSDNode - A SDNode reprenting atomic operations.
1649///
1650class AtomicSDNode : public MemSDNode {
1651  SDUse Ops[4];
1652
1653public:
1654  // Opc:   opcode for atomic
1655  // VTL:    value type list
1656  // Chain:  memory chain for operaand
1657  // Ptr:    address to update as a SDValue
1658  // Cmp:    compare value
1659  // Swp:    swap value
1660  // SrcVal: address to update as a Value (used for MemOperand)
1661  // Align:  alignment of memory
1662  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1663               SDValue Chain, SDValue Ptr,
1664               SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
1665    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1666    assert(readMem() && "Atomic MachineMemOperand is not a load!");
1667    assert(writeMem() && "Atomic MachineMemOperand is not a store!");
1668    InitOperands(Ops, Chain, Ptr, Cmp, Swp);
1669  }
1670  AtomicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTL, EVT MemVT,
1671               SDValue Chain, SDValue Ptr,
1672               SDValue Val, MachineMemOperand *MMO)
1673    : MemSDNode(Opc, dl, VTL, MemVT, MMO) {
1674    assert(readMem() && "Atomic MachineMemOperand is not a load!");
1675    assert(writeMem() && "Atomic MachineMemOperand is not a store!");
1676    InitOperands(Ops, Chain, Ptr, Val);
1677  }
1678
1679  const SDValue &getBasePtr() const { return getOperand(1); }
1680  const SDValue &getVal() const { return getOperand(2); }
1681
1682  bool isCompareAndSwap() const {
1683    unsigned Op = getOpcode();
1684    return Op == ISD::ATOMIC_CMP_SWAP;
1685  }
1686
1687  // Methods to support isa and dyn_cast
1688  static bool classof(const AtomicSDNode *) { return true; }
1689  static bool classof(const SDNode *N) {
1690    return N->getOpcode() == ISD::ATOMIC_CMP_SWAP     ||
1691           N->getOpcode() == ISD::ATOMIC_SWAP         ||
1692           N->getOpcode() == ISD::ATOMIC_LOAD_ADD     ||
1693           N->getOpcode() == ISD::ATOMIC_LOAD_SUB     ||
1694           N->getOpcode() == ISD::ATOMIC_LOAD_AND     ||
1695           N->getOpcode() == ISD::ATOMIC_LOAD_OR      ||
1696           N->getOpcode() == ISD::ATOMIC_LOAD_XOR     ||
1697           N->getOpcode() == ISD::ATOMIC_LOAD_NAND    ||
1698           N->getOpcode() == ISD::ATOMIC_LOAD_MIN     ||
1699           N->getOpcode() == ISD::ATOMIC_LOAD_MAX     ||
1700           N->getOpcode() == ISD::ATOMIC_LOAD_UMIN    ||
1701           N->getOpcode() == ISD::ATOMIC_LOAD_UMAX;
1702  }
1703};
1704
1705/// MemIntrinsicSDNode - This SDNode is used for target intrinsics that touch
1706/// memory and need an associated MachineMemOperand. Its opcode may be
1707/// INTRINSIC_VOID, INTRINSIC_W_CHAIN, or a target-specific opcode with a
1708/// value not less than FIRST_TARGET_MEMORY_OPCODE.
1709class MemIntrinsicSDNode : public MemSDNode {
1710public:
1711  MemIntrinsicSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
1712                     const SDValue *Ops, unsigned NumOps,
1713                     EVT MemoryVT, MachineMemOperand *MMO)
1714    : MemSDNode(Opc, dl, VTs, Ops, NumOps, MemoryVT, MMO) {
1715  }
1716
1717  // Methods to support isa and dyn_cast
1718  static bool classof(const MemIntrinsicSDNode *) { return true; }
1719  static bool classof(const SDNode *N) {
1720    // We lower some target intrinsics to their target opcode
1721    // early a node with a target opcode can be of this class
1722    return N->getOpcode() == ISD::INTRINSIC_W_CHAIN ||
1723           N->getOpcode() == ISD::INTRINSIC_VOID ||
1724           N->isTargetMemoryOpcode();
1725  }
1726};
1727
1728/// ShuffleVectorSDNode - This SDNode is used to implement the code generator
1729/// support for the llvm IR shufflevector instruction.  It combines elements
1730/// from two input vectors into a new input vector, with the selection and
1731/// ordering of elements determined by an array of integers, referred to as
1732/// the shuffle mask.  For input vectors of width N, mask indices of 0..N-1
1733/// refer to elements from the LHS input, and indices from N to 2N-1 the RHS.
1734/// An index of -1 is treated as undef, such that the code generator may put
1735/// any value in the corresponding element of the result.
1736class ShuffleVectorSDNode : public SDNode {
1737  SDUse Ops[2];
1738
1739  // The memory for Mask is owned by the SelectionDAG's OperandAllocator, and
1740  // is freed when the SelectionDAG object is destroyed.
1741  const int *Mask;
1742protected:
1743  friend class SelectionDAG;
1744  ShuffleVectorSDNode(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
1745                      const int *M)
1746    : SDNode(ISD::VECTOR_SHUFFLE, dl, getSDVTList(VT)), Mask(M) {
1747    InitOperands(Ops, N1, N2);
1748  }
1749public:
1750
1751  void getMask(SmallVectorImpl<int> &M) const {
1752    EVT VT = getValueType(0);
1753    M.clear();
1754    for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1755      M.push_back(Mask[i]);
1756  }
1757  int getMaskElt(unsigned Idx) const {
1758    assert(Idx < getValueType(0).getVectorNumElements() && "Idx out of range!");
1759    return Mask[Idx];
1760  }
1761
1762  bool isSplat() const { return isSplatMask(Mask, getValueType(0)); }
1763  int  getSplatIndex() const {
1764    assert(isSplat() && "Cannot get splat index for non-splat!");
1765    return Mask[0];
1766  }
1767  static bool isSplatMask(const int *Mask, EVT VT);
1768
1769  static bool classof(const ShuffleVectorSDNode *) { return true; }
1770  static bool classof(const SDNode *N) {
1771    return N->getOpcode() == ISD::VECTOR_SHUFFLE;
1772  }
1773};
1774
1775class ConstantSDNode : public SDNode {
1776  const ConstantInt *Value;
1777  friend class SelectionDAG;
1778  ConstantSDNode(bool isTarget, const ConstantInt *val, EVT VT)
1779    : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant,
1780             DebugLoc::getUnknownLoc(), getSDVTList(VT)), Value(val) {
1781  }
1782public:
1783
1784  const ConstantInt *getConstantIntValue() const { return Value; }
1785  const APInt &getAPIntValue() const { return Value->getValue(); }
1786  uint64_t getZExtValue() const { return Value->getZExtValue(); }
1787  int64_t getSExtValue() const { return Value->getSExtValue(); }
1788
1789  bool isNullValue() const { return Value->isNullValue(); }
1790  bool isAllOnesValue() const { return Value->isAllOnesValue(); }
1791
1792  static bool classof(const ConstantSDNode *) { return true; }
1793  static bool classof(const SDNode *N) {
1794    return N->getOpcode() == ISD::Constant ||
1795           N->getOpcode() == ISD::TargetConstant;
1796  }
1797};
1798
1799class ConstantFPSDNode : public SDNode {
1800  const ConstantFP *Value;
1801  friend class SelectionDAG;
1802  ConstantFPSDNode(bool isTarget, const ConstantFP *val, EVT VT)
1803    : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP,
1804             DebugLoc::getUnknownLoc(), getSDVTList(VT)), Value(val) {
1805  }
1806public:
1807
1808  const APFloat& getValueAPF() const { return Value->getValueAPF(); }
1809  const ConstantFP *getConstantFPValue() const { return Value; }
1810
1811  /// isExactlyValue - We don't rely on operator== working on double values, as
1812  /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
1813  /// As such, this method can be used to do an exact bit-for-bit comparison of
1814  /// two floating point values.
1815
1816  /// We leave the version with the double argument here because it's just so
1817  /// convenient to write "2.0" and the like.  Without this function we'd
1818  /// have to duplicate its logic everywhere it's called.
1819  bool isExactlyValue(double V) const {
1820    bool ignored;
1821    // convert is not supported on this type
1822    if (&Value->getValueAPF().getSemantics() == &APFloat::PPCDoubleDouble)
1823      return false;
1824    APFloat Tmp(V);
1825    Tmp.convert(Value->getValueAPF().getSemantics(),
1826                APFloat::rmNearestTiesToEven, &ignored);
1827    return isExactlyValue(Tmp);
1828  }
1829  bool isExactlyValue(const APFloat& V) const;
1830
1831  bool isValueValidForType(EVT VT, const APFloat& Val);
1832
1833  static bool classof(const ConstantFPSDNode *) { return true; }
1834  static bool classof(const SDNode *N) {
1835    return N->getOpcode() == ISD::ConstantFP ||
1836           N->getOpcode() == ISD::TargetConstantFP;
1837  }
1838};
1839
1840class GlobalAddressSDNode : public SDNode {
1841  GlobalValue *TheGlobal;
1842  int64_t Offset;
1843  unsigned char TargetFlags;
1844  friend class SelectionDAG;
1845  GlobalAddressSDNode(unsigned Opc, const GlobalValue *GA, EVT VT,
1846                      int64_t o, unsigned char TargetFlags);
1847public:
1848
1849  GlobalValue *getGlobal() const { return TheGlobal; }
1850  int64_t getOffset() const { return Offset; }
1851  unsigned char getTargetFlags() const { return TargetFlags; }
1852  // Return the address space this GlobalAddress belongs to.
1853  unsigned getAddressSpace() const;
1854
1855  static bool classof(const GlobalAddressSDNode *) { return true; }
1856  static bool classof(const SDNode *N) {
1857    return N->getOpcode() == ISD::GlobalAddress ||
1858           N->getOpcode() == ISD::TargetGlobalAddress ||
1859           N->getOpcode() == ISD::GlobalTLSAddress ||
1860           N->getOpcode() == ISD::TargetGlobalTLSAddress;
1861  }
1862};
1863
1864class FrameIndexSDNode : public SDNode {
1865  int FI;
1866  friend class SelectionDAG;
1867  FrameIndexSDNode(int fi, EVT VT, bool isTarg)
1868    : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex,
1869      DebugLoc::getUnknownLoc(), getSDVTList(VT)), FI(fi) {
1870  }
1871public:
1872
1873  int getIndex() const { return FI; }
1874
1875  static bool classof(const FrameIndexSDNode *) { return true; }
1876  static bool classof(const SDNode *N) {
1877    return N->getOpcode() == ISD::FrameIndex ||
1878           N->getOpcode() == ISD::TargetFrameIndex;
1879  }
1880};
1881
1882class JumpTableSDNode : public SDNode {
1883  int JTI;
1884  unsigned char TargetFlags;
1885  friend class SelectionDAG;
1886  JumpTableSDNode(int jti, EVT VT, bool isTarg, unsigned char TF)
1887    : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable,
1888      DebugLoc::getUnknownLoc(), getSDVTList(VT)), JTI(jti), TargetFlags(TF) {
1889  }
1890public:
1891
1892  int getIndex() const { return JTI; }
1893  unsigned char getTargetFlags() const { return TargetFlags; }
1894
1895  static bool classof(const JumpTableSDNode *) { return true; }
1896  static bool classof(const SDNode *N) {
1897    return N->getOpcode() == ISD::JumpTable ||
1898           N->getOpcode() == ISD::TargetJumpTable;
1899  }
1900};
1901
1902class ConstantPoolSDNode : public SDNode {
1903  union {
1904    Constant *ConstVal;
1905    MachineConstantPoolValue *MachineCPVal;
1906  } Val;
1907  int Offset;  // It's a MachineConstantPoolValue if top bit is set.
1908  unsigned Alignment;  // Minimum alignment requirement of CP (not log2 value).
1909  unsigned char TargetFlags;
1910  friend class SelectionDAG;
1911  ConstantPoolSDNode(bool isTarget, Constant *c, EVT VT, int o, unsigned Align,
1912                     unsigned char TF)
1913    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1914             DebugLoc::getUnknownLoc(),
1915             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1916    assert((int)Offset >= 0 && "Offset is too large");
1917    Val.ConstVal = c;
1918  }
1919  ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v,
1920                     EVT VT, int o, unsigned Align, unsigned char TF)
1921    : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
1922             DebugLoc::getUnknownLoc(),
1923             getSDVTList(VT)), Offset(o), Alignment(Align), TargetFlags(TF) {
1924    assert((int)Offset >= 0 && "Offset is too large");
1925    Val.MachineCPVal = v;
1926    Offset |= 1 << (sizeof(unsigned)*CHAR_BIT-1);
1927  }
1928public:
1929
1930
1931  bool isMachineConstantPoolEntry() const {
1932    return (int)Offset < 0;
1933  }
1934
1935  Constant *getConstVal() const {
1936    assert(!isMachineConstantPoolEntry() && "Wrong constantpool type");
1937    return Val.ConstVal;
1938  }
1939
1940  MachineConstantPoolValue *getMachineCPVal() const {
1941    assert(isMachineConstantPoolEntry() && "Wrong constantpool type");
1942    return Val.MachineCPVal;
1943  }
1944
1945  int getOffset() const {
1946    return Offset & ~(1 << (sizeof(unsigned)*CHAR_BIT-1));
1947  }
1948
1949  // Return the alignment of this constant pool object, which is either 0 (for
1950  // default alignment) or the desired value.
1951  unsigned getAlignment() const { return Alignment; }
1952  unsigned char getTargetFlags() const { return TargetFlags; }
1953
1954  const Type *getType() const;
1955
1956  static bool classof(const ConstantPoolSDNode *) { return true; }
1957  static bool classof(const SDNode *N) {
1958    return N->getOpcode() == ISD::ConstantPool ||
1959           N->getOpcode() == ISD::TargetConstantPool;
1960  }
1961};
1962
1963class BasicBlockSDNode : public SDNode {
1964  MachineBasicBlock *MBB;
1965  friend class SelectionDAG;
1966  /// Debug info is meaningful and potentially useful here, but we create
1967  /// blocks out of order when they're jumped to, which makes it a bit
1968  /// harder.  Let's see if we need it first.
1969  explicit BasicBlockSDNode(MachineBasicBlock *mbb)
1970    : SDNode(ISD::BasicBlock, DebugLoc::getUnknownLoc(),
1971             getSDVTList(MVT::Other)), MBB(mbb) {
1972  }
1973public:
1974
1975  MachineBasicBlock *getBasicBlock() const { return MBB; }
1976
1977  static bool classof(const BasicBlockSDNode *) { return true; }
1978  static bool classof(const SDNode *N) {
1979    return N->getOpcode() == ISD::BasicBlock;
1980  }
1981};
1982
1983/// BuildVectorSDNode - A "pseudo-class" with methods for operating on
1984/// BUILD_VECTORs.
1985class BuildVectorSDNode : public SDNode {
1986  // These are constructed as SDNodes and then cast to BuildVectorSDNodes.
1987  explicit BuildVectorSDNode();        // Do not implement
1988public:
1989  /// isConstantSplat - Check if this is a constant splat, and if so, find the
1990  /// smallest element size that splats the vector.  If MinSplatBits is
1991  /// nonzero, the element size must be at least that large.  Note that the
1992  /// splat element may be the entire vector (i.e., a one element vector).
1993  /// Returns the splat element value in SplatValue.  Any undefined bits in
1994  /// that value are zero, and the corresponding bits in the SplatUndef mask
1995  /// are set.  The SplatBitSize value is set to the splat element size in
1996  /// bits.  HasAnyUndefs is set to true if any bits in the vector are
1997  /// undefined.  isBigEndian describes the endianness of the target.
1998  bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
1999                       unsigned &SplatBitSize, bool &HasAnyUndefs,
2000                       unsigned MinSplatBits = 0, bool isBigEndian = false);
2001
2002  static inline bool classof(const BuildVectorSDNode *) { return true; }
2003  static inline bool classof(const SDNode *N) {
2004    return N->getOpcode() == ISD::BUILD_VECTOR;
2005  }
2006};
2007
2008/// SrcValueSDNode - An SDNode that holds an arbitrary LLVM IR Value. This is
2009/// used when the SelectionDAG needs to make a simple reference to something
2010/// in the LLVM IR representation.
2011///
2012class SrcValueSDNode : public SDNode {
2013  const Value *V;
2014  friend class SelectionDAG;
2015  /// Create a SrcValue for a general value.
2016  explicit SrcValueSDNode(const Value *v)
2017    : SDNode(ISD::SRCVALUE, DebugLoc::getUnknownLoc(),
2018             getSDVTList(MVT::Other)), V(v) {}
2019
2020public:
2021  /// getValue - return the contained Value.
2022  const Value *getValue() const { return V; }
2023
2024  static bool classof(const SrcValueSDNode *) { return true; }
2025  static bool classof(const SDNode *N) {
2026    return N->getOpcode() == ISD::SRCVALUE;
2027  }
2028};
2029
2030
2031class RegisterSDNode : public SDNode {
2032  unsigned Reg;
2033  friend class SelectionDAG;
2034  RegisterSDNode(unsigned reg, EVT VT)
2035    : SDNode(ISD::Register, DebugLoc::getUnknownLoc(),
2036             getSDVTList(VT)), Reg(reg) {
2037  }
2038public:
2039
2040  unsigned getReg() const { return Reg; }
2041
2042  static bool classof(const RegisterSDNode *) { return true; }
2043  static bool classof(const SDNode *N) {
2044    return N->getOpcode() == ISD::Register;
2045  }
2046};
2047
2048class BlockAddressSDNode : public SDNode {
2049  BlockAddress *BA;
2050  unsigned char TargetFlags;
2051  friend class SelectionDAG;
2052  BlockAddressSDNode(unsigned NodeTy, EVT VT, BlockAddress *ba,
2053                     unsigned char Flags)
2054    : SDNode(NodeTy, DebugLoc::getUnknownLoc(), getSDVTList(VT)),
2055             BA(ba), TargetFlags(Flags) {
2056  }
2057public:
2058  BlockAddress *getBlockAddress() const { return BA; }
2059  unsigned char getTargetFlags() const { return TargetFlags; }
2060
2061  static bool classof(const BlockAddressSDNode *) { return true; }
2062  static bool classof(const SDNode *N) {
2063    return N->getOpcode() == ISD::BlockAddress ||
2064           N->getOpcode() == ISD::TargetBlockAddress;
2065  }
2066};
2067
2068class LabelSDNode : public SDNode {
2069  SDUse Chain;
2070  unsigned LabelID;
2071  friend class SelectionDAG;
2072  LabelSDNode(unsigned NodeTy, DebugLoc dl, SDValue ch, unsigned id)
2073    : SDNode(NodeTy, dl, getSDVTList(MVT::Other)), LabelID(id) {
2074    InitOperands(&Chain, ch);
2075  }
2076public:
2077  unsigned getLabelID() const { return LabelID; }
2078
2079  static bool classof(const LabelSDNode *) { return true; }
2080  static bool classof(const SDNode *N) {
2081    return N->getOpcode() == ISD::EH_LABEL;
2082  }
2083};
2084
2085class ExternalSymbolSDNode : public SDNode {
2086  const char *Symbol;
2087  unsigned char TargetFlags;
2088
2089  friend class SelectionDAG;
2090  ExternalSymbolSDNode(bool isTarget, const char *Sym, unsigned char TF, EVT VT)
2091    : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol,
2092             DebugLoc::getUnknownLoc(),
2093             getSDVTList(VT)), Symbol(Sym), TargetFlags(TF) {
2094  }
2095public:
2096
2097  const char *getSymbol() const { return Symbol; }
2098  unsigned char getTargetFlags() const { return TargetFlags; }
2099
2100  static bool classof(const ExternalSymbolSDNode *) { return true; }
2101  static bool classof(const SDNode *N) {
2102    return N->getOpcode() == ISD::ExternalSymbol ||
2103           N->getOpcode() == ISD::TargetExternalSymbol;
2104  }
2105};
2106
2107class CondCodeSDNode : public SDNode {
2108  ISD::CondCode Condition;
2109  friend class SelectionDAG;
2110  explicit CondCodeSDNode(ISD::CondCode Cond)
2111    : SDNode(ISD::CONDCODE, DebugLoc::getUnknownLoc(),
2112             getSDVTList(MVT::Other)), Condition(Cond) {
2113  }
2114public:
2115
2116  ISD::CondCode get() const { return Condition; }
2117
2118  static bool classof(const CondCodeSDNode *) { return true; }
2119  static bool classof(const SDNode *N) {
2120    return N->getOpcode() == ISD::CONDCODE;
2121  }
2122};
2123
2124/// CvtRndSatSDNode - NOTE: avoid using this node as this may disappear in the
2125/// future and most targets don't support it.
2126class CvtRndSatSDNode : public SDNode {
2127  ISD::CvtCode CvtCode;
2128  friend class SelectionDAG;
2129  explicit CvtRndSatSDNode(EVT VT, DebugLoc dl, const SDValue *Ops,
2130                           unsigned NumOps, ISD::CvtCode Code)
2131    : SDNode(ISD::CONVERT_RNDSAT, dl, getSDVTList(VT), Ops, NumOps),
2132      CvtCode(Code) {
2133    assert(NumOps == 5 && "wrong number of operations");
2134  }
2135public:
2136  ISD::CvtCode getCvtCode() const { return CvtCode; }
2137
2138  static bool classof(const CvtRndSatSDNode *) { return true; }
2139  static bool classof(const SDNode *N) {
2140    return N->getOpcode() == ISD::CONVERT_RNDSAT;
2141  }
2142};
2143
2144namespace ISD {
2145  struct ArgFlagsTy {
2146  private:
2147    static const uint64_t NoFlagSet      = 0ULL;
2148    static const uint64_t ZExt           = 1ULL<<0;  ///< Zero extended
2149    static const uint64_t ZExtOffs       = 0;
2150    static const uint64_t SExt           = 1ULL<<1;  ///< Sign extended
2151    static const uint64_t SExtOffs       = 1;
2152    static const uint64_t InReg          = 1ULL<<2;  ///< Passed in register
2153    static const uint64_t InRegOffs      = 2;
2154    static const uint64_t SRet           = 1ULL<<3;  ///< Hidden struct-ret ptr
2155    static const uint64_t SRetOffs       = 3;
2156    static const uint64_t ByVal          = 1ULL<<4;  ///< Struct passed by value
2157    static const uint64_t ByValOffs      = 4;
2158    static const uint64_t Nest           = 1ULL<<5;  ///< Nested fn static chain
2159    static const uint64_t NestOffs       = 5;
2160    static const uint64_t ByValAlign     = 0xFULL << 6; //< Struct alignment
2161    static const uint64_t ByValAlignOffs = 6;
2162    static const uint64_t Split          = 1ULL << 10;
2163    static const uint64_t SplitOffs      = 10;
2164    static const uint64_t OrigAlign      = 0x1FULL<<27;
2165    static const uint64_t OrigAlignOffs  = 27;
2166    static const uint64_t ByValSize      = 0xffffffffULL << 32; //< Struct size
2167    static const uint64_t ByValSizeOffs  = 32;
2168
2169    static const uint64_t One            = 1ULL; //< 1 of this type, for shifts
2170
2171    uint64_t Flags;
2172  public:
2173    ArgFlagsTy() : Flags(0) { }
2174
2175    bool isZExt()   const { return Flags & ZExt; }
2176    void setZExt()  { Flags |= One << ZExtOffs; }
2177
2178    bool isSExt()   const { return Flags & SExt; }
2179    void setSExt()  { Flags |= One << SExtOffs; }
2180
2181    bool isInReg()  const { return Flags & InReg; }
2182    void setInReg() { Flags |= One << InRegOffs; }
2183
2184    bool isSRet()   const { return Flags & SRet; }
2185    void setSRet()  { Flags |= One << SRetOffs; }
2186
2187    bool isByVal()  const { return Flags & ByVal; }
2188    void setByVal() { Flags |= One << ByValOffs; }
2189
2190    bool isNest()   const { return Flags & Nest; }
2191    void setNest()  { Flags |= One << NestOffs; }
2192
2193    unsigned getByValAlign() const {
2194      return (unsigned)
2195        ((One << ((Flags & ByValAlign) >> ByValAlignOffs)) / 2);
2196    }
2197    void setByValAlign(unsigned A) {
2198      Flags = (Flags & ~ByValAlign) |
2199        (uint64_t(Log2_32(A) + 1) << ByValAlignOffs);
2200    }
2201
2202    bool isSplit()   const { return Flags & Split; }
2203    void setSplit()  { Flags |= One << SplitOffs; }
2204
2205    unsigned getOrigAlign() const {
2206      return (unsigned)
2207        ((One << ((Flags & OrigAlign) >> OrigAlignOffs)) / 2);
2208    }
2209    void setOrigAlign(unsigned A) {
2210      Flags = (Flags & ~OrigAlign) |
2211        (uint64_t(Log2_32(A) + 1) << OrigAlignOffs);
2212    }
2213
2214    unsigned getByValSize() const {
2215      return (unsigned)((Flags & ByValSize) >> ByValSizeOffs);
2216    }
2217    void setByValSize(unsigned S) {
2218      Flags = (Flags & ~ByValSize) | (uint64_t(S) << ByValSizeOffs);
2219    }
2220
2221    /// getArgFlagsString - Returns the flags as a string, eg: "zext align:4".
2222    std::string getArgFlagsString();
2223
2224    /// getRawBits - Represent the flags as a bunch of bits.
2225    uint64_t getRawBits() const { return Flags; }
2226  };
2227
2228  /// InputArg - This struct carries flags and type information about a
2229  /// single incoming (formal) argument or incoming (from the perspective
2230  /// of the caller) return value virtual register.
2231  ///
2232  struct InputArg {
2233    ArgFlagsTy Flags;
2234    EVT VT;
2235    bool Used;
2236
2237    InputArg() : VT(MVT::Other), Used(false) {}
2238    InputArg(ISD::ArgFlagsTy flags, EVT vt, bool used)
2239      : Flags(flags), VT(vt), Used(used) {
2240      assert(VT.isSimple() &&
2241             "InputArg value type must be Simple!");
2242    }
2243  };
2244
2245  /// OutputArg - This struct carries flags and a value for a
2246  /// single outgoing (actual) argument or outgoing (from the perspective
2247  /// of the caller) return value virtual register.
2248  ///
2249  struct OutputArg {
2250    ArgFlagsTy Flags;
2251    SDValue Val;
2252    bool IsFixed;
2253
2254    OutputArg() : IsFixed(false) {}
2255    OutputArg(ISD::ArgFlagsTy flags, SDValue val, bool isfixed)
2256      : Flags(flags), Val(val), IsFixed(isfixed) {
2257      assert(Val.getValueType().isSimple() &&
2258             "OutputArg value type must be Simple!");
2259    }
2260  };
2261}
2262
2263/// VTSDNode - This class is used to represent EVT's, which are used
2264/// to parameterize some operations.
2265class VTSDNode : public SDNode {
2266  EVT ValueType;
2267  friend class SelectionDAG;
2268  explicit VTSDNode(EVT VT)
2269    : SDNode(ISD::VALUETYPE, DebugLoc::getUnknownLoc(),
2270             getSDVTList(MVT::Other)), ValueType(VT) {
2271  }
2272public:
2273
2274  EVT getVT() const { return ValueType; }
2275
2276  static bool classof(const VTSDNode *) { return true; }
2277  static bool classof(const SDNode *N) {
2278    return N->getOpcode() == ISD::VALUETYPE;
2279  }
2280};
2281
2282/// LSBaseSDNode - Base class for LoadSDNode and StoreSDNode
2283///
2284class LSBaseSDNode : public MemSDNode {
2285  //! Operand array for load and store
2286  /*!
2287    \note Moving this array to the base class captures more
2288    common functionality shared between LoadSDNode and
2289    StoreSDNode
2290   */
2291  SDUse Ops[4];
2292public:
2293  LSBaseSDNode(ISD::NodeType NodeTy, DebugLoc dl, SDValue *Operands,
2294               unsigned numOperands, SDVTList VTs, ISD::MemIndexedMode AM,
2295               EVT MemVT, MachineMemOperand *MMO)
2296    : MemSDNode(NodeTy, dl, VTs, MemVT, MMO) {
2297    SubclassData |= AM << 2;
2298    assert(getAddressingMode() == AM && "MemIndexedMode encoding error!");
2299    InitOperands(Ops, Operands, numOperands);
2300    assert((getOffset().getOpcode() == ISD::UNDEF || isIndexed()) &&
2301           "Only indexed loads and stores have a non-undef offset operand");
2302  }
2303
2304  const SDValue &getOffset() const {
2305    return getOperand(getOpcode() == ISD::LOAD ? 2 : 3);
2306  }
2307
2308  /// getAddressingMode - Return the addressing mode for this load or store:
2309  /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
2310  ISD::MemIndexedMode getAddressingMode() const {
2311    return ISD::MemIndexedMode((SubclassData >> 2) & 7);
2312  }
2313
2314  /// isIndexed - Return true if this is a pre/post inc/dec load/store.
2315  bool isIndexed() const { return getAddressingMode() != ISD::UNINDEXED; }
2316
2317  /// isUnindexed - Return true if this is NOT a pre/post inc/dec load/store.
2318  bool isUnindexed() const { return getAddressingMode() == ISD::UNINDEXED; }
2319
2320  static bool classof(const LSBaseSDNode *) { return true; }
2321  static bool classof(const SDNode *N) {
2322    return N->getOpcode() == ISD::LOAD ||
2323           N->getOpcode() == ISD::STORE;
2324  }
2325};
2326
2327/// LoadSDNode - This class is used to represent ISD::LOAD nodes.
2328///
2329class LoadSDNode : public LSBaseSDNode {
2330  friend class SelectionDAG;
2331  LoadSDNode(SDValue *ChainPtrOff, DebugLoc dl, SDVTList VTs,
2332             ISD::MemIndexedMode AM, ISD::LoadExtType ETy, EVT MemVT,
2333             MachineMemOperand *MMO)
2334    : LSBaseSDNode(ISD::LOAD, dl, ChainPtrOff, 3,
2335                   VTs, AM, MemVT, MMO) {
2336    SubclassData |= (unsigned short)ETy;
2337    assert(getExtensionType() == ETy && "LoadExtType encoding error!");
2338    assert(readMem() && "Load MachineMemOperand is not a load!");
2339    assert(!writeMem() && "Load MachineMemOperand is a store!");
2340  }
2341public:
2342
2343  /// getExtensionType - Return whether this is a plain node,
2344  /// or one of the varieties of value-extending loads.
2345  ISD::LoadExtType getExtensionType() const {
2346    return ISD::LoadExtType(SubclassData & 3);
2347  }
2348
2349  const SDValue &getBasePtr() const { return getOperand(1); }
2350  const SDValue &getOffset() const { return getOperand(2); }
2351
2352  static bool classof(const LoadSDNode *) { return true; }
2353  static bool classof(const SDNode *N) {
2354    return N->getOpcode() == ISD::LOAD;
2355  }
2356};
2357
2358/// StoreSDNode - This class is used to represent ISD::STORE nodes.
2359///
2360class StoreSDNode : public LSBaseSDNode {
2361  friend class SelectionDAG;
2362  StoreSDNode(SDValue *ChainValuePtrOff, DebugLoc dl, SDVTList VTs,
2363              ISD::MemIndexedMode AM, bool isTrunc, EVT MemVT,
2364              MachineMemOperand *MMO)
2365    : LSBaseSDNode(ISD::STORE, dl, ChainValuePtrOff, 4,
2366                   VTs, AM, MemVT, MMO) {
2367    SubclassData |= (unsigned short)isTrunc;
2368    assert(isTruncatingStore() == isTrunc && "isTrunc encoding error!");
2369    assert(!readMem() && "Store MachineMemOperand is a load!");
2370    assert(writeMem() && "Store MachineMemOperand is not a store!");
2371  }
2372public:
2373
2374  /// isTruncatingStore - Return true if the op does a truncation before store.
2375  /// For integers this is the same as doing a TRUNCATE and storing the result.
2376  /// For floats, it is the same as doing an FP_ROUND and storing the result.
2377  bool isTruncatingStore() const { return SubclassData & 1; }
2378
2379  const SDValue &getValue() const { return getOperand(1); }
2380  const SDValue &getBasePtr() const { return getOperand(2); }
2381  const SDValue &getOffset() const { return getOperand(3); }
2382
2383  static bool classof(const StoreSDNode *) { return true; }
2384  static bool classof(const SDNode *N) {
2385    return N->getOpcode() == ISD::STORE;
2386  }
2387};
2388
2389/// MachineSDNode - An SDNode that represents everything that will be needed
2390/// to construct a MachineInstr. These nodes are created during the
2391/// instruction selection proper phase.
2392///
2393class MachineSDNode : public SDNode {
2394public:
2395  typedef MachineMemOperand **mmo_iterator;
2396
2397private:
2398  friend class SelectionDAG;
2399  MachineSDNode(unsigned Opc, const DebugLoc DL, SDVTList VTs)
2400    : SDNode(Opc, DL, VTs), MemRefs(0), MemRefsEnd(0) {}
2401
2402  /// LocalOperands - Operands for this instruction, if they fit here. If
2403  /// they don't, this field is unused.
2404  SDUse LocalOperands[4];
2405
2406  /// MemRefs - Memory reference descriptions for this instruction.
2407  mmo_iterator MemRefs;
2408  mmo_iterator MemRefsEnd;
2409
2410public:
2411  mmo_iterator memoperands_begin() const { return MemRefs; }
2412  mmo_iterator memoperands_end() const { return MemRefsEnd; }
2413  bool memoperands_empty() const { return MemRefsEnd == MemRefs; }
2414
2415  /// setMemRefs - Assign this MachineSDNodes's memory reference descriptor
2416  /// list. This does not transfer ownership.
2417  void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) {
2418    MemRefs = NewMemRefs;
2419    MemRefsEnd = NewMemRefsEnd;
2420  }
2421
2422  static bool classof(const MachineSDNode *) { return true; }
2423  static bool classof(const SDNode *N) {
2424    return N->isMachineOpcode();
2425  }
2426};
2427
2428class SDNodeIterator : public std::iterator<std::forward_iterator_tag,
2429                                            SDNode, ptrdiff_t> {
2430  SDNode *Node;
2431  unsigned Operand;
2432
2433  SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
2434public:
2435  bool operator==(const SDNodeIterator& x) const {
2436    return Operand == x.Operand;
2437  }
2438  bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
2439
2440  const SDNodeIterator &operator=(const SDNodeIterator &I) {
2441    assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
2442    Operand = I.Operand;
2443    return *this;
2444  }
2445
2446  pointer operator*() const {
2447    return Node->getOperand(Operand).getNode();
2448  }
2449  pointer operator->() const { return operator*(); }
2450
2451  SDNodeIterator& operator++() {                // Preincrement
2452    ++Operand;
2453    return *this;
2454  }
2455  SDNodeIterator operator++(int) { // Postincrement
2456    SDNodeIterator tmp = *this; ++*this; return tmp;
2457  }
2458  size_t operator-(SDNodeIterator Other) const {
2459    assert(Node == Other.Node &&
2460           "Cannot compare iterators of two different nodes!");
2461    return Operand - Other.Operand;
2462  }
2463
2464  static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
2465  static SDNodeIterator end  (SDNode *N) {
2466    return SDNodeIterator(N, N->getNumOperands());
2467  }
2468
2469  unsigned getOperand() const { return Operand; }
2470  const SDNode *getNode() const { return Node; }
2471};
2472
2473template <> struct GraphTraits<SDNode*> {
2474  typedef SDNode NodeType;
2475  typedef SDNodeIterator ChildIteratorType;
2476  static inline NodeType *getEntryNode(SDNode *N) { return N; }
2477  static inline ChildIteratorType child_begin(NodeType *N) {
2478    return SDNodeIterator::begin(N);
2479  }
2480  static inline ChildIteratorType child_end(NodeType *N) {
2481    return SDNodeIterator::end(N);
2482  }
2483};
2484
2485/// LargestSDNode - The largest SDNode class.
2486///
2487typedef LoadSDNode LargestSDNode;
2488
2489/// MostAlignedSDNode - The SDNode class with the greatest alignment
2490/// requirement.
2491///
2492typedef GlobalAddressSDNode MostAlignedSDNode;
2493
2494namespace ISD {
2495  /// isNormalLoad - Returns true if the specified node is a non-extending
2496  /// and unindexed load.
2497  inline bool isNormalLoad(const SDNode *N) {
2498    const LoadSDNode *Ld = dyn_cast<LoadSDNode>(N);
2499    return Ld && Ld->getExtensionType() == ISD::NON_EXTLOAD &&
2500      Ld->getAddressingMode() == ISD::UNINDEXED;
2501  }
2502
2503  /// isNON_EXTLoad - Returns true if the specified node is a non-extending
2504  /// load.
2505  inline bool isNON_EXTLoad(const SDNode *N) {
2506    return isa<LoadSDNode>(N) &&
2507      cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;
2508  }
2509
2510  /// isEXTLoad - Returns true if the specified node is a EXTLOAD.
2511  ///
2512  inline bool isEXTLoad(const SDNode *N) {
2513    return isa<LoadSDNode>(N) &&
2514      cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD;
2515  }
2516
2517  /// isSEXTLoad - Returns true if the specified node is a SEXTLOAD.
2518  ///
2519  inline bool isSEXTLoad(const SDNode *N) {
2520    return isa<LoadSDNode>(N) &&
2521      cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD;
2522  }
2523
2524  /// isZEXTLoad - Returns true if the specified node is a ZEXTLOAD.
2525  ///
2526  inline bool isZEXTLoad(const SDNode *N) {
2527    return isa<LoadSDNode>(N) &&
2528      cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD;
2529  }
2530
2531  /// isUNINDEXEDLoad - Returns true if the specified node is an unindexed load.
2532  ///
2533  inline bool isUNINDEXEDLoad(const SDNode *N) {
2534    return isa<LoadSDNode>(N) &&
2535      cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
2536  }
2537
2538  /// isNormalStore - Returns true if the specified node is a non-truncating
2539  /// and unindexed store.
2540  inline bool isNormalStore(const SDNode *N) {
2541    const StoreSDNode *St = dyn_cast<StoreSDNode>(N);
2542    return St && !St->isTruncatingStore() &&
2543      St->getAddressingMode() == ISD::UNINDEXED;
2544  }
2545
2546  /// isNON_TRUNCStore - Returns true if the specified node is a non-truncating
2547  /// store.
2548  inline bool isNON_TRUNCStore(const SDNode *N) {
2549    return isa<StoreSDNode>(N) && !cast<StoreSDNode>(N)->isTruncatingStore();
2550  }
2551
2552  /// isTRUNCStore - Returns true if the specified node is a truncating
2553  /// store.
2554  inline bool isTRUNCStore(const SDNode *N) {
2555    return isa<StoreSDNode>(N) && cast<StoreSDNode>(N)->isTruncatingStore();
2556  }
2557
2558  /// isUNINDEXEDStore - Returns true if the specified node is an
2559  /// unindexed store.
2560  inline bool isUNINDEXEDStore(const SDNode *N) {
2561    return isa<StoreSDNode>(N) &&
2562      cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
2563  }
2564}
2565
2566
2567} // end llvm namespace
2568
2569#endif
2570