SelectionDAGNodes.h revision 95762124a1d781cc0f8cbc4c22e9c5c1358d7ea0
163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===// 263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// The LLVM Compiler Infrastructure 463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file was developed by the LLVM research group and is distributed under 663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file declares the SDNode class and derived classes, which are used to 1163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// represent the nodes and operations present in a SelectionDAG. These nodes 1263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// and operations are machine code level operations, with some similarities to 1363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the GCC RTL representation. 1463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Clients should include the SelectionDAG.h file instead of this file directly. 1663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 1863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H 2063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#define LLVM_CODEGEN_SELECTIONDAGNODES_H 2163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include "llvm/CodeGen/ValueTypes.h" 231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/iterator" 2639931a3dbac1aa2fe2ec14f26001c8c29102940cJeff Cohen#include "llvm/Support/DataTypes.h" 2763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <cassert> 2863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <vector> 2963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace llvm { 3163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SelectionDAG; 3363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalValue; 3463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass MachineBasicBlock; 3563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode; 3663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate <typename T> struct simplify_type; 3763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// ISD namespace - This namespace contains an enum which represents all of the 3963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SelectionDAG node types and value types. 4063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 4163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace ISD { 4263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 4363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::NodeType enum - This enum defines all of the operators valid in a 4463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SelectionDAG. 4563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 4663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum NodeType { 478a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // EntryToken - This is the marker used to indicate the start of the region. 488a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner EntryToken, 498a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner 508a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Token factor - This node is takes multiple tokens as input and produces a 518a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // single token result. This is used to represent the fact that the operand 528a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // operators are independent of each other. 538a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner TokenFactor, 548a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner 558a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Various leaf nodes. 568a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner Constant, ConstantFP, GlobalAddress, FrameIndex, ConstantPool, 5763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BasicBlock, ExternalSymbol, 5863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyToReg - This node has chain and child nodes, and an associated 6063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // register number. The instruction selector must guarantee that the value 6118c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // of the value node is available in the register stored in the RegSDNode 6218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // object. 6363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyToReg, 6463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyFromReg - This node indicates that the input value is a virtual or 6663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // physical register that is defined outside of the scope of this 6718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // SelectionDAG. The register is available from the RegSDNode object. 6863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyFromReg, 6963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 7018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // ImplicitDef - This node indicates that the specified register is 7118c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // implicitly defined by some operation (e.g. its a live-in argument). This 7218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // register is indicated in the RegSDNode object. The only operand to this 7318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // is the token chain coming in, the only result is the token chain going 7418c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // out. 7518c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner ImplicitDef, 7618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 7763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // EXTRACT_ELEMENT - This is used to get the first or second (determined by 7863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // a Constant, which is required to be operand #1), element of the aggregate 7963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // value specified as operand #0. This is only for use before legalization, 8063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // for values that will be broken into multiple registers. 8163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner EXTRACT_ELEMENT, 8263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways. Given 8463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // two values of the same integer value type, this produces a value twice as 8563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // big. Like EXTRACT_ELEMENT, this can only be used before legalization. 8663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILD_PAIR, 8763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Simple binary arithmetic operators. 9063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ADD, SUB, MUL, SDIV, UDIV, SREM, UREM, 9163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Bitwise operators. 9363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner AND, OR, XOR, SHL, SRA, SRL, 9463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Select operator. 9663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SELECT, 9763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCC operator - This evaluates to a boolean (i1) true value if the 9963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // condition is true. These nodes are instances of the 10063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCCSDNode class, which contains the condition code as extra 10163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // state. 10263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC, 10363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1045880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // ADD_PARTS/SUB_PARTS - These operators take two logical operands which are 1055880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // broken into a multiple pieces each, and return the resulting pieces of 1065880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // doing an atomic add/sub operation. This is used to handle add/sub of 1075880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // expanded types. The operation ordering is: 1085880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], [LoRHS,HiRHS] 1095880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner ADD_PARTS, SUB_PARTS, 11063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 11163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Conversion operators. These are all single input single output 11263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operations. For all of these, the result type must be strictly 11363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // wider or narrower (depending on the operation) than the source 11463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // type. 11563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 11663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SIGN_EXTEND - Used for integer types, replicating the sign bit 11763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // into new bits. 11863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SIGN_EXTEND, 11963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 12063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // ZERO_EXTEND - Used for integer types, zeroing the new bits. 12163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ZERO_EXTEND, 12263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 12363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // TRUNCATE - Completely drop the high bits. 12463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TRUNCATE, 12563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1261645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // [SU]INT_TO_FP - These operators convert integers (whose interpreted sign 1271645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // depends on the first letter) to floating point. 1281645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner SINT_TO_FP, 1291645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner UINT_TO_FP, 1301645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 131859157daee6a4b49e99921832e1dde065167b317Chris Lattner // SIGN_EXTEND_INREG/ZERO_EXTEND_INREG - These operators atomically performs 132859157daee6a4b49e99921832e1dde065167b317Chris Lattner // a SHL/(SRA|SHL) pair to (sign|zero) extend a small value in a large 133859157daee6a4b49e99921832e1dde065167b317Chris Lattner // integer register (e.g. sign extending the low 8 bits of a 32-bit register 134859157daee6a4b49e99921832e1dde065167b317Chris Lattner // to fill the top 24 bits with the 7th bit). The size of the smaller type 135859157daee6a4b49e99921832e1dde065167b317Chris Lattner // is indicated by the ExtraValueType in the MVTSDNode for the operator. 136859157daee6a4b49e99921832e1dde065167b317Chris Lattner SIGN_EXTEND_INREG, 137859157daee6a4b49e99921832e1dde065167b317Chris Lattner ZERO_EXTEND_INREG, 138859157daee6a4b49e99921832e1dde065167b317Chris Lattner 1391645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // FP_TO_[US]INT - Convert a floating point value to a signed or unsigned 1401645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // integer. 1411645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_SINT, 1421645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_UINT, 1431645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 14463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_ROUND - Perform a rounding operation from the current 145859157daee6a4b49e99921832e1dde065167b317Chris Lattner // precision down to the specified precision (currently always 64->32). 14663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_ROUND, 14763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 148859157daee6a4b49e99921832e1dde065167b317Chris Lattner // FP_ROUND_INREG - This operator takes a floating point register, and 149859157daee6a4b49e99921832e1dde065167b317Chris Lattner // rounds it to a floating point value. It then promotes it and returns it 150859157daee6a4b49e99921832e1dde065167b317Chris Lattner // in a register of the same size. This operation effectively just discards 151859157daee6a4b49e99921832e1dde065167b317Chris Lattner // excess precision. The type to round down to is specified by the 152859157daee6a4b49e99921832e1dde065167b317Chris Lattner // ExtraValueType in the MVTSDNode (currently always 64->32->64). 153859157daee6a4b49e99921832e1dde065167b317Chris Lattner FP_ROUND_INREG, 154859157daee6a4b49e99921832e1dde065167b317Chris Lattner 15563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_EXTEND - Extend a smaller FP type into a larger FP type. 15663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_EXTEND, 15763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1581cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // Other operators. LOAD and STORE have token chains as their first 1591cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // operand, then the same operands as an LLVM load/store instruction. 16063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner LOAD, STORE, 16163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1621cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // EXTLOAD, SEXTLOAD, ZEXTLOAD - These three operators are instances of the 1631cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // MVTSDNode. All of these load a value from memory and extend them to a 1641cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // larger value (e.g. load a byte into a word register). All three of these 1651cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // have two operands, a chain and a pointer to load from. The extra value 1661cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // type is the source type being loaded. 1671cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // 1681cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // SEXTLOAD loads the integer operand and sign extends it to a larger 1691cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 1701cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // ZEXTLOAD loads the integer operand and zero extends it to a larger 1711cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 1721cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // EXTLOAD is used for two things: floating point extending loads, and 1731cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer extending loads where it doesn't matter what the high 1741cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // bits are set to. The code generator is allowed to codegen this 1751cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // into whichever operation is more efficient. 1761cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner EXTLOAD, SEXTLOAD, ZEXTLOAD, 1771cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 1781cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // TRUNCSTORE - This operators truncates (for integer) or rounds (for FP) a 1791cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // value and stores it to memory in one operation. This can be used for 1801cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // either integer or floating point operands, and the stored type 1811cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // represented as the 'extra' value type in the MVTSDNode representing the 1821cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // operator. This node has the same three operands as a standard store. 1831cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner TRUNCSTORE, 1841cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 18563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned 18663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to a specified boundary. The first operand is the token chain, the 18763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the number of bytes to allocate, and the third is the alignment 18863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // boundary. 18963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner DYNAMIC_STACKALLOC, 19063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 19163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Control flow instructions. These all have token chains. 19263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 19363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BR - Unconditional branch. The first operand is the chain 19463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operand, the second is the MBB to branch to. 19563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BR, 19663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 19763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BRCOND - Conditional branch. The first operand is the chain, 19863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // the second is the condition, the third is the block to branch 19963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to if the condition is true. 20063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BRCOND, 20163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 20263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // RET - Return from function. The first operand is the chain, 20363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // and any subsequent operands are the return values for the 20463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // function. This operation can have variable number of operands. 20563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner RET, 20663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 20763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CALL - Call to a function pointer. The first operand is the chain, the 20863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the destination function pointer (a GlobalAddress for a direct 20963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // call). Arguments have already been lowered to explicit DAGs according to 21063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // the calling convention in effect here. 21163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CALL, 212ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner 213ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // MEMSET/MEMCPY/MEMMOVE - The first operand is the chain, and the rest 214ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // correspond to the operands of the LLVM intrinsic functions. The only 215ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // result is a token chain. The alignment argument is guaranteed to be a 216ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // Constant node. 217ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMSET, 218ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMMOVE, 219ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMCPY, 22063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 22163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // ADJCALLSTACKDOWN/ADJCALLSTACKUP - These operators mark the beginning and 22263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // end of a call sequence and indicate how much the stack pointer needs to 22363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // be adjusted for that particular call. The first operand is a chain, the 22463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is a ConstantSDNode of intptr type. 22563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ADJCALLSTACKDOWN, // Beginning of a call sequence 22663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ADJCALLSTACKUP, // End of a call sequence 22763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 22895762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth // PCMARKER - This corrosponds to the pcmarker intrinsic. 22995762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth PCMARKER, 23063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 23163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILTIN_OP_END - This must be the last enum value in this list. 23263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILTIN_OP_END, 23363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 23463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 23563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 23663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::CondCode enum - These are ordered carefully to make the bitfields 23763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// below work out, when considering SETFALSE (something that never exists 23863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// dynamically) as 0. "U" -> Unsigned (for integer operands) or Unordered 23963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal 24063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to. If the "N" column is 1, the result of the comparison is undefined if 24163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the input is a NAN. 24263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 24363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// All of these (except for the 'always folded ops') should be handled for 24463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// floating point. For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT, 24563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used. 24663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 24763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note that these are laid out in a specific order to allow bit-twiddling 24863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to transform conditions. 24963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum CondCode { 25063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Opcode N U L G E Intuitive operation 25163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE, // 0 0 0 0 Always false (always folded) 25263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOEQ, // 0 0 0 1 True if ordered and equal 25363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGT, // 0 0 1 0 True if ordered and greater than 25463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGE, // 0 0 1 1 True if ordered and greater than or equal 25563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLT, // 0 1 0 0 True if ordered and less than 25663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLE, // 0 1 0 1 True if ordered and less than or equal 25763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETONE, // 0 1 1 0 True if ordered and operands are unequal 25863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETO, // 0 1 1 1 True if ordered (no nans) 25963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUO, // 1 0 0 0 True if unordered: isnan(X) | isnan(Y) 26063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUEQ, // 1 0 0 1 True if unordered or equal 26163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGT, // 1 0 1 0 True if unordered or greater than 26263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGE, // 1 0 1 1 True if unordered, greater than, or equal 26363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETULT, // 1 1 0 0 True if unordered or less than 26463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETULE, // 1 1 0 1 True if unordered, less than, or equal 26563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUNE, // 1 1 1 0 True if unordered or not equal 26663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE, // 1 1 1 1 Always true (always folded) 26763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Don't care operations: undefined if the input is a nan. 26863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE2, // 1 X 0 0 0 Always false (always folded) 26963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETEQ, // 1 X 0 0 1 True if equal 27063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGT, // 1 X 0 1 0 True if greater than 27163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGE, // 1 X 0 1 1 True if greater than or equal 27263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETLT, // 1 X 1 0 0 True if less than 27363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETLE, // 1 X 1 0 1 True if less than or equal 27463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETNE, // 1 X 1 1 0 True if not equal 27563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE2, // 1 X 1 1 1 Always true (always folded) 27663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 27763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC_INVALID, // Marker value. 27863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 27963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 28063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isSignedIntSetCC - Return true if this is a setcc instruction that 28163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs a signed comparison when used with integer operands. 28263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isSignedIntSetCC(CondCode Code) { 28363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE; 28463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 28563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 28663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isUnsignedIntSetCC - Return true if this is a setcc instruction that 28763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs an unsigned comparison when used with integer operands. 28863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isUnsignedIntSetCC(CondCode Code) { 28963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE; 29063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 29163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 29263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isTrueWhenEqual - Return true if the specified condition returns true if 29363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the two operands to the condition are equal. Note that if one of the two 29463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operands is a NaN, this value is meaningless. 29563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isTrueWhenEqual(CondCode Cond) { 29663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond & 1) != 0; 29763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 29863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 29963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getUnorderedFlavor - This function returns 0 if the condition is always 30063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// false if an operand is a NaN, 1 if the condition is always true if the 30163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operand is a NaN, and 2 if the condition is undefined if the operand is a 30263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// NaN. 30363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getUnorderedFlavor(CondCode Cond) { 30463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond >> 3) & 3; 30563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 30663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 30763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCInverse - Return the operation corresponding to !(X op Y), where 30863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 'op' is a valid SetCC operation. 30963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCInverse(CondCode Operation, bool isInteger); 31063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 31163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X) 31263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// when given the operation for (X op Y). 31363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCSwappedOperands(CondCode Operation); 31463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 31563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCOrOperation - Return the result of a logical OR between different 31663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This 31763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 31863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 31963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, bool isInteger); 32063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 32163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCAndOperation - Return the result of a logical AND between 32263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// different comparisons of identical values: ((X op1 Y) & (X op2 Y)). This 32363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 32463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 32563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger); 32663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm::ISD namespace 32763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 32863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 32963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 33063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperand - Unlike LLVM values, Selection DAG nodes may return multiple 33163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// values as the result of a computation. Many nodes return multiple values, 33263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// from loads (which define a token and a return value) to ADDC (which returns 33363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// a result and a carry value), to calls (which may return an arbitrary number 33463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of values). 33563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 33663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// As such, each use of a SelectionDAG computation must indicate the node that 33763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// computes it as well as which return value to use from that node. This pair 33863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of information is represented with the SDOperand value type. 33963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 340f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerclass SDOperand { 341f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerpublic: 34263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode *Val; // The node defining the value we are using. 34363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned ResNo; // Which return value of the node we are using. 34463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand() : Val(0) {} 34663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand(SDNode *val, unsigned resno) : Val(val), ResNo(resno) {} 34763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator==(const SDOperand &O) const { 34963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val == O.Val && ResNo == O.ResNo; 35063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator!=(const SDOperand &O) const { 35263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return !operator==(O); 35363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator<(const SDOperand &O) const { 35563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val < O.Val || (Val == O.Val && ResNo < O.ResNo); 35663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand getValue(unsigned R) const { 35963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return SDOperand(Val, R); 36063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 36163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the ValueType of the referenced return value. 36363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 36463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline MVT::ValueType getValueType() const; 3650442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 36663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Forwarding methods - These forward to the corresponding methods in SDNode. 36763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getOpcode() const; 3680442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner inline unsigned getNodeDepth() const; 36963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getNumOperands() const; 37063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline const SDOperand &getOperand(unsigned i) const; 371a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner 372a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// hasOneUse - Return true if there is exactly one operation using this 373a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// result value of the defining operator. 374a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner inline bool hasOneUse() const; 37563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 37663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// simplify_type specializations - Allow casting operators to work directly on 37963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperands as if they were SDNode*'s. 38063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<SDOperand> { 38163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 38263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 38363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 38463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 38563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 38663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<const SDOperand> { 38763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 38863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 38963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 39063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 39163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 39263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 39363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 39463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDNode - Represents one node in the SelectionDAG. 39563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 39663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode { 3970442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeType - The operation that this node performs. 3980442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 3990442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeType; 4000442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4010442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeDepth - Node depth is defined as MAX(Node depth of children)+1. This 4020442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// means that leaves have a depth of 1, things that use only leaves have a 4030442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// depth of 2, etc. 4040442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeDepth; 4050442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4060442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// Operands - The values that are used by this operation. 4070442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 40863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDOperand> Operands; 40963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Values - The types of the values this node defines. SDNode's may define 41163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// multiple values simultaneously. 41263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<MVT::ValueType> Values; 41363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Uses - These are all of the SDNode's that use a value produced by this 41563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// node. 41663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDNode*> Uses; 41763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 41863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 42063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Accessors 42163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // 42263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getOpcode() const { return NodeType; } 42363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 42463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner size_t use_size() const { return Uses.size(); } 42563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool use_empty() const { return Uses.empty(); } 42663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool hasOneUse() const { return Uses.size() == 1; } 42763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4280442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// getNodeDepth - Return the distance from this node to the leaves in the 4290442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// graph. The leaves have a depth of 1. 4300442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned getNodeDepth() const { return NodeDepth; } 4310442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4327ece380440238ad0630a225b85a09a2dbed1165aChris Lattner typedef std::vector<SDNode*>::const_iterator use_iterator; 4337ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_begin() const { return Uses.begin(); } 4347ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_end() const { return Uses.end(); } 4357ece380440238ad0630a225b85a09a2dbed1165aChris Lattner 436b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 437b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// indicated value. This method ignores uses of other values defined by this 438b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// operation. 439b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner bool hasNUsesOfValue(unsigned NUses, unsigned Value); 440b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner 44163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumOperands - Return the number of values used by this operation. 44263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 44363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumOperands() const { return Operands.size(); } 44463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 44563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) { 44663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 44763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 44863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 44963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) const { 45163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 45263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 45363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 45463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumValues - Return the number of values defined/returned by this 45663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operator. 45763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 45863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumValues() const { return Values.size(); } 45963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 46063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the type of a specified result. 46163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 46263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MVT::ValueType getValueType(unsigned ResNo) const { 46363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(ResNo < Values.size() && "Illegal result number!"); 46463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Values[ResNo]; 46563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 46663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4676e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// getOperationName - Return the opcode of this operation for printing. 4686e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// 4696e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner const char* getOperationName() const; 47063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void dump() const; 47163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *) { return true; } 47363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 47563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 47663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4770442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner SDNode(unsigned NT, MVT::ValueType VT) : NodeType(NT), NodeDepth(1) { 47863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 47963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 48063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 48163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand Op) 4820442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner : NodeType(NT), NodeDepth(Op.Val->getNodeDepth()+1) { 48363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(1); Operands.push_back(Op); 48463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Op.Val->Uses.push_back(this); 48563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 48663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2) 48763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 4880442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (N1.Val->getNodeDepth() > N2.Val->getNodeDepth()) 4890442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N1.Val->getNodeDepth()+1; 4900442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner else 4910442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N2.Val->getNodeDepth()+1; 49263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(2); Operands.push_back(N1); Operands.push_back(N2); 49363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 49463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 49563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3) 49663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 4970442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = N1.Val->getNodeDepth(); 4980442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N2.Val->getNodeDepth()) 4990442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N2.Val->getNodeDepth(); 5000442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N3.Val->getNodeDepth()) 5010442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N3.Val->getNodeDepth(); 5020442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 5030442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 50463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(3); Operands.push_back(N1); Operands.push_back(N2); 50563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.push_back(N3); 50663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 50763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N3.Val->Uses.push_back(this); 50863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 50963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, std::vector<SDOperand> &Nodes) : NodeType(NT) { 51063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.swap(Nodes); 5110442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = 0; 5120442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 513ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner Operands[i].Val->Uses.push_back(this); 5140442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < Operands[i].Val->getNodeDepth()) 5150442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = Operands[i].Val->getNodeDepth(); 5160442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner } 5170442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 51863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 51963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner virtual ~SDNode() { 52163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FIXME: Drop uses. 52263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 52363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT) { 52563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 52663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 52763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 52863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT1, MVT::ValueType VT2) { 52963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(2); 53063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT1); 53163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT2); 53263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 53363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note: this method destroys the vector passed in. 53463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(std::vector<MVT::ValueType> &VTs) { 53563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::swap(Values, VTs); 53663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 537d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner 538d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner void removeUser(SDNode *User) { 539d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner // Remove this user from the operand's use list. 540d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner for (unsigned i = Uses.size(); ; --i) { 541d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner assert(i != 0 && "Didn't find user!"); 542d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner if (Uses[i-1] == User) { 543d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner Uses.erase(Uses.begin()+i-1); 544d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner break; 545d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 546d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 547d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 54863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 54963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 55063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 55163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Define inline functions from the SDOperand class. 55263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 55363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getOpcode() const { 55463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOpcode(); 55563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 5560442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattnerinline unsigned SDOperand::getNodeDepth() const { 5570442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner return Val->getNodeDepth(); 5580442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner} 55963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline MVT::ValueType SDOperand::getValueType() const { 56063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getValueType(ResNo); 56163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 56263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getNumOperands() const { 56363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getNumOperands(); 56463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 56563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline const SDOperand &SDOperand::getOperand(unsigned i) const { 56663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOperand(i); 56763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 568a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattnerinline bool SDOperand::hasOneUse() const { 569a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner return Val->hasNUsesOfValue(1, ResNo); 570a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner} 57163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 57263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 57363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantSDNode : public SDNode { 57463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t Value; 57563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 57663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 57763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantSDNode(uint64_t val, MVT::ValueType VT) 57863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::Constant, VT), Value(val) { 57963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 58063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 58163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 58263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t getValue() const { return Value; } 58363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 58463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int64_t getSignExtended() const { 58563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Bits = MVT::getSizeInBits(getValueType(0)); 586f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner return ((int64_t)Value << (64-Bits)) >> (64-Bits); 58763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 58863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 58963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isNullValue() const { return Value == 0; } 59063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isAllOnesValue() const { 59163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Value == (1ULL << MVT::getSizeInBits(getValueType(0)))-1; 59263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 59363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 59463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantSDNode *) { return true; } 59563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 59663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::Constant; 59763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 59863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 59963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 60063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantFPSDNode : public SDNode { 60163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double Value; 60263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 60363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 60463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantFPSDNode(double val, MVT::ValueType VT) 60563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantFP, VT), Value(val) { 60663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 60763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 60863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 60963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double getValue() const { return Value; } 61063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 61163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isExactlyValue - We don't rely on operator== working on double values, as 61263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 61363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// As such, this method can be used to do an exact bit-for-bit comparison of 61463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// two floating point values. 61563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isExactlyValue(double V) const { 61663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 61763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 61863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 61963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T1; 62063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T1.V = Value; 62163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 62263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 62363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 62463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T2; 62563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T2.V = V; 62663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return T1.I == T2.I; 62763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 62863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 62963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantFPSDNode *) { return true; } 63063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 63163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantFP; 63263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 63363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 63463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 63563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalAddressSDNode : public SDNode { 63663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *TheGlobal; 63763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 63863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 63963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT) 64063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::GlobalAddress, VT) { 64163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TheGlobal = const_cast<GlobalValue*>(GA); 64263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 64363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 64463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 64563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *getGlobal() const { return TheGlobal; } 64663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 64763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const GlobalAddressSDNode *) { return true; } 64863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 64963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::GlobalAddress; 65063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 65163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 65263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass FrameIndexSDNode : public SDNode { 65563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int FI; 65663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 65763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 65863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FrameIndexSDNode(int fi, MVT::ValueType VT) 65963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::FrameIndex, VT), FI(fi) {} 66063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 66163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int getIndex() const { return FI; } 66363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const FrameIndexSDNode *) { return true; } 66563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 66663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::FrameIndex; 66763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 66863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 66963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 67063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantPoolSDNode : public SDNode { 67163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned CPI; 67263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 67363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 67463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT) 67563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantPool, VT), CPI(cpi) {} 67663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 67763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 67863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getIndex() const { return CPI; } 67963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantPoolSDNode *) { return true; } 68163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 68263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantPool; 68363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 68463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 68563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass BasicBlockSDNode : public SDNode { 68763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *MBB; 68863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 68963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 69063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BasicBlockSDNode(MachineBasicBlock *mbb) 69163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::BasicBlock, MVT::Other), MBB(mbb) {} 69263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 69363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *getBasicBlock() const { return MBB; } 69563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const BasicBlockSDNode *) { return true; } 69763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 69863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::BasicBlock; 69963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 70063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 70163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattnerclass RegSDNode : public SDNode { 70463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Reg; 70563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 70663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 70760e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner RegSDNode(unsigned Opc, SDOperand Chain, SDOperand Src, unsigned reg) 7081cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner : SDNode(Opc, Chain, Src), Reg(reg) { 70963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 71060e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner RegSDNode(unsigned Opc, SDOperand Chain, unsigned reg) 71160e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner : SDNode(Opc, Chain), Reg(reg) {} 71263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 71363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getReg() const { return Reg; } 71563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner static bool classof(const RegSDNode *) { return true; } 71763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 71863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::CopyToReg || 71918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner N->getOpcode() == ISD::CopyFromReg || 72018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner N->getOpcode() == ISD::ImplicitDef; 72163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 72263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 72363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 72463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ExternalSymbolSDNode : public SDNode { 72563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *Symbol; 72663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 72763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 72863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ExternalSymbolSDNode(const char *Sym, MVT::ValueType VT) 72963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ExternalSymbol, VT), Symbol(Sym) { 73063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 73163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 73263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *getSymbol() const { return Symbol; } 73463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ExternalSymbolSDNode *) { return true; } 73663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 73763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ExternalSymbol; 73863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 73963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 74063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 74163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SetCCSDNode : public SDNode { 74263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode Condition; 74363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 74463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 74563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SetCCSDNode(ISD::CondCode Cond, SDOperand LHS, SDOperand RHS) 74663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::SETCC, LHS, RHS), Condition(Cond) { 74763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 74863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 74963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode getCondition() const { return Condition; } 75163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SetCCSDNode *) { return true; } 75363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 75463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::SETCC; 75563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 75663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 75763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 7581cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner/// MVTSDNode - This class is used for operators that require an extra 7591cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner/// value-type to be kept with the node. 7601cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerclass MVTSDNode : public SDNode { 7611cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner MVT::ValueType ExtraValueType; 7621cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerprotected: 7631cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner friend class SelectionDAG; 764859157daee6a4b49e99921832e1dde065167b317Chris Lattner MVTSDNode(unsigned Opc, MVT::ValueType VT1, SDOperand Op0, MVT::ValueType EVT) 765859157daee6a4b49e99921832e1dde065167b317Chris Lattner : SDNode(Opc, Op0), ExtraValueType(EVT) { 766859157daee6a4b49e99921832e1dde065167b317Chris Lattner setValueTypes(VT1); 767859157daee6a4b49e99921832e1dde065167b317Chris Lattner } 76860e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner MVTSDNode(unsigned Opc, MVT::ValueType VT1, MVT::ValueType VT2, 7691cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner SDOperand Op0, SDOperand Op1, MVT::ValueType EVT) 7701cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner : SDNode(Opc, Op0, Op1), ExtraValueType(EVT) { 77160e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner setValueTypes(VT1, VT2); 7721cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner } 7731cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner MVTSDNode(unsigned Opc, MVT::ValueType VT, 7741cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner SDOperand Op0, SDOperand Op1, SDOperand Op2, MVT::ValueType EVT) 7751cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner : SDNode(Opc, Op0, Op1, Op2), ExtraValueType(EVT) { 7761cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner setValueTypes(VT); 7771cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner } 7781cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerpublic: 7791cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 7801cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner MVT::ValueType getExtraValueType() const { return ExtraValueType; } 7811cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 7821cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner static bool classof(const MVTSDNode *) { return true; } 7831cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner static bool classof(const SDNode *N) { 7841cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner return 785859157daee6a4b49e99921832e1dde065167b317Chris Lattner N->getOpcode() == ISD::SIGN_EXTEND_INREG || 786859157daee6a4b49e99921832e1dde065167b317Chris Lattner N->getOpcode() == ISD::ZERO_EXTEND_INREG || 787859157daee6a4b49e99921832e1dde065167b317Chris Lattner N->getOpcode() == ISD::FP_ROUND_INREG || 7881cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner N->getOpcode() == ISD::EXTLOAD || 7891cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner N->getOpcode() == ISD::SEXTLOAD || 7901cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner N->getOpcode() == ISD::ZEXTLOAD || 7911cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner N->getOpcode() == ISD::TRUNCSTORE; 7921cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner } 7931cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner}; 7941080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 7951080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerclass SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> { 7961080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNode *Node; 7971080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned Operand; 7981080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 7991080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {} 8001080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerpublic: 8011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator==(const SDNodeIterator& x) const { 8021080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Operand == x.Operand; 8031080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } 8051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNodeIterator &operator=(const SDNodeIterator &I) { 8071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner assert(I.Node == Node && "Cannot assign iterators to two different nodes!"); 8081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner Operand = I.Operand; 8091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 8101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator*() const { 8131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Node->getOperand(Operand).Val; 8141080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8151080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator->() const { return operator*(); } 8161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8171080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator& operator++() { // Preincrement 8181080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner ++Operand; 8191080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 8201080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8211080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator operator++(int) { // Postincrement 8221080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator tmp = *this; ++*this; return tmp; 8231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); } 8261080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator end (SDNode *N) { 8271080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator(N, N->getNumOperands()); 8281080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8291080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8301080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned getOperand() const { return Operand; } 8311080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNode *getNode() const { return Node; } 8321080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 8331080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8341080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SDNode*> { 8351080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNode NodeType; 8361080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNodeIterator ChildIteratorType; 8371080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline NodeType *getEntryNode(SDNode *N) { return N; } 8381080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline ChildIteratorType child_begin(NodeType *N) { 8391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::begin(N); 8401080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8411080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline ChildIteratorType child_end(NodeType *N) { 8421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::end(N); 8431080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8441080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 8451080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8471080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8481080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 84963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm namespace 85063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 85163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#endif 852