SelectionDAGNodes.h revision f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dc
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, 5815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner BasicBlock, ExternalSymbol, VALUETYPE, 5963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyToReg - This node has chain and child nodes, and an associated 6163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // register number. The instruction selector must guarantee that the value 6218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // of the value node is available in the register stored in the RegSDNode 6318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // object. 6463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyToReg, 6563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyFromReg - This node indicates that the input value is a virtual or 6763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // physical register that is defined outside of the scope of this 6818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // SelectionDAG. The register is available from the RegSDNode object. 6963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyFromReg, 7063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 7118c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // ImplicitDef - This node indicates that the specified register is 7218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // implicitly defined by some operation (e.g. its a live-in argument). This 7318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // register is indicated in the RegSDNode object. The only operand to this 7418c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // is the token chain coming in, the only result is the token chain going 7518c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // out. 7618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner ImplicitDef, 7718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 78fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman // UNDEF - An undefined node 79fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman UNDEF, 80fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman 8163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // EXTRACT_ELEMENT - This is used to get the first or second (determined by 8263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // a Constant, which is required to be operand #1), element of the aggregate 8363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // value specified as operand #0. This is only for use before legalization, 8463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // for values that will be broken into multiple registers. 8563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner EXTRACT_ELEMENT, 8663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways. Given 8863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // two values of the same integer value type, this produces a value twice as 8963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // big. Like EXTRACT_ELEMENT, this can only be used before legalization. 9063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILD_PAIR, 9163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Simple binary arithmetic operators. 94bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner ADD, SUB, MUL, SDIV, UDIV, SREM, UREM, 95bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner 96bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing 97bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // an unsigned/signed value of type i[2*n], then return the top part. 98bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner MULHU, MULHS, 9963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 10063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Bitwise operators. 10163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner AND, OR, XOR, SHL, SRA, SRL, 10263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 103691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // Counting operators 104691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth CTTZ, CTLZ, CTPOP, 105691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 10663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Select operator. 10763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SELECT, 10863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 10963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCC operator - This evaluates to a boolean (i1) true value if the 11063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // condition is true. These nodes are instances of the 11163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCCSDNode class, which contains the condition code as extra 11263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // state. 11363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC, 11463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1155880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // ADD_PARTS/SUB_PARTS - These operators take two logical operands which are 1165880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // broken into a multiple pieces each, and return the resulting pieces of 1175880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // doing an atomic add/sub operation. This is used to handle add/sub of 1185880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // expanded types. The operation ordering is: 1195880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], [LoRHS,HiRHS] 1205880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner ADD_PARTS, SUB_PARTS, 12163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 12214c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded 12314c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // integer shift operations, just like ADD/SUB_PARTS. The operation 12414c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // ordering is: 1256b8f2d649c1e96e0222be9de1e5d6c79e3eef021Chris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], Amt 12614c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner SHL_PARTS, SRA_PARTS, SRL_PARTS, 12714c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner 12863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Conversion operators. These are all single input single output 12963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operations. For all of these, the result type must be strictly 13063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // wider or narrower (depending on the operation) than the source 13163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // type. 13263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 13363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SIGN_EXTEND - Used for integer types, replicating the sign bit 13463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // into new bits. 13563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SIGN_EXTEND, 13663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 13763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // ZERO_EXTEND - Used for integer types, zeroing the new bits. 13863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ZERO_EXTEND, 13963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // TRUNCATE - Completely drop the high bits. 14163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TRUNCATE, 14263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1431645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // [SU]INT_TO_FP - These operators convert integers (whose interpreted sign 1441645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // depends on the first letter) to floating point. 1451645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner SINT_TO_FP, 1461645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner UINT_TO_FP, 1471645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 148ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to 149ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // sign extend a small value in a large integer register (e.g. sign 150ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // extending the low 8 bits of a 32-bit register to fill the top 24 bits 15115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // with the 7th bit). The size of the smaller type is indicated by the 1th 15215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operand, a ValueType node. 153859157daee6a4b49e99921832e1dde065167b317Chris Lattner SIGN_EXTEND_INREG, 154859157daee6a4b49e99921832e1dde065167b317Chris Lattner 1551645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // FP_TO_[US]INT - Convert a floating point value to a signed or unsigned 1561645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // integer. 1571645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_SINT, 1581645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_UINT, 1591645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 16063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_ROUND - Perform a rounding operation from the current 161859157daee6a4b49e99921832e1dde065167b317Chris Lattner // precision down to the specified precision (currently always 64->32). 16263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_ROUND, 16363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 164859157daee6a4b49e99921832e1dde065167b317Chris Lattner // FP_ROUND_INREG - This operator takes a floating point register, and 165859157daee6a4b49e99921832e1dde065167b317Chris Lattner // rounds it to a floating point value. It then promotes it and returns it 166859157daee6a4b49e99921832e1dde065167b317Chris Lattner // in a register of the same size. This operation effectively just discards 16715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // excess precision. The type to round down to is specified by the 1th 16815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operation, a VTSDNode (currently always 64->32->64). 169859157daee6a4b49e99921832e1dde065167b317Chris Lattner FP_ROUND_INREG, 170859157daee6a4b49e99921832e1dde065167b317Chris Lattner 17163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_EXTEND - Extend a smaller FP type into a larger FP type. 17263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_EXTEND, 17363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1747f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // FNEG, FABS, FSQRT, FSIN, FCOS - Perform unary floating point negation, 1757f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // absolute value, square root, sine and cosine operations. 1767f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner FNEG, FABS, FSQRT, FSIN, FCOS, 1777366fd39727180a3261dd99e3797f89979d74e66Chris Lattner 1781cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // Other operators. LOAD and STORE have token chains as their first 179f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // operand, then the same operands as an LLVM load/store instruction, then a 180f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // SRCVALUE node that provides alias analysis information. 18163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner LOAD, STORE, 18263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1831cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // EXTLOAD, SEXTLOAD, ZEXTLOAD - These three operators are instances of the 1841cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // MVTSDNode. All of these load a value from memory and extend them to a 1851cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // larger value (e.g. load a byte into a word register). All three of these 1861cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // have two operands, a chain and a pointer to load from. The extra value 1871cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // type is the source type being loaded. 1881cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // 1891cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // SEXTLOAD loads the integer operand and sign extends it to a larger 1901cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 1911cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // ZEXTLOAD loads the integer operand and zero extends it to a larger 1921cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 193ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman // EXTLOAD is used for two things: floating point extending loads, and 1941cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer extending loads where it doesn't matter what the high 1951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // bits are set to. The code generator is allowed to codegen this 1961cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // into whichever operation is more efficient. 1971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner EXTLOAD, SEXTLOAD, ZEXTLOAD, 1981cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 1991cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // TRUNCSTORE - This operators truncates (for integer) or rounds (for FP) a 2001cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // value and stores it to memory in one operation. This can be used for 201f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // either integer or floating point operands. The first four operands of 202f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // this are the same as a standard store. The fifth is the ValueType to 203f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // store it as (which will be smaller than the source value). 2041cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner TRUNCSTORE, 2051cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 20663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned 20763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to a specified boundary. The first operand is the token chain, the 20863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the number of bytes to allocate, and the third is the alignment 20963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // boundary. 21063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner DYNAMIC_STACKALLOC, 21163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 21263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Control flow instructions. These all have token chains. 213ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 21463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BR - Unconditional branch. The first operand is the chain 21563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operand, the second is the MBB to branch to. 21663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BR, 21763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 21863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BRCOND - Conditional branch. The first operand is the chain, 21963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // the second is the condition, the third is the block to branch 22063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to if the condition is true. 22163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BRCOND, 22263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2231df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // BRCONDTWOWAY - Two-way conditional branch. The first operand is the 2241df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // chain, the second is the condition, the third is the block to branch to 2251df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // if true, and the forth is the block to branch to if false. Targets 2261df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // usually do not implement this, preferring to have legalize demote the 2271df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // operation to BRCOND/BR pairs when necessary. 2281df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner BRCONDTWOWAY, 2291df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner 23063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // RET - Return from function. The first operand is the chain, 23163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // and any subsequent operands are the return values for the 23263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // function. This operation can have variable number of operands. 23363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner RET, 23463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 23563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CALL - Call to a function pointer. The first operand is the chain, the 23663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the destination function pointer (a GlobalAddress for a direct 23763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // call). Arguments have already been lowered to explicit DAGs according to 2384c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the calling convention in effect here. TAILCALL is the same as CALL, but 2394c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the callee is known not to access the stack of the caller. 24063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CALL, 2414c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner TAILCALL, 242ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner 243ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // MEMSET/MEMCPY/MEMMOVE - The first operand is the chain, and the rest 244ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // correspond to the operands of the LLVM intrinsic functions. The only 245ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // result is a token chain. The alignment argument is guaranteed to be a 246ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // Constant node. 247ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMSET, 248ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMMOVE, 249ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMCPY, 250ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 25116cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of 25216cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // a call sequence, and carry arbitrary information that target might want 25316cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // to know. The first operand is a chain, the rest are specified by the 25416cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // target and not touched by the DAG optimizers. 25516cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_START, // Beginning of a call sequence 25616cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_END, // End of a call sequence 25763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 25821074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // SRCVALUE - This corresponds to a Value*, and is used to associate memory 25921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // locations with their value. This allows one use alias analysis 26021074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // information in the backend. 26121074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner SRCVALUE, 26221074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner 263e3f570c3f9048bc71a9f5841343eae63719e439bMisha Brukman // PCMARKER - This corresponds to the pcmarker intrinsic. 26495762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth PCMARKER, 26563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 26621074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // READPORT, WRITEPORT, READIO, WRITEIO - These correspond to the LLVM 26721074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // intrinsics of the same name. The first operand is a token chain, the 26821074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // other operands match the intrinsic. These produce a token chain in 26921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // addition to a value (if any). 27021074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner READPORT, WRITEPORT, READIO, WRITEIO, 2712d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 27263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILTIN_OP_END - This must be the last enum value in this list. 27363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILTIN_OP_END, 27463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 27563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 27663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 27763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::CondCode enum - These are ordered carefully to make the bitfields 27863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// below work out, when considering SETFALSE (something that never exists 27963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// dynamically) as 0. "U" -> Unsigned (for integer operands) or Unordered 28063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal 28163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to. If the "N" column is 1, the result of the comparison is undefined if 28263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the input is a NAN. 28363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 28463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// All of these (except for the 'always folded ops') should be handled for 28563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// floating point. For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT, 28663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used. 28763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 28863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note that these are laid out in a specific order to allow bit-twiddling 28963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to transform conditions. 29063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum CondCode { 29163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Opcode N U L G E Intuitive operation 29263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE, // 0 0 0 0 Always false (always folded) 29363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOEQ, // 0 0 0 1 True if ordered and equal 29463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGT, // 0 0 1 0 True if ordered and greater than 29563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGE, // 0 0 1 1 True if ordered and greater than or equal 29663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLT, // 0 1 0 0 True if ordered and less than 29763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLE, // 0 1 0 1 True if ordered and less than or equal 29863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETONE, // 0 1 1 0 True if ordered and operands are unequal 29963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETO, // 0 1 1 1 True if ordered (no nans) 30063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUO, // 1 0 0 0 True if unordered: isnan(X) | isnan(Y) 30163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUEQ, // 1 0 0 1 True if unordered or equal 30263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGT, // 1 0 1 0 True if unordered or greater than 30363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGE, // 1 0 1 1 True if unordered, greater than, or equal 30463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETULT, // 1 1 0 0 True if unordered or less than 305ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETULE, // 1 1 0 1 True if unordered, less than, or equal 30663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUNE, // 1 1 1 0 True if unordered or not equal 30763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE, // 1 1 1 1 Always true (always folded) 30863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Don't care operations: undefined if the input is a nan. 30963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE2, // 1 X 0 0 0 Always false (always folded) 31063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETEQ, // 1 X 0 0 1 True if equal 31163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGT, // 1 X 0 1 0 True if greater than 31263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGE, // 1 X 0 1 1 True if greater than or equal 31363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETLT, // 1 X 1 0 0 True if less than 314ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETLE, // 1 X 1 0 1 True if less than or equal 31563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETNE, // 1 X 1 1 0 True if not equal 31663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE2, // 1 X 1 1 1 Always true (always folded) 31763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 31863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC_INVALID, // Marker value. 31963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 32063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 32163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isSignedIntSetCC - Return true if this is a setcc instruction that 32263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs a signed comparison when used with integer operands. 32363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isSignedIntSetCC(CondCode Code) { 32463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE; 32563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 32663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 32763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isUnsignedIntSetCC - Return true if this is a setcc instruction that 32863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs an unsigned comparison when used with integer operands. 32963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isUnsignedIntSetCC(CondCode Code) { 33063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE; 33163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 33263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 33363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isTrueWhenEqual - Return true if the specified condition returns true if 33463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the two operands to the condition are equal. Note that if one of the two 33563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operands is a NaN, this value is meaningless. 33663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isTrueWhenEqual(CondCode Cond) { 33763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond & 1) != 0; 33863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 33963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getUnorderedFlavor - This function returns 0 if the condition is always 34163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// false if an operand is a NaN, 1 if the condition is always true if the 34263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operand is a NaN, and 2 if the condition is undefined if the operand is a 34363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// NaN. 34463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getUnorderedFlavor(CondCode Cond) { 34563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond >> 3) & 3; 34663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 34763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCInverse - Return the operation corresponding to !(X op Y), where 34963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 'op' is a valid SetCC operation. 35063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCInverse(CondCode Operation, bool isInteger); 35163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X) 35363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// when given the operation for (X op Y). 35463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCSwappedOperands(CondCode Operation); 35563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCOrOperation - Return the result of a logical OR between different 35763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This 35863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 35963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 36063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, bool isInteger); 36163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCAndOperation - Return the result of a logical AND between 36363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// different comparisons of identical values: ((X op1 Y) & (X op2 Y)). This 36463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 36563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 36663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger); 36763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm::ISD namespace 36863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 37163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperand - Unlike LLVM values, Selection DAG nodes may return multiple 37263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// values as the result of a computation. Many nodes return multiple values, 37363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// from loads (which define a token and a return value) to ADDC (which returns 37463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// a result and a carry value), to calls (which may return an arbitrary number 37563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of values). 37663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 37763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// As such, each use of a SelectionDAG computation must indicate the node that 37863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// computes it as well as which return value to use from that node. This pair 37963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of information is represented with the SDOperand value type. 38063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 381f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerclass SDOperand { 382f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerpublic: 38363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode *Val; // The node defining the value we are using. 38463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned ResNo; // Which return value of the node we are using. 38563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand() : Val(0) {} 38763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand(SDNode *val, unsigned resno) : Val(val), ResNo(resno) {} 38863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator==(const SDOperand &O) const { 39063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val == O.Val && ResNo == O.ResNo; 39163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 39263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator!=(const SDOperand &O) const { 39363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return !operator==(O); 39463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 39563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator<(const SDOperand &O) const { 39663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val < O.Val || (Val == O.Val && ResNo < O.ResNo); 39763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 39863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 39963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand getValue(unsigned R) const { 40063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return SDOperand(Val, R); 40163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 40263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 40363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the ValueType of the referenced return value. 40463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 40563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline MVT::ValueType getValueType() const; 406ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 40763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Forwarding methods - These forward to the corresponding methods in SDNode. 40863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getOpcode() const; 4090442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner inline unsigned getNodeDepth() const; 41063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getNumOperands() const; 41163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline const SDOperand &getOperand(unsigned i) const; 412a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner 413a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// hasOneUse - Return true if there is exactly one operation using this 414a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// result value of the defining operator. 415a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner inline bool hasOneUse() const; 41663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 41763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// simplify_type specializations - Allow casting operators to work directly on 42063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperands as if they were SDNode*'s. 42163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<SDOperand> { 42263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 42363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 42463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 42563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 42663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 42763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<const SDOperand> { 42863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 42963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 43063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 43163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 43263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 43363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDNode - Represents one node in the SelectionDAG. 43663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 43763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode { 4380442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeType - The operation that this node performs. 4390442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 4400442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeType; 4410442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4420442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeDepth - Node depth is defined as MAX(Node depth of children)+1. This 4430442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// means that leaves have a depth of 1, things that use only leaves have a 4440442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// depth of 2, etc. 4450442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeDepth; 4460442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4470442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// Operands - The values that are used by this operation. 4480442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 44963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDOperand> Operands; 45063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Values - The types of the values this node defines. SDNode's may define 45263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// multiple values simultaneously. 45363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<MVT::ValueType> Values; 45463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Uses - These are all of the SDNode's that use a value produced by this 45663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// node. 45763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDNode*> Uses; 45863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 45963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 46063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 46163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Accessors 46263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // 46363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getOpcode() const { return NodeType; } 46463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 46563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner size_t use_size() const { return Uses.size(); } 46663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool use_empty() const { return Uses.empty(); } 46763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool hasOneUse() const { return Uses.size() == 1; } 46863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4690442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// getNodeDepth - Return the distance from this node to the leaves in the 4700442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// graph. The leaves have a depth of 1. 4710442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned getNodeDepth() const { return NodeDepth; } 4720442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4737ece380440238ad0630a225b85a09a2dbed1165aChris Lattner typedef std::vector<SDNode*>::const_iterator use_iterator; 4747ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_begin() const { return Uses.begin(); } 4757ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_end() const { return Uses.end(); } 4767ece380440238ad0630a225b85a09a2dbed1165aChris Lattner 477b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 478b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// indicated value. This method ignores uses of other values defined by this 479b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// operation. 480b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner bool hasNUsesOfValue(unsigned NUses, unsigned Value); 481b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner 48263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumOperands - Return the number of values used by this operation. 48363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 48463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumOperands() const { return Operands.size(); } 48563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 48663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) { 48763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 48863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 48963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 49063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 49163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) const { 49263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 49363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 49463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 49550f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<SDOperand>::const_iterator op_iterator; 49650f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_begin() const { return Operands.begin(); } 49750f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_end() const { return Operands.end(); } 49850f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner 49963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 50063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumValues - Return the number of values defined/returned by this 50163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operator. 50263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 50363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumValues() const { return Values.size(); } 50463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 50563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the type of a specified result. 50663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 50763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MVT::ValueType getValueType(unsigned ResNo) const { 50863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(ResNo < Values.size() && "Illegal result number!"); 50963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Values[ResNo]; 51063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 51150f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner 51250f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<MVT::ValueType>::const_iterator value_iterator; 51350f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_begin() const { return Values.begin(); } 51450f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_end() const { return Values.end(); } 51563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5166e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// getOperationName - Return the opcode of this operation for printing. 5176e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// 5186e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner const char* getOperationName() const; 51963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void dump() const; 52063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *) { return true; } 52263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52373b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner 52473b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner /// setAdjCallChain - This method should only be used by the legalizer. 52573b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner void setAdjCallChain(SDOperand N); 52673b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner 52763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 52863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 52963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5300442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner SDNode(unsigned NT, MVT::ValueType VT) : NodeType(NT), NodeDepth(1) { 53163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 53263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 53363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 53463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand Op) 5350442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner : NodeType(NT), NodeDepth(Op.Val->getNodeDepth()+1) { 53663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(1); Operands.push_back(Op); 53763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Op.Val->Uses.push_back(this); 53863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 53963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2) 54063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5410442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (N1.Val->getNodeDepth() > N2.Val->getNodeDepth()) 5420442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N1.Val->getNodeDepth()+1; 5430442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner else 5440442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N2.Val->getNodeDepth()+1; 54563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(2); Operands.push_back(N1); Operands.push_back(N2); 54663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 54763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 54863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3) 54963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5500442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = N1.Val->getNodeDepth(); 5510442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N2.Val->getNodeDepth()) 5520442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N2.Val->getNodeDepth(); 5530442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N3.Val->getNodeDepth()) 5540442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N3.Val->getNodeDepth(); 5550442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 5560442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 55763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(3); Operands.push_back(N1); Operands.push_back(N2); 55863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.push_back(N3); 55963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 56063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N3.Val->Uses.push_back(this); 56163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 5622d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4) 5632d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth : NodeType(NT) { 5642d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth unsigned ND = N1.Val->getNodeDepth(); 5652d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N2.Val->getNodeDepth()) 5662d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N2.Val->getNodeDepth(); 5672d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N3.Val->getNodeDepth()) 5682d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N3.Val->getNodeDepth(); 5692d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N4.Val->getNodeDepth()) 5702d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N4.Val->getNodeDepth(); 5712d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth NodeDepth = ND+1; 5722d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 573691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth Operands.reserve(4); Operands.push_back(N1); Operands.push_back(N2); 5742d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth Operands.push_back(N3); Operands.push_back(N4); 5752d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 5762d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N3.Val->Uses.push_back(this); N4.Val->Uses.push_back(this); 5772d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 57863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, std::vector<SDOperand> &Nodes) : NodeType(NT) { 57963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.swap(Nodes); 5800442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = 0; 5810442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 582ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner Operands[i].Val->Uses.push_back(this); 5830442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < Operands[i].Val->getNodeDepth()) 5840442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = Operands[i].Val->getNodeDepth(); 5850442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner } 5860442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 58763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 58863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 58963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner virtual ~SDNode() { 59063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FIXME: Drop uses. 59163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 59263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 59363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT) { 59463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 59563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 59663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 59763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT1, MVT::ValueType VT2) { 59863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(2); 59963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT1); 60063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT2); 60163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 60263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note: this method destroys the vector passed in. 60363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(std::vector<MVT::ValueType> &VTs) { 60463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::swap(Values, VTs); 60563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 606d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner 607d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner void removeUser(SDNode *User) { 608d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner // Remove this user from the operand's use list. 609d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner for (unsigned i = Uses.size(); ; --i) { 610d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner assert(i != 0 && "Didn't find user!"); 611d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner if (Uses[i-1] == User) { 612d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner Uses.erase(Uses.begin()+i-1); 613d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner break; 614d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 615d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 616d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 61763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 61863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 61963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 62063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Define inline functions from the SDOperand class. 62163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 62263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getOpcode() const { 62363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOpcode(); 62463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 6250442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattnerinline unsigned SDOperand::getNodeDepth() const { 6260442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner return Val->getNodeDepth(); 6270442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner} 62863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline MVT::ValueType SDOperand::getValueType() const { 62963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getValueType(ResNo); 63063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 63163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getNumOperands() const { 63263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getNumOperands(); 63363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 63463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline const SDOperand &SDOperand::getOperand(unsigned i) const { 63563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOperand(i); 63663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 637a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattnerinline bool SDOperand::hasOneUse() const { 638a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner return Val->hasNUsesOfValue(1, ResNo); 639a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner} 64063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 64163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 64263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantSDNode : public SDNode { 64363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t Value; 64463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 64563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 64663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantSDNode(uint64_t val, MVT::ValueType VT) 64763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::Constant, VT), Value(val) { 64863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 64963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 65063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t getValue() const { return Value; } 65263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int64_t getSignExtended() const { 65463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Bits = MVT::getSizeInBits(getValueType(0)); 655f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner return ((int64_t)Value << (64-Bits)) >> (64-Bits); 65663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 65763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 65863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isNullValue() const { return Value == 0; } 65963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isAllOnesValue() const { 6602bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner int NumBits = MVT::getSizeInBits(getValueType(0)); 6612bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner if (NumBits == 64) return Value+1 == 0; 6622bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner return Value == (1ULL << NumBits)-1; 66363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 66463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantSDNode *) { return true; } 66663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 66763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::Constant; 66863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 66963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 67063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 67163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantFPSDNode : public SDNode { 67263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double Value; 67363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 67463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 67563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantFPSDNode(double val, MVT::ValueType VT) 67663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantFP, VT), Value(val) { 67763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 67863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 67963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double getValue() const { return Value; } 68163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 68263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isExactlyValue - We don't rely on operator== working on double values, as 68363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 68463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// As such, this method can be used to do an exact bit-for-bit comparison of 68563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// two floating point values. 68663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isExactlyValue(double V) const { 68763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 68863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 68963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 69063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T1; 69163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T1.V = Value; 69263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 69363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 69463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 69563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T2; 69663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T2.V = V; 69763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return T1.I == T2.I; 69863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 69963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantFPSDNode *) { return true; } 70163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 70263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantFP; 70363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 70463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 70563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalAddressSDNode : public SDNode { 70763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *TheGlobal; 70863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 70963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 71063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT) 71163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::GlobalAddress, VT) { 71263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TheGlobal = const_cast<GlobalValue*>(GA); 71363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 71463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 71563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *getGlobal() const { return TheGlobal; } 71763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const GlobalAddressSDNode *) { return true; } 71963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 72063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::GlobalAddress; 72163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 72263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 72363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 72463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 72563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass FrameIndexSDNode : public SDNode { 72663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int FI; 72763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 72863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 72963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FrameIndexSDNode(int fi, MVT::ValueType VT) 73063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::FrameIndex, VT), FI(fi) {} 73163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 73263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int getIndex() const { return FI; } 73463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const FrameIndexSDNode *) { return true; } 73663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 73763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::FrameIndex; 73863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 73963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 74063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 74163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantPoolSDNode : public SDNode { 74263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned CPI; 74363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 74463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 74563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT) 74663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantPool, VT), CPI(cpi) {} 74763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 74863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 74963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getIndex() const { return CPI; } 75063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantPoolSDNode *) { return true; } 75263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 75363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantPool; 75463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 75563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 75663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass BasicBlockSDNode : public SDNode { 75863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *MBB; 75963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 76063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 76163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BasicBlockSDNode(MachineBasicBlock *mbb) 76263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::BasicBlock, MVT::Other), MBB(mbb) {} 76363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 76463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *getBasicBlock() const { return MBB; } 76663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const BasicBlockSDNode *) { return true; } 76863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 76963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::BasicBlock; 77063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 77163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 77263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 7732d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthclass SrcValueSDNode : public SDNode { 7742d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *V; 775691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int offset; 7762d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthprotected: 7772d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth friend class SelectionDAG; 778691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth SrcValueSDNode(const Value* v, int o) 779691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth : SDNode(ISD::SRCVALUE, MVT::Other), V(v), offset(o) {} 7802d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 7812d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthpublic: 7822d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *getValue() const { return V; } 783691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int getOffset() const { return offset; } 7842d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 7852d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SrcValueSDNode *) { return true; } 7862d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SDNode *N) { 7872d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth return N->getOpcode() == ISD::SRCVALUE; 7882d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 7892d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth}; 7902d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 79163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 79218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattnerclass RegSDNode : public SDNode { 79363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Reg; 79463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 79563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 79660e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner RegSDNode(unsigned Opc, SDOperand Chain, SDOperand Src, unsigned reg) 7971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner : SDNode(Opc, Chain, Src), Reg(reg) { 79863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 79960e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner RegSDNode(unsigned Opc, SDOperand Chain, unsigned reg) 80060e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner : SDNode(Opc, Chain), Reg(reg) {} 80163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 80263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getReg() const { return Reg; } 80463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80518c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner static bool classof(const RegSDNode *) { return true; } 80663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 80763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::CopyToReg || 80818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner N->getOpcode() == ISD::CopyFromReg || 80918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner N->getOpcode() == ISD::ImplicitDef; 81063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 81163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 81263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 81363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ExternalSymbolSDNode : public SDNode { 81463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *Symbol; 81563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 81663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 81763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ExternalSymbolSDNode(const char *Sym, MVT::ValueType VT) 81863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ExternalSymbol, VT), Symbol(Sym) { 81963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 82063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 82163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 82263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *getSymbol() const { return Symbol; } 82363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 82463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ExternalSymbolSDNode *) { return true; } 82563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 82663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ExternalSymbol; 82763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 82863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 82963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 83063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SetCCSDNode : public SDNode { 83163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode Condition; 83263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 83363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 83463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SetCCSDNode(ISD::CondCode Cond, SDOperand LHS, SDOperand RHS) 83563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::SETCC, LHS, RHS), Condition(Cond) { 83663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 83763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 83863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 83963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode getCondition() const { return Condition; } 84063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 84163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SetCCSDNode *) { return true; } 84263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 84363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::SETCC; 84463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 84563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 84663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 84715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// VTSDNode - This class is used to represent MVT::ValueType's, which are used 84815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// to parameterize some operations. 84915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerclass VTSDNode : public SDNode { 85015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType ValueType; 85115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerprotected: 85215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner friend class SelectionDAG; 85315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner VTSDNode(MVT::ValueType VT) 85415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner : SDNode(ISD::VALUETYPE, MVT::Other), ValueType(VT) {} 85515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerpublic: 85615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 85715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType getVT() const { return ValueType; } 85815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 85915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const VTSDNode *) { return true; } 86015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const SDNode *N) { 86115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner return N->getOpcode() == ISD::VALUETYPE; 86215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner } 86315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner}; 86415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 86515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 8661cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner/// MVTSDNode - This class is used for operators that require an extra 8671cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner/// value-type to be kept with the node. 8681cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerclass MVTSDNode : public SDNode { 8691cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner MVT::ValueType ExtraValueType; 8701cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerprotected: 8711cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner friend class SelectionDAG; 872859157daee6a4b49e99921832e1dde065167b317Chris Lattner MVTSDNode(unsigned Opc, MVT::ValueType VT1, SDOperand Op0, MVT::ValueType EVT) 873859157daee6a4b49e99921832e1dde065167b317Chris Lattner : SDNode(Opc, Op0), ExtraValueType(EVT) { 874859157daee6a4b49e99921832e1dde065167b317Chris Lattner setValueTypes(VT1); 875859157daee6a4b49e99921832e1dde065167b317Chris Lattner } 87660e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner MVTSDNode(unsigned Opc, MVT::ValueType VT1, MVT::ValueType VT2, 8772d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth SDOperand Op0, SDOperand Op1, SDOperand Op2, MVT::ValueType EVT) 8782d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth : SDNode(Opc, Op0, Op1, Op2), ExtraValueType(EVT) { 87960e4878f9414227a92fec423d5fc39f0d00a2478Chris Lattner setValueTypes(VT1, VT2); 8801cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner } 8811cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerpublic: 8821cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 8831cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner MVT::ValueType getExtraValueType() const { return ExtraValueType; } 8841cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 8851cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner static bool classof(const MVTSDNode *) { return true; } 8861cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner static bool classof(const SDNode *N) { 887ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman return 8881cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner N->getOpcode() == ISD::EXTLOAD || 889ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman N->getOpcode() == ISD::SEXTLOAD || 890f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner N->getOpcode() == ISD::ZEXTLOAD; 8911cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner } 8921cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner}; 8931080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 8941080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerclass SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> { 8951080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNode *Node; 8961080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned Operand; 897ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 8981080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {} 8991080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerpublic: 9001080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator==(const SDNodeIterator& x) const { 9011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Operand == x.Operand; 9021080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9031080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } 9041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNodeIterator &operator=(const SDNodeIterator &I) { 9061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner assert(I.Node == Node && "Cannot assign iterators to two different nodes!"); 9071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner Operand = I.Operand; 9081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 910ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator*() const { 9121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Node->getOperand(Operand).Val; 9131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9141080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator->() const { return operator*(); } 915ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator& operator++() { // Preincrement 9171080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner ++Operand; 9181080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9191080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9201080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator operator++(int) { // Postincrement 921ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SDNodeIterator tmp = *this; ++*this; return tmp; 9221080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); } 9251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator end (SDNode *N) { 9261080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator(N, N->getNumOperands()); 9271080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9281080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9291080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned getOperand() const { return Operand; } 9301080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNode *getNode() const { return Node; } 9311080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9321080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9331080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SDNode*> { 9341080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNode NodeType; 9351080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNodeIterator ChildIteratorType; 9361080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline NodeType *getEntryNode(SDNode *N) { return N; } 937ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_begin(NodeType *N) { 9381080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::begin(N); 9391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 940ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_end(NodeType *N) { 9411080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::end(N); 9421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9431080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9441080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 94563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm namespace 94663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 94763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#endif 948