SelectionDAGNodes.h revision d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649d
163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 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. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 1063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file declares the SDNode class and derived classes, which are used to 1163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// represent the nodes and operations present in a SelectionDAG. These nodes 1263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// and operations are machine code level operations, with some similarities to 1363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the GCC RTL representation. 1463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Clients should include the SelectionDAG.h file instead of this file directly. 1663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 1863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H 2063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#define LLVM_CODEGEN_SELECTIONDAGNODES_H 2163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include "llvm/CodeGen/ValueTypes.h" 232d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth#include "llvm/Value.h" 241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 261080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/iterator" 2739931a3dbac1aa2fe2ec14f26001c8c29102940cJeff Cohen#include "llvm/Support/DataTypes.h" 2863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <cassert> 2963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <vector> 3063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace llvm { 3263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SelectionDAG; 3463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalValue; 3563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass MachineBasicBlock; 3663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode; 3763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate <typename T> struct simplify_type; 3863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// ISD namespace - This namespace contains an enum which represents all of the 4063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SelectionDAG node types and value types. 4163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 4263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace ISD { 4363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 4463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::NodeType enum - This enum defines all of the operators valid in a 4563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SelectionDAG. 4663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 4763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum NodeType { 488a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // EntryToken - This is the marker used to indicate the start of the region. 498a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner EntryToken, 508a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner 518a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Token factor - This node is takes multiple tokens as input and produces a 528a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // single token result. This is used to represent the fact that the operand 538a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // operators are independent of each other. 548a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner TokenFactor, 55ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 568a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Various leaf nodes. 578a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner Constant, ConstantFP, GlobalAddress, FrameIndex, ConstantPool, 58d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner BasicBlock, ExternalSymbol, VALUETYPE, CONDCODE, Register, 5963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 60d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // CopyToReg - This node has three operands: a chain, a register number to 61d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // set to this value, and a value. 6263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyToReg, 6363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyFromReg - This node indicates that the input value is a virtual or 6563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // physical register that is defined outside of the scope of this 6618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // SelectionDAG. The register is available from the RegSDNode object. 6763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyFromReg, 6863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // ImplicitDef - This node indicates that the specified register is 70d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // implicitly defined by some operation (e.g. its a live-in argument). The 71d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // two operands to this are the token chain coming in and the register. 72d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // The only result is the token chain going out. 7318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner ImplicitDef, 7418c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 75fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman // UNDEF - An undefined node 76fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman UNDEF, 77fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman 7863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // EXTRACT_ELEMENT - This is used to get the first or second (determined by 7963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // a Constant, which is required to be operand #1), element of the aggregate 8063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // value specified as operand #0. This is only for use before legalization, 8163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // for values that will be broken into multiple registers. 8263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner EXTRACT_ELEMENT, 8363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways. Given 8563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // two values of the same integer value type, this produces a value twice as 8663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // big. Like EXTRACT_ELEMENT, this can only be used before legalization. 8763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILD_PAIR, 8863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Simple binary arithmetic operators. 91bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner ADD, SUB, MUL, SDIV, UDIV, SREM, UREM, 92bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner 93bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing 94bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // an unsigned/signed value of type i[2*n], then return the top part. 95bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner MULHU, MULHS, 9663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Bitwise operators. 9863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner AND, OR, XOR, SHL, SRA, SRL, 9963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 100691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // Counting operators 101691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth CTTZ, CTLZ, CTPOP, 102691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 1039373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // Select 1049373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman SELECT, 1059373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman 1069373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // Select with condition operator - This selects between a true value and 1079373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // a false value (ops #2 and #3) based on the boolean result of comparing 1089373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // the lhs and rhs (ops #0 and #1) of a conditional expression with the 1099373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // condition code in op #4, a CondCodeSDNode. 1109373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman SELECT_CC, 11163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 11263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCC operator - This evaluates to a boolean (i1) true value if the 1137cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // condition is true. The operands to this are the left and right operands 1147cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // to compare (ops #0, and #1) and the condition code to compare them with 1157cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // (op #2) as a CondCodeSDNode. 11663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC, 11763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1185880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // ADD_PARTS/SUB_PARTS - These operators take two logical operands which are 1195880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // broken into a multiple pieces each, and return the resulting pieces of 1205880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // doing an atomic add/sub operation. This is used to handle add/sub of 1215880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // expanded types. The operation ordering is: 1225880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], [LoRHS,HiRHS] 1235880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner ADD_PARTS, SUB_PARTS, 12463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 12514c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded 12614c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // integer shift operations, just like ADD/SUB_PARTS. The operation 12714c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // ordering is: 1286b8f2d649c1e96e0222be9de1e5d6c79e3eef021Chris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], Amt 12914c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner SHL_PARTS, SRA_PARTS, SRL_PARTS, 13014c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner 13163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Conversion operators. These are all single input single output 13263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operations. For all of these, the result type must be strictly 13363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // wider or narrower (depending on the operation) than the source 13463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // type. 13563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 13663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SIGN_EXTEND - Used for integer types, replicating the sign bit 13763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // into new bits. 13863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SIGN_EXTEND, 13963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // ZERO_EXTEND - Used for integer types, zeroing the new bits. 14163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ZERO_EXTEND, 14263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // TRUNCATE - Completely drop the high bits. 14463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TRUNCATE, 14563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1461645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // [SU]INT_TO_FP - These operators convert integers (whose interpreted sign 1471645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // depends on the first letter) to floating point. 1481645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner SINT_TO_FP, 1491645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner UINT_TO_FP, 1501645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 151ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to 152ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // sign extend a small value in a large integer register (e.g. sign 153ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // extending the low 8 bits of a 32-bit register to fill the top 24 bits 15415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // with the 7th bit). The size of the smaller type is indicated by the 1th 15515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operand, a ValueType node. 156859157daee6a4b49e99921832e1dde065167b317Chris Lattner SIGN_EXTEND_INREG, 157859157daee6a4b49e99921832e1dde065167b317Chris Lattner 1581645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // FP_TO_[US]INT - Convert a floating point value to a signed or unsigned 1591645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // integer. 1601645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_SINT, 1611645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_UINT, 1621645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 16363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_ROUND - Perform a rounding operation from the current 164859157daee6a4b49e99921832e1dde065167b317Chris Lattner // precision down to the specified precision (currently always 64->32). 16563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_ROUND, 16663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 167859157daee6a4b49e99921832e1dde065167b317Chris Lattner // FP_ROUND_INREG - This operator takes a floating point register, and 168859157daee6a4b49e99921832e1dde065167b317Chris Lattner // rounds it to a floating point value. It then promotes it and returns it 169859157daee6a4b49e99921832e1dde065167b317Chris Lattner // in a register of the same size. This operation effectively just discards 17015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // excess precision. The type to round down to is specified by the 1th 17115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operation, a VTSDNode (currently always 64->32->64). 172859157daee6a4b49e99921832e1dde065167b317Chris Lattner FP_ROUND_INREG, 173859157daee6a4b49e99921832e1dde065167b317Chris Lattner 17463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_EXTEND - Extend a smaller FP type into a larger FP type. 17563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_EXTEND, 17663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1777f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // FNEG, FABS, FSQRT, FSIN, FCOS - Perform unary floating point negation, 1787f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // absolute value, square root, sine and cosine operations. 1797f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner FNEG, FABS, FSQRT, FSIN, FCOS, 1807366fd39727180a3261dd99e3797f89979d74e66Chris Lattner 1811cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // Other operators. LOAD and STORE have token chains as their first 182f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // operand, then the same operands as an LLVM load/store instruction, then a 183f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // SRCVALUE node that provides alias analysis information. 18463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner LOAD, STORE, 18563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1865f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // EXTLOAD, SEXTLOAD, ZEXTLOAD - These three operators all load a value from 1875f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // memory and extend them to a larger value (e.g. load a byte into a word 1885f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // register). All three of these have four operands, a token chain, a 1895f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // pointer to load from, a SRCVALUE for alias analysis, and a VALUETYPE node 1905f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // indicating the type to load. 1911cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // 1921cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // SEXTLOAD loads the integer operand and sign extends it to a larger 1931cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 1941cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // ZEXTLOAD loads the integer operand and zero extends it to a larger 1951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 196ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman // EXTLOAD is used for two things: floating point extending loads, and 1971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer extending loads where it doesn't matter what the high 1981cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // bits are set to. The code generator is allowed to codegen this 1991cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // into whichever operation is more efficient. 2001cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner EXTLOAD, SEXTLOAD, ZEXTLOAD, 2011cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 2021cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // TRUNCSTORE - This operators truncates (for integer) or rounds (for FP) a 2031cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // value and stores it to memory in one operation. This can be used for 204f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // either integer or floating point operands. The first four operands of 205f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // this are the same as a standard store. The fifth is the ValueType to 206f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // store it as (which will be smaller than the source value). 2071cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner TRUNCSTORE, 2081cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 20963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned 21063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to a specified boundary. The first operand is the token chain, the 21163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the number of bytes to allocate, and the third is the alignment 21263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // boundary. 21363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner DYNAMIC_STACKALLOC, 21463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 21563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Control flow instructions. These all have token chains. 216ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 21763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BR - Unconditional branch. The first operand is the chain 21863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operand, the second is the MBB to branch to. 21963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BR, 22063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 22163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BRCOND - Conditional branch. The first operand is the chain, 22263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // the second is the condition, the third is the block to branch 22363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to if the condition is true. 22463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BRCOND, 22563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2261df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // BRCONDTWOWAY - Two-way conditional branch. The first operand is the 2271df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // chain, the second is the condition, the third is the block to branch to 2281df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // if true, and the forth is the block to branch to if false. Targets 2291df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // usually do not implement this, preferring to have legalize demote the 2301df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // operation to BRCOND/BR pairs when necessary. 2311df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner BRCONDTWOWAY, 2321df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner 2337cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // BR_CC - Conditional branch. The behavior is like that of SELECT_CC, in 2347cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // that the condition is represented as condition code, and two nodes to 2357cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // compare, rather than as a combined SetCC node. The operands in order are 2367cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // chain, cc, lhs, rhs, block to branch to if condition is true. 2377cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman BR_CC, 2387cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 2397cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // BRTWOWAY_CC - Two-way conditional branch. The operands in order are 2407cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // chain, cc, lhs, rhs, block to branch to if condition is true, block to 2417cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // branch to if condition is false. Targets usually do not implement this, 2427cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // preferring to have legalize demote the operation to BRCOND/BR pairs. 2437cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman BRTWOWAY_CC, 2447cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 24563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // RET - Return from function. The first operand is the chain, 24663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // and any subsequent operands are the return values for the 24763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // function. This operation can have variable number of operands. 24863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner RET, 24963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 25063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CALL - Call to a function pointer. The first operand is the chain, the 25163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the destination function pointer (a GlobalAddress for a direct 25263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // call). Arguments have already been lowered to explicit DAGs according to 2534c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the calling convention in effect here. TAILCALL is the same as CALL, but 2544c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the callee is known not to access the stack of the caller. 25563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CALL, 2564c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner TAILCALL, 257ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner 258ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // MEMSET/MEMCPY/MEMMOVE - The first operand is the chain, and the rest 259ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // correspond to the operands of the LLVM intrinsic functions. The only 260ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // result is a token chain. The alignment argument is guaranteed to be a 261ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // Constant node. 262ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMSET, 263ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMMOVE, 264ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMCPY, 265ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 26616cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of 26716cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // a call sequence, and carry arbitrary information that target might want 26816cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // to know. The first operand is a chain, the rest are specified by the 26916cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // target and not touched by the DAG optimizers. 27016cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_START, // Beginning of a call sequence 27116cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_END, // End of a call sequence 27263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 27321074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // SRCVALUE - This corresponds to a Value*, and is used to associate memory 27421074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // locations with their value. This allows one use alias analysis 27521074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // information in the backend. 27621074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner SRCVALUE, 27721074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner 278e3f570c3f9048bc71a9f5841343eae63719e439bMisha Brukman // PCMARKER - This corresponds to the pcmarker intrinsic. 27995762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth PCMARKER, 28063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 28121074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // READPORT, WRITEPORT, READIO, WRITEIO - These correspond to the LLVM 28221074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // intrinsics of the same name. The first operand is a token chain, the 28321074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // other operands match the intrinsic. These produce a token chain in 28421074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // addition to a value (if any). 28521074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner READPORT, WRITEPORT, READIO, WRITEIO, 2862d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 28763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILTIN_OP_END - This must be the last enum value in this list. 28863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILTIN_OP_END, 28963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 29063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 29163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 29263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::CondCode enum - These are ordered carefully to make the bitfields 29363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// below work out, when considering SETFALSE (something that never exists 29463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// dynamically) as 0. "U" -> Unsigned (for integer operands) or Unordered 29563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal 29663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to. If the "N" column is 1, the result of the comparison is undefined if 29763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the input is a NAN. 29863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 29963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// All of these (except for the 'always folded ops') should be handled for 30063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// floating point. For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT, 30163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used. 30263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 30363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note that these are laid out in a specific order to allow bit-twiddling 30463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to transform conditions. 30563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum CondCode { 30663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Opcode N U L G E Intuitive operation 30763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE, // 0 0 0 0 Always false (always folded) 30863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOEQ, // 0 0 0 1 True if ordered and equal 30963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGT, // 0 0 1 0 True if ordered and greater than 31063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGE, // 0 0 1 1 True if ordered and greater than or equal 31163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLT, // 0 1 0 0 True if ordered and less than 31263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLE, // 0 1 0 1 True if ordered and less than or equal 31363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETONE, // 0 1 1 0 True if ordered and operands are unequal 31463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETO, // 0 1 1 1 True if ordered (no nans) 31563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUO, // 1 0 0 0 True if unordered: isnan(X) | isnan(Y) 31663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUEQ, // 1 0 0 1 True if unordered or equal 31763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGT, // 1 0 1 0 True if unordered or greater than 31863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGE, // 1 0 1 1 True if unordered, greater than, or equal 31963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETULT, // 1 1 0 0 True if unordered or less than 320ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETULE, // 1 1 0 1 True if unordered, less than, or equal 32163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUNE, // 1 1 1 0 True if unordered or not equal 32263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE, // 1 1 1 1 Always true (always folded) 32363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Don't care operations: undefined if the input is a nan. 32463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE2, // 1 X 0 0 0 Always false (always folded) 32563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETEQ, // 1 X 0 0 1 True if equal 32663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGT, // 1 X 0 1 0 True if greater than 32763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGE, // 1 X 0 1 1 True if greater than or equal 32863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETLT, // 1 X 1 0 0 True if less than 329ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETLE, // 1 X 1 0 1 True if less than or equal 33063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETNE, // 1 X 1 1 0 True if not equal 33163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE2, // 1 X 1 1 1 Always true (always folded) 33263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 33363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC_INVALID, // Marker value. 33463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 33563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 33663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isSignedIntSetCC - Return true if this is a setcc instruction that 33763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs a signed comparison when used with integer operands. 33863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isSignedIntSetCC(CondCode Code) { 33963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE; 34063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 34163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isUnsignedIntSetCC - Return true if this is a setcc instruction that 34363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs an unsigned comparison when used with integer operands. 34463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isUnsignedIntSetCC(CondCode Code) { 34563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE; 34663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 34763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isTrueWhenEqual - Return true if the specified condition returns true if 34963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the two operands to the condition are equal. Note that if one of the two 35063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operands is a NaN, this value is meaningless. 35163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isTrueWhenEqual(CondCode Cond) { 35263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond & 1) != 0; 35363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getUnorderedFlavor - This function returns 0 if the condition is always 35663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// false if an operand is a NaN, 1 if the condition is always true if the 35763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operand is a NaN, and 2 if the condition is undefined if the operand is a 35863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// NaN. 35963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getUnorderedFlavor(CondCode Cond) { 36063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond >> 3) & 3; 36163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 36263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCInverse - Return the operation corresponding to !(X op Y), where 36463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 'op' is a valid SetCC operation. 36563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCInverse(CondCode Operation, bool isInteger); 36663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X) 36863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// when given the operation for (X op Y). 36963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCSwappedOperands(CondCode Operation); 37063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCOrOperation - Return the result of a logical OR between different 37263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This 37363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 37463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 37563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, bool isInteger); 37663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCAndOperation - Return the result of a logical AND between 37863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// different comparisons of identical values: ((X op1 Y) & (X op2 Y)). This 37963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 38063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 38163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger); 38263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm::ISD namespace 38363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 38663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperand - Unlike LLVM values, Selection DAG nodes may return multiple 38763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// values as the result of a computation. Many nodes return multiple values, 38863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// from loads (which define a token and a return value) to ADDC (which returns 38963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// a result and a carry value), to calls (which may return an arbitrary number 39063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of values). 39163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 39263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// As such, each use of a SelectionDAG computation must indicate the node that 39363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// computes it as well as which return value to use from that node. This pair 39463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of information is represented with the SDOperand value type. 39563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 396f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerclass SDOperand { 397f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerpublic: 39863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode *Val; // The node defining the value we are using. 39963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned ResNo; // Which return value of the node we are using. 40063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 40163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand() : Val(0) {} 40263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand(SDNode *val, unsigned resno) : Val(val), ResNo(resno) {} 40363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 40463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator==(const SDOperand &O) const { 40563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val == O.Val && ResNo == O.ResNo; 40663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 40763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator!=(const SDOperand &O) const { 40863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return !operator==(O); 40963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator<(const SDOperand &O) const { 41163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val < O.Val || (Val == O.Val && ResNo < O.ResNo); 41263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand getValue(unsigned R) const { 41563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return SDOperand(Val, R); 41663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the ValueType of the referenced return value. 41963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 42063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline MVT::ValueType getValueType() const; 421ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 42263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Forwarding methods - These forward to the corresponding methods in SDNode. 42363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getOpcode() const; 4240442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner inline unsigned getNodeDepth() const; 42563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getNumOperands() const; 42663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline const SDOperand &getOperand(unsigned i) const; 427a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner 428a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// hasOneUse - Return true if there is exactly one operation using this 429a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// result value of the defining operator. 430a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner inline bool hasOneUse() const; 43163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 43263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// simplify_type specializations - Allow casting operators to work directly on 43563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperands as if they were SDNode*'s. 43663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<SDOperand> { 43763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 43863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 43963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 44063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 44163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 44263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<const SDOperand> { 44363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 44463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 44563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 44663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 44763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 44863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 44963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDNode - Represents one node in the SelectionDAG. 45163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 45263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode { 4530442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeType - The operation that this node performs. 4540442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 4550442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeType; 4560442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4570442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeDepth - Node depth is defined as MAX(Node depth of children)+1. This 4580442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// means that leaves have a depth of 1, things that use only leaves have a 4590442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// depth of 2, etc. 4600442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeDepth; 4610442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4620442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// Operands - The values that are used by this operation. 4630442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 46463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDOperand> Operands; 46563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 46663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Values - The types of the values this node defines. SDNode's may define 46763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// multiple values simultaneously. 46863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<MVT::ValueType> Values; 46963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Uses - These are all of the SDNode's that use a value produced by this 47163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// node. 47263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDNode*> Uses; 47363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 47463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 47663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Accessors 47763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // 47863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getOpcode() const { return NodeType; } 47963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 48063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner size_t use_size() const { return Uses.size(); } 48163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool use_empty() const { return Uses.empty(); } 48263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool hasOneUse() const { return Uses.size() == 1; } 48363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4840442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// getNodeDepth - Return the distance from this node to the leaves in the 4850442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// graph. The leaves have a depth of 1. 4860442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned getNodeDepth() const { return NodeDepth; } 4870442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4887ece380440238ad0630a225b85a09a2dbed1165aChris Lattner typedef std::vector<SDNode*>::const_iterator use_iterator; 4897ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_begin() const { return Uses.begin(); } 4907ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_end() const { return Uses.end(); } 4917ece380440238ad0630a225b85a09a2dbed1165aChris Lattner 492b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 493b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// indicated value. This method ignores uses of other values defined by this 494b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// operation. 495b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner bool hasNUsesOfValue(unsigned NUses, unsigned Value); 496b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner 49763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumOperands - Return the number of values used by this operation. 49863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 49963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumOperands() const { return Operands.size(); } 50063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 50163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) { 50263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 50363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 50463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 50563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 50663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) const { 50763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 50863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 50963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 51050f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<SDOperand>::const_iterator op_iterator; 51150f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_begin() const { return Operands.begin(); } 51250f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_end() const { return Operands.end(); } 51350f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner 51463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 51563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumValues - Return the number of values defined/returned by this 51663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operator. 51763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 51863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumValues() const { return Values.size(); } 51963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the type of a specified result. 52163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 52263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MVT::ValueType getValueType(unsigned ResNo) const { 52363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(ResNo < Values.size() && "Illegal result number!"); 52463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Values[ResNo]; 52563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 5269eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 52750f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<MVT::ValueType>::const_iterator value_iterator; 52850f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_begin() const { return Values.begin(); } 52950f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_end() const { return Values.end(); } 53063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5316e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// getOperationName - Return the opcode of this operation for printing. 5326e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// 533efe58694050e48b61584b8454434dcd1ad886a71Chris Lattner const char* getOperationName(const SelectionDAG *G = 0) const; 53463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void dump() const; 535efe58694050e48b61584b8454434dcd1ad886a71Chris Lattner void dump(const SelectionDAG *G) const; 53663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 53763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *) { return true; } 53863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 53973b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner 54073b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner /// setAdjCallChain - This method should only be used by the legalizer. 54173b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner void setAdjCallChain(SDOperand N); 5429eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 54363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 54463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 54563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5460442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner SDNode(unsigned NT, MVT::ValueType VT) : NodeType(NT), NodeDepth(1) { 54763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 54863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 54963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 55063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand Op) 5510442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner : NodeType(NT), NodeDepth(Op.Val->getNodeDepth()+1) { 55263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(1); Operands.push_back(Op); 55363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Op.Val->Uses.push_back(this); 55463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 55563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2) 55663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5570442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (N1.Val->getNodeDepth() > N2.Val->getNodeDepth()) 5580442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N1.Val->getNodeDepth()+1; 5590442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner else 5600442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N2.Val->getNodeDepth()+1; 56163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(2); Operands.push_back(N1); Operands.push_back(N2); 56263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 56363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 56463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3) 56563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5660442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = N1.Val->getNodeDepth(); 5670442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N2.Val->getNodeDepth()) 5680442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N2.Val->getNodeDepth(); 5690442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N3.Val->getNodeDepth()) 5700442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N3.Val->getNodeDepth(); 5710442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 5720442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 57363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(3); Operands.push_back(N1); Operands.push_back(N2); 57463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.push_back(N3); 57563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 57663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N3.Val->Uses.push_back(this); 57763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 5782d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4) 5792d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth : NodeType(NT) { 5802d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth unsigned ND = N1.Val->getNodeDepth(); 5812d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N2.Val->getNodeDepth()) 5822d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N2.Val->getNodeDepth(); 5832d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N3.Val->getNodeDepth()) 5842d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N3.Val->getNodeDepth(); 5852d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N4.Val->getNodeDepth()) 5862d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N4.Val->getNodeDepth(); 5872d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth NodeDepth = ND+1; 5882d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 589691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth Operands.reserve(4); Operands.push_back(N1); Operands.push_back(N2); 5902d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth Operands.push_back(N3); Operands.push_back(N4); 5912d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 5922d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N3.Val->Uses.push_back(this); N4.Val->Uses.push_back(this); 5932d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 59463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, std::vector<SDOperand> &Nodes) : NodeType(NT) { 59563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.swap(Nodes); 5960442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = 0; 5970442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 598ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner Operands[i].Val->Uses.push_back(this); 5990442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < Operands[i].Val->getNodeDepth()) 6000442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = Operands[i].Val->getNodeDepth(); 6010442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner } 6020442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 60363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 60463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6051b95095857b78e12138c22e76c7936611c51355bChris Lattner virtual ~SDNode() {} 6061b95095857b78e12138c22e76c7936611c51355bChris Lattner 6071b95095857b78e12138c22e76c7936611c51355bChris Lattner /// MorphNodeTo - This clears the return value and operands list, and sets the 6081b95095857b78e12138c22e76c7936611c51355bChris Lattner /// opcode of the node to the specified value. This should only be used by 6091b95095857b78e12138c22e76c7936611c51355bChris Lattner /// the SelectionDAG class. 6101b95095857b78e12138c22e76c7936611c51355bChris Lattner void MorphNodeTo(unsigned Opc) { 6111b95095857b78e12138c22e76c7936611c51355bChris Lattner NodeType = Opc; 6121b95095857b78e12138c22e76c7936611c51355bChris Lattner Values.clear(); 6131b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.clear(); 61463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 6151b95095857b78e12138c22e76c7936611c51355bChris Lattner 61663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT) { 61763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 61863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 61963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 62063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT1, MVT::ValueType VT2) { 62163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(2); 62263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT1); 62363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT2); 62463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 62563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note: this method destroys the vector passed in. 62663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(std::vector<MVT::ValueType> &VTs) { 62763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::swap(Values, VTs); 62863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 6291b95095857b78e12138c22e76c7936611c51355bChris Lattner 6301b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0) { 6311b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(1); 6321b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6331b95095857b78e12138c22e76c7936611c51355bChris Lattner } 6341b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0, SDOperand Op1) { 6351b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(2); 6361b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6371b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op1); 6381b95095857b78e12138c22e76c7936611c51355bChris Lattner } 6391b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0, SDOperand Op1, SDOperand Op2) { 6401b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(3); 6411b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6421b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op1); 6431b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op2); 6441b95095857b78e12138c22e76c7936611c51355bChris Lattner } 645d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner void removeUser(SDNode *User) { 646d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner // Remove this user from the operand's use list. 647d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner for (unsigned i = Uses.size(); ; --i) { 648d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner assert(i != 0 && "Didn't find user!"); 649d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner if (Uses[i-1] == User) { 650d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner Uses.erase(Uses.begin()+i-1); 651d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner break; 652d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 653d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 654d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 65563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 65663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Define inline functions from the SDOperand class. 65963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getOpcode() const { 66163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOpcode(); 66263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 6630442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattnerinline unsigned SDOperand::getNodeDepth() const { 6640442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner return Val->getNodeDepth(); 6650442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner} 66663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline MVT::ValueType SDOperand::getValueType() const { 66763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getValueType(ResNo); 66863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 66963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getNumOperands() const { 67063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getNumOperands(); 67163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 67263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline const SDOperand &SDOperand::getOperand(unsigned i) const { 67363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOperand(i); 67463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 675a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattnerinline bool SDOperand::hasOneUse() const { 676a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner return Val->hasNUsesOfValue(1, ResNo); 677a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner} 67863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 67963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantSDNode : public SDNode { 68163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t Value; 68263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 68363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 68463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantSDNode(uint64_t val, MVT::ValueType VT) 68563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::Constant, VT), Value(val) { 68663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 68763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 68863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t getValue() const { return Value; } 69063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int64_t getSignExtended() const { 69263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Bits = MVT::getSizeInBits(getValueType(0)); 693f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner return ((int64_t)Value << (64-Bits)) >> (64-Bits); 69463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 69563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isNullValue() const { return Value == 0; } 69763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isAllOnesValue() const { 6982bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner int NumBits = MVT::getSizeInBits(getValueType(0)); 6992bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner if (NumBits == 64) return Value+1 == 0; 7002bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner return Value == (1ULL << NumBits)-1; 70163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 70263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantSDNode *) { return true; } 70463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 70563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::Constant; 70663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 70763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 70863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantFPSDNode : public SDNode { 71063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double Value; 71163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 71263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 71363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantFPSDNode(double val, MVT::ValueType VT) 71463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantFP, VT), Value(val) { 71563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 71663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 71763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double getValue() const { return Value; } 71963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 72063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isExactlyValue - We don't rely on operator== working on double values, as 72163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 72263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// As such, this method can be used to do an exact bit-for-bit comparison of 72363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// two floating point values. 72463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isExactlyValue(double V) const { 72563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 72663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 72763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 72863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T1; 72963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T1.V = Value; 73063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 73163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 73263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 73363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T2; 73463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T2.V = V; 73563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return T1.I == T2.I; 73663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 73763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantFPSDNode *) { return true; } 73963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 74063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantFP; 74163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 74263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 74363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 74463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalAddressSDNode : public SDNode { 74563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *TheGlobal; 74663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 74763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 74863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT) 74963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::GlobalAddress, VT) { 75063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TheGlobal = const_cast<GlobalValue*>(GA); 75163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 75263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 75363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *getGlobal() const { return TheGlobal; } 75563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const GlobalAddressSDNode *) { return true; } 75763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 75863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::GlobalAddress; 75963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 76063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 76163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass FrameIndexSDNode : public SDNode { 76463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int FI; 76563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 76663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 76763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FrameIndexSDNode(int fi, MVT::ValueType VT) 76863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::FrameIndex, VT), FI(fi) {} 76963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 77063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 77163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int getIndex() const { return FI; } 77263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 77363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const FrameIndexSDNode *) { return true; } 77463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 77563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::FrameIndex; 77663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 77763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 77863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 77963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantPoolSDNode : public SDNode { 78063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned CPI; 78163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 78263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 78363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT) 78463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantPool, VT), CPI(cpi) {} 78563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 78663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 78763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getIndex() const { return CPI; } 78863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 78963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantPoolSDNode *) { return true; } 79063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 79163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantPool; 79263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 79363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 79463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 79563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass BasicBlockSDNode : public SDNode { 79663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *MBB; 79763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 79863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 79963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BasicBlockSDNode(MachineBasicBlock *mbb) 80063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::BasicBlock, MVT::Other), MBB(mbb) {} 80163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 80263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *getBasicBlock() const { return MBB; } 80463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const BasicBlockSDNode *) { return true; } 80663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 80763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::BasicBlock; 80863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 80963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 81063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8112d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthclass SrcValueSDNode : public SDNode { 8122d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *V; 813691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int offset; 8142d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthprotected: 8152d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth friend class SelectionDAG; 816691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth SrcValueSDNode(const Value* v, int o) 817691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth : SDNode(ISD::SRCVALUE, MVT::Other), V(v), offset(o) {} 8182d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 8192d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthpublic: 8202d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *getValue() const { return V; } 821691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int getOffset() const { return offset; } 8222d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 8232d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SrcValueSDNode *) { return true; } 8242d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SDNode *N) { 8252d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth return N->getOpcode() == ISD::SRCVALUE; 8262d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 8272d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth}; 8282d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 82963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 830d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattnerclass RegisterSDNode : public SDNode { 83163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Reg; 83263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 83363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 834d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner RegisterSDNode(unsigned reg, MVT::ValueType VT) 835d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner : SDNode(ISD::Register, VT), Reg(reg) {} 83663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 83763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 83863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getReg() const { return Reg; } 83963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 840d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner static bool classof(const RegisterSDNode *) { return true; } 84163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 842d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner return N->getOpcode() == ISD::Register; 84363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 84463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 84563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 84663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ExternalSymbolSDNode : public SDNode { 84763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *Symbol; 84863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 84963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 85063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ExternalSymbolSDNode(const char *Sym, MVT::ValueType VT) 85163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ExternalSymbol, VT), Symbol(Sym) { 85263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 85363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 85463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 85563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *getSymbol() const { return Symbol; } 85663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 85763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ExternalSymbolSDNode *) { return true; } 85863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 85963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ExternalSymbol; 86063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 86163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 86263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8637cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattnerclass CondCodeSDNode : public SDNode { 86463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode Condition; 86563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 86663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 8677cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner CondCodeSDNode(ISD::CondCode Cond) 8687cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner : SDNode(ISD::CONDCODE, MVT::Other), Condition(Cond) { 86963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 87063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 87163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8727cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner ISD::CondCode get() const { return Condition; } 87363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8747cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner static bool classof(const CondCodeSDNode *) { return true; } 87563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 8767cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner return N->getOpcode() == ISD::CONDCODE; 87763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 87863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 87963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 88015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// VTSDNode - This class is used to represent MVT::ValueType's, which are used 88115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// to parameterize some operations. 88215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerclass VTSDNode : public SDNode { 88315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType ValueType; 88415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerprotected: 88515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner friend class SelectionDAG; 88615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner VTSDNode(MVT::ValueType VT) 88715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner : SDNode(ISD::VALUETYPE, MVT::Other), ValueType(VT) {} 88815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerpublic: 88915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 89015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType getVT() const { return ValueType; } 89115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 89215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const VTSDNode *) { return true; } 89315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const SDNode *N) { 89415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner return N->getOpcode() == ISD::VALUETYPE; 89515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner } 89615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner}; 89715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 89815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 8991080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerclass SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> { 9001080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNode *Node; 9011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned Operand; 902ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9031080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {} 9041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerpublic: 9051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator==(const SDNodeIterator& x) const { 9061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Operand == x.Operand; 9071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } 9091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNodeIterator &operator=(const SDNodeIterator &I) { 9111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner assert(I.Node == Node && "Cannot assign iterators to two different nodes!"); 9121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner Operand = I.Operand; 9131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9141080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 915ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator*() const { 9171080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Node->getOperand(Operand).Val; 9181080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9191080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator->() const { return operator*(); } 920ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9211080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator& operator++() { // Preincrement 9221080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner ++Operand; 9231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator operator++(int) { // Postincrement 926ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SDNodeIterator tmp = *this; ++*this; return tmp; 9271080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9281080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9291080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); } 9301080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator end (SDNode *N) { 9311080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator(N, N->getNumOperands()); 9321080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9331080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9341080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned getOperand() const { return Operand; } 9351080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNode *getNode() const { return Node; } 9361080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9371080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9381080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SDNode*> { 9391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNode NodeType; 9401080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNodeIterator ChildIteratorType; 9411080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline NodeType *getEntryNode(SDNode *N) { return N; } 942ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_begin(NodeType *N) { 9431080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::begin(N); 9441080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 945ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_end(NodeType *N) { 9461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::end(N); 9471080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9481080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9491080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 95063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm namespace 95163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 95263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#endif 953