SelectionDAG.h revision e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55f
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// This file declares the SelectionDAG class, and transitively defines the 11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// SDNode class and subclasses. 12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner//===----------------------------------------------------------------------===// 14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAG_H 16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#define LLVM_CODEGEN_SELECTIONDAG_H 17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 18fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h" 19c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene#include "llvm/ADT/DenseSet.h" 20583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/ADT/FoldingSet.h" 214b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h" 22583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h" 23b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner 24acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert> 255892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector> 26322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map> 27eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string> 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis; 32fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TargetLowering; 33fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TargetMachine; 34fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineModuleInfo; 356e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patelclass DwarfWriter; 36fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineFunction; 37fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineConstantPoolValue; 38fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo; 39fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 408e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> { 418e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate: 42fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman mutable SDNode Sentinel; 43fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic: 44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman ilist_traits() : Sentinel(ISD::DELETED_NODE, SDVTList()) {} 45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 46fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman SDNode *createSentinel() const { 47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman return &Sentinel; 48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman } 49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void destroySentinel(SDNode *) {} 50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void deleteNode(SDNode *) { 52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!"); 53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman } 54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate: 55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void createNode(const SDNode &); 56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman}; 57c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 5825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel { 5925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands Unrestricted, // Combine may create illegal operations and illegal types. 6025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands NoIllegalTypes, // Combine may create illegal operations but no illegal types. 6125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands NoIllegalOperations // Combine may only create legal operations and types. 6225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands}; 6325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 64c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function 65c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction 66c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection. This DAG is constructed as the first step of instruction 67c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations 68c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications. 69c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// 70c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent 71c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation, 72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a 73c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form. 74cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner/// 75cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG { 76063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner TargetLowering &TLI; 777c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman MachineFunction *MF; 78ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner FunctionLoweringInfo &FLI; 7944c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey MachineModuleInfo *MMI; 806e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel DwarfWriter *DW; 81cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 82f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// EntryNode - The starting token. 83f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDNode EntryNode; 84f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 85f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// Root - The root of the entire DAG. 86f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDValue Root; 87cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 88213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner /// AllNodes - A linked list of nodes in the current DAG. 89fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman ilist<SDNode> AllNodes; 90fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 91f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use 92f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// pool allocation with recycling. 93f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode), 94f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman AlignOf<MostAlignedSDNode>::Alignment> 95f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman NodeAllocatorType; 96f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 97f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// NodeAllocator - Pool allocation for nodes. 98f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman NodeAllocatorType NodeAllocator; 99691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 100213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner /// CSEMap - This structure is used to memoize nodes, automatically performing 101213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner /// CSE with existing nodes with a duplicate is requested. 102583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey FoldingSet<SDNode> CSEMap; 103213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner 104f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// OperandAllocator - Pool allocation for machine-opcode SDNode operands. 105f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman BumpPtrAllocator OperandAllocator; 106f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 107e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// Allocator - Pool allocation for misc. objects that are created once per 108e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// SelectionDAG. 109e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman BumpPtrAllocator Allocator; 110e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman 111d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands /// VerifyNode - Sanity check the given node. Aborts if it is invalid. 112d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands void VerifyNode(SDNode *N); 113d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands 114c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// setGraphColorHelper - Implementation of setSubgraphColor. 115c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// Return whether we had to truncate the search. 116c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// 117c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene bool setSubgraphColorHelper(SDNode *N, const char *Color, DenseSet<SDNode *> &visited, 118c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene int level, bool &printed); 119c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene 120cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic: 1217c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli); 122cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner ~SelectionDAG(); 123cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 1247c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// init - Prepare this SelectionDAG to process code in the given 1257c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// MachineFunction. 1267c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// 1276e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw); 1287c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman 1297c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// clear - Clear state and free memory necessary to make this 130f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// SelectionDAG ready to process a new block. 131f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// 1327c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman void clear(); 133f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 1347c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman MachineFunction &getMachineFunction() const { return *MF; } 135063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner const TargetMachine &getTarget() const; 136063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner TargetLowering &getTargetLoweringInfo() const { return TLI; } 137ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; } 13844c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey MachineModuleInfo *getMachineModuleInfo() const { return MMI; } 13983489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DwarfWriter *getDwarfWriter() const { return DW; } 140cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 141ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'. 1421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// 143462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman void viewGraph(const std::string &Title); 1440b12aef49087b57d276ed760a83525d1e2602144Dan Gohman void viewGraph(); 145ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey 146ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG 147ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey std::map<const SDNode *, std::string> NodeGraphAttrs; 148ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif 1491080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 150ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// clearGraphAttrs - Clear all previously defined node graph attributes. 151ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// Intended to be used from a debugging tool (eg. gdb). 152ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void clearGraphAttrs(); 153ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey 154ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".) 155ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// 156ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void setGraphAttrs(const SDNode *N, const char *Attrs); 157ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey 158ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".) 159ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// Used from getNodeAttributes. 160ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey const std::string getGraphAttrs(const SDNode *N) const; 161ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey 162ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// setGraphColor - Convenience for setting node color attribute. 163ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// 164ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void setGraphColor(const SDNode *N, const char *Color); 1651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 166c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// setGraphColor - Convenience for setting subgraph color attribute. 167c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// 168c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene void setSubgraphColor(SDNode *N, const char *Color); 169c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene 170fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman typedef ilist<SDNode>::const_iterator allnodes_const_iterator; 171b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); } 172b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_const_iterator allnodes_end() const { return AllNodes.end(); } 173fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman typedef ilist<SDNode>::iterator allnodes_iterator; 174b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_iterator allnodes_begin() { return AllNodes.begin(); } 175b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_iterator allnodes_end() { return AllNodes.end(); } 176fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman ilist<SDNode>::size_type allnodes_size() const { 1770e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman return AllNodes.size(); 1780e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman } 179b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner 180c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getRoot - Return the root tag of the SelectionDAG. 181cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 182475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue &getRoot() const { return Root; } 183cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 184c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getEntryNode - Return the token chain corresponding to the entry of the 185c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// function. 186f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDValue getEntryNode() const { 187f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman return SDValue(const_cast<SDNode *>(&EntryNode), 0); 188f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman } 189cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 190c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// setRoot - Set the current root tag of the SelectionDAG. 191cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 192475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue &setRoot(SDValue N) { 193ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif assert((!N.getNode() || N.getValueType() == MVT::Other) && 194acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman "DAG root value is not a chain!"); 195acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman return Root = N; 196acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman } 197cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 1981d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// Combine - This iterates over the nodes in the SelectionDAG, folding 19925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// certain types of nodes together, or eliminating superfluous nodes. The 20025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// Level argument controls whether Combine is allowed to produce nodes and 20125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// types that are illegal on the target. 20225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands void Combine(CombineLevel Level, AliasAnalysis &AA, bool Fast); 20325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 20401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that 20525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// only uses types natively supported by the target. Returns "true" if it 20625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// made any changes. 20701d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// 20801d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// Note that this is an involved process that may invalidate pointers into 20901d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// the graph. 21025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands bool LegalizeTypes(); 21125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 212c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is 213c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// compatible with the target instruction selector, as indicated by the 214c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// TargetLowering object. 215cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 216c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// Note that this is an involved process that may invalidate pointers into 217c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// the graph. 218b6862bbe34be4a832f709596f8dc971ab9895b06Duncan Sands void Legalize(bool TypesNeedLegalizing); 219c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 220d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner /// RemoveDeadNodes - This method deletes all unreachable nodes in the 221190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner /// SelectionDAG. 222190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner void RemoveDeadNodes(); 223130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng 224130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng /// DeleteNode - Remove the specified node from the system. This node must 225130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng /// have no referrers. 226130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng void DeleteNode(SDNode *N); 227130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng 22870046e920fa37989a041af663ada2b2b646e258fChris Lattner /// getVTList - Return an SDVTList that represents the list of values 22970046e920fa37989a041af663ada2b2b646e258fChris Lattner /// specified. 23083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDVTList getVTList(MVT VT); 23183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDVTList getVTList(MVT VT1, MVT VT2); 23283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3); 23313d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4); 23483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDVTList getVTList(const MVT *VTs, unsigned NumVTs); 23570046e920fa37989a041af663ada2b2b646e258fChris Lattner 23670046e920fa37989a041af663ada2b2b646e258fChris Lattner /// getNodeValueTypes - These are obsolete, use getVTList instead. 23783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const MVT *getNodeValueTypes(MVT VT) { 23870046e920fa37989a041af663ada2b2b646e258fChris Lattner return getVTList(VT).VTs; 23970046e920fa37989a041af663ada2b2b646e258fChris Lattner } 24083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const MVT *getNodeValueTypes(MVT VT1, MVT VT2) { 24170046e920fa37989a041af663ada2b2b646e258fChris Lattner return getVTList(VT1, VT2).VTs; 24270046e920fa37989a041af663ada2b2b646e258fChris Lattner } 24383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) { 24470046e920fa37989a041af663ada2b2b646e258fChris Lattner return getVTList(VT1, VT2, VT3).VTs; 24570046e920fa37989a041af663ada2b2b646e258fChris Lattner } 24613d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3, MVT VT4) { 24713d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling return getVTList(VT1, VT2, VT3, VT4).VTs; 24813d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling } 249f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) { 25013d57320bd212483463d4f8992d5787b29eda5dfBill Wendling return getVTList(&vtList[0], (unsigned)vtList.size()).VTs; 25170046e920fa37989a041af663ada2b2b646e258fChris Lattner } 25270046e920fa37989a041af663ada2b2b646e258fChris Lattner 25370046e920fa37989a041af663ada2b2b646e258fChris Lattner 2541b1a49714ef26225a42199cf2930529f31868322Chris Lattner //===--------------------------------------------------------------------===// 25570046e920fa37989a041af663ada2b2b646e258fChris Lattner // Node creation methods. 25670046e920fa37989a041af663ada2b2b646e258fChris Lattner // 257475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false); 258475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false); 2594fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false); 260475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false); 261475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstant(uint64_t Val, MVT VT) { 262cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner return getConstant(Val, VT, true); 263cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner } 264475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstant(const APInt &Val, MVT VT) { 2656394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman return getConstant(Val, VT, true); 2666394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman } 2674fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman SDValue getTargetConstant(const ConstantInt &Val, MVT VT) { 2684fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman return getConstant(Val, VT, true); 2694fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman } 270475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstantFP(double Val, MVT VT, bool isTarget = false); 271475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false); 2724fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false); 273475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstantFP(double Val, MVT VT) { 274c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getConstantFP(Val, VT, true); 275c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 276475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstantFP(const APFloat& Val, MVT VT) { 277f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen return getConstantFP(Val, VT, true); 278f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen } 2794fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) { 2804fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman return getConstantFP(Val, VT, true); 2814fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman } 282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getGlobalAddress(const GlobalValue *GV, MVT VT, 2836520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman int64_t offset = 0, bool isTargetGA = false); 284475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT, 2856520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman int64_t offset = 0) { 286cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner return getGlobalAddress(GV, VT, offset, true); 287cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner } 288475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false); 289475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetFrameIndex(int FI, MVT VT) { 290c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getFrameIndex(FI, VT, true); 291c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false); 293475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetJumpTable(int JTI, MVT VT) { 294c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getJumpTable(JTI, VT, true); 295c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 296475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstantPool(Constant *C, MVT VT, 297c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner unsigned Align = 0, int Offs = 0, bool isT=false); 298475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstantPool(Constant *C, MVT VT, 299c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner unsigned Align = 0, int Offset = 0) { 300c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getConstantPool(C, VT, Align, Offset, true); 301c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 302475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT, 303d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng unsigned Align = 0, int Offs = 0, bool isT=false); 304475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstantPool(MachineConstantPoolValue *C, 30583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands MVT VT, unsigned Align = 0, 306d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng int Offset = 0) { 307d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng return getConstantPool(C, VT, Align, Offset, true); 308d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 3098ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen // When generating a branch to a BB, we don't in general know enough 3108ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen // to provide debug info for the BB at that time, so keep this one around. 311475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getBasicBlock(MachineBasicBlock *MBB); 312e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl); 313056292fd738924f3f7703725d8f630983794b5a5Bill Wendling SDValue getExternalSymbol(const char *Sym, MVT VT); 314e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT); 315056292fd738924f3f7703725d8f630983794b5a5Bill Wendling SDValue getTargetExternalSymbol(const char *Sym, MVT VT); 316e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT); 317475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getArgFlags(ISD::ArgFlagsTy Flags); 318475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getValueType(MVT); 319475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getRegister(unsigned Reg, MVT VT); 320475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col, 32183489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel Value *CU); 322e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root, 323e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned LabelID); 324c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 3250f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) { 3260f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen return getNode(ISD::CopyToReg, dl, MVT::Other, Chain, 3270f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen getRegister(Reg, N.getValueType()), N); 3280f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 329cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 330e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // This version of the getCopyToReg method takes an extra operand, which 331e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // indicates that there is potentially an incoming flag value (if Flag is not 332e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // null) and that there should be a flag result. 3330f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N, 3340f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Flag) { 3350f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag); 3360f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag }; 3370f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3); 3380f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 33966a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng 340475871a144eb604ddaf37503397ba0941442e5fbDan Gohman // Similar to last getCopyToReg() except parameter Reg is a SDValue 3410f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N, 3420f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Flag) { 3430f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag); 3440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, Reg, N, Flag }; 3450f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3); 3460f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 347e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner 3480f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) { 3490f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const MVT *VTs = getNodeValueTypes(VT, MVT::Other); 3500f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, VT) }; 3510f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen return getNode(ISD::CopyFromReg, dl, VTs, 2, Ops, 2); 3520f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 353e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner 354e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // This version of the getCopyFromReg method takes an extra operand, which 355e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // indicates that there is potentially an incoming flag value (if Flag is not 356e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // null) and that there should be a flag result. 3570f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT, 3580f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Flag) { 3590f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag); 3600f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag }; 3610f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen return getNode(ISD::CopyFromReg, dl, VTs, 3, Ops, Flag.getNode() ? 3 : 2); 3620f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 36318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 364475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCondCode(ISD::CondCode Cond); 365cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 36677cdf30742284a173fe818417eb482224cdee8d4Mon P Wang /// Returns the ConvertRndSat Note: Avoid using this node because it may 36777cdf30742284a173fe818417eb482224cdee8d4Mon P Wang /// disappear in the future and most targets don't support it. 3680f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy, 3690f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue STy, 3700f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Rnd, SDValue Sat, ISD::CvtCode Code); 37177cdf30742284a173fe818417eb482224cdee8d4Mon P Wang 3721ccae666f596d5aeca5c9942995763600b622062Chris Lattner /// getZeroExtendInReg - Return the expression required to zero extend the Op 3731ccae666f596d5aeca5c9942995763600b622062Chris Lattner /// value assuming it was the smaller SrcTy value. 3746ce610f04bb232ce8b57e50e885f30f65d19e1a6Bill Wendling SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy); 3756a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner 3764c2454623841f05c6c665659b34c214950d12d7eBob Wilson /// getNOT - Create a bitwise NOT operation as (XOR Val, -1). 37741b9d278add97c744930aa2a0048ff1c01e48c4fBill Wendling SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT); 3784c2454623841f05c6c665659b34c214950d12d7eBob Wilson 3796a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have 380e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a 381e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// useful DebugLoc. 382475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) { 38383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag); 384475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Ops[] = { Chain, Op }; 385e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(), 386e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen VTs, 2, Ops, 2); 3876a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner } 3881ccae666f596d5aeca5c9942995763600b622062Chris Lattner 3890f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a 390e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have 391e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// a useful DebugLoc. 392475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, 393475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue InFlag) { 3940f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag); 395475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SmallVector<SDValue, 4> Ops; 3960f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Chain); 3970f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Op1); 3980f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Op2); 3990f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(InFlag); 400e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys, 401e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen &Ops[0], 402ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0)); 4030f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling } 4040f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling 405e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc. 406e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen SDValue getUNDEF(MVT VT) { 407e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT); 408e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen } 409e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen 410c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getNode - Gets or creates the specified node. 411cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 412475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getNode(unsigned Opcode, MVT VT); 4137ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT); 414475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getNode(unsigned Opcode, MVT VT, SDValue N); 4157ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N); 4167ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2); 4177ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, 4187ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3); 4197ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, 4207ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4); 4217ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, 4227ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4, 4237ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N5); 424475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getNode(unsigned Opcode, MVT VT, 4257ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDUse *Ops, unsigned NumOps); 4267ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, 4277ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDUse *Ops, unsigned NumOps); 4287ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, 4297ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 4307ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, 4317ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const std::vector<MVT> &ResultTys, 4327ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 4337ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs, 4347ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 4357ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 4367ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 4377ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs); 4387ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N); 4397ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 4407ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2); 4417ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 4427ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3); 4437ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 4447ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4); 4457ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 4467ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4, 4477ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N5); 448475871a144eb604ddaf37503397ba0941442e5fbDan Gohman 4490f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 4500f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, bool AlwaysInline, 4510f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const Value *DstSV, uint64_t DstSVOff, 45201f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *SrcSV, uint64_t SrcSVOff); 4535c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 4540f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 4550f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, 4560f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const Value *DstSV, uint64_t DstOSVff, 45701f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *SrcSV, uint64_t SrcSVOff); 4585c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 4590f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 4600f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, 46101f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *DstSV, uint64_t DstSVOff); 4625c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 4637cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner /// getSetCC - Helper function to make it easier to build SetCC's if you just 464475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// have an ISD::CondCode instead of an SDValue. 4657cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner /// 466d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS, 467d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling ISD::CondCode Cond) { 468d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond)); 469b43e9c196542acc80c9e4643809661065710848fNate Begeman } 470b43e9c196542acc80c9e4643809661065710848fNate Begeman 471b43e9c196542acc80c9e4643809661065710848fNate Begeman /// getVSetCC - Helper function to make it easier to build VSetCC's nodes 472475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// if you just have an ISD::CondCode instead of an SDValue. 473b43e9c196542acc80c9e4643809661065710848fNate Begeman /// 474d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS, 475d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling ISD::CondCode Cond) { 476d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond)); 4777cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner } 4789373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman 4799373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman /// getSelectCC - Helper function to make it easier to build SelectCC's if you 480475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// just have an ISD::CondCode instead of an SDValue. 4819373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman /// 482d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS, 483d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue True, SDValue False, ISD::CondCode Cond) { 484d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::SELECT_CC, DL, True.getValueType(), 485d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling LHS, RHS, True, False, getCondCode(Cond)); 4869373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman } 4877cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner 488acc398c195a697795bff3245943d104eb19192b9Nate Begeman /// getVAArg - VAArg produces a result and token chain, and takes a pointer 489acc398c195a697795bff3245943d104eb19192b9Nate Begeman /// and a source value as input. 4900f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr, 4910f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue SV); 4927cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 493c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// getAtomic - Gets a node for an atomic op, produces result and chain and 494c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// takes 3 operands 495e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain, 496e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal, 497e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment=0); 498ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth 499c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// getAtomic - Gets a node for an atomic op, produces result and chain and 500c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// takes 2 operands. 501e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain, 502e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Ptr, SDValue Val, const Value* PtrVal, 503e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment = 0); 504ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth 505c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a 506c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// result and takes a list of operands. 507e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, 508e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const MVT *VTs, unsigned NumVTs, 509e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps, 510e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen MVT MemVT, const Value *srcValue, int SVOff, 511e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Align = 0, bool Vol = false, 512e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool ReadMem = true, bool WriteMem = true); 513c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang 514e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList, 515e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps, 516e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen MVT MemVT, const Value *srcValue, int SVOff, 517e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Align = 0, bool Vol = false, 518e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool ReadMem = true, bool WriteMem = true); 519c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang 5204bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands /// getMergeValues - Create a MERGE_VALUES node from the given operands. 52154c94525f420cab274af60e98a77f081f96e59c2Dale Johannesen SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl); 522f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands 523095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman /// getCall - Create a CALL node from the given information. 524095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman /// 525e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs, 526e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool IsTailCall, bool isInreg, SDVTList VTs, 527e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Operands, unsigned NumOperands); 528095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman 529c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getLoad - Loads are not normal binary operators: their result type is not 530c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// determined by their operands, and they produce a value AND a token chain. 531cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 532e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr, 533e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const Value *SV, int SVOffset, bool isVolatile=false, 534e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment=0); 535e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT, 536e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Chain, SDValue Ptr, const Value *SV, 537e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen int SVOffset, MVT EVT, bool isVolatile=false, 538e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment=0); 539e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base, 540e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Offset, ISD::MemIndexedMode AM); 541e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType, 542e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen MVT VT, SDValue Chain, 543e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Ptr, SDValue Offset, 544e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const Value *SV, int SVOffset, MVT EVT, 545e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool isVolatile=false, unsigned Alignment=0); 5462d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 547ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng /// getStore - Helper function to build ISD::STORE nodes. 548ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng /// 549e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 550e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const Value *SV, int SVOffset, bool isVolatile=false, 551e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment=0); 552e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 553e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const Value *SV, int SVOffset, MVT TVT, 554e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool isVolatile=false, unsigned Alignment=0); 555e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base, 556e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Offset, ISD::MemIndexedMode AM); 557ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng 558101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// getSrcValue - Construct a node to track a Value* through the backend. 559475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getSrcValue(const Value *v); 56069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman 561101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// getMemOperand - Construct a node to track a memory reference 562101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// through the backend. 563475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getMemOperand(const MachineMemOperand &MO); 564cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 56592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands /// getShiftAmountOperand - Return the specified value casted to 56692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands /// the target's desired shift amount type. 56792abc62399881ba9c525be80362c134ad836e2d9Duncan Sands SDValue getShiftAmountOperand(SDValue Op); 56892abc62399881ba9c525be80362c134ad836e2d9Duncan Sands 569b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// UpdateNodeOperands - *Mutate* the specified node in-place to have the 570b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// specified operands. If the resultant node already exists in the DAG, 571b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// this does not modify the specified node, instead it returns the node that 572b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// already exists. If the resultant node does not exist in the DAG, the 573b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// input node is returned. As a degenerate case, if you specify the same 574b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// input operands as the node already has, the input node is returned. 575475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op); 576475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2); 577475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 578475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3); 579475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 580475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3, SDValue Op4); 581475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 582475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3, SDValue Op4, SDValue Op5); 583475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, 584475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 5851b95095857b78e12138c22e76c7936611c51355bChris Lattner 5861b95095857b78e12138c22e76c7936611c51355bChris Lattner /// SelectNodeTo - These are used for target selectors to *mutate* the 5871b95095857b78e12138c22e76c7936611c51355bChris Lattner /// specified node to have the specified return type, Target opcode, and 5881b95095857b78e12138c22e76c7936611c51355bChris Lattner /// operands. Note that target opcodes are stored as 589e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// ~TargetOpcode in the node opcode field. The resultant node is returned. 59083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT); 591475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1); 59283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, 593475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2); 59483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, 595475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2, SDValue Op3); 59683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, 597475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 598cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2); 599cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 600475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, const SDValue *Ops, unsigned NumOps); 601cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 602475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps); 60313d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1, 60413d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops, 60513d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling unsigned NumOps); 606cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 607475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1); 60883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 609475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1, SDValue Op2); 61083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 611475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3); 61213d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, 61313d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3); 614cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs, 615475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 616694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng 617e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// MorphNodeTo - These *mutate* the specified node to have the specified 618e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// return type, opcode, and operands. 619e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT); 620475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1); 621e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, 622475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2); 623e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, 624475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2, SDValue Op3); 625e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, 626475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 627e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2); 628e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, 629475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, const SDValue *Ops, unsigned NumOps); 630e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, 631475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps); 632e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, 633475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1); 634e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, 635475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1, SDValue Op2); 636e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, 637475871a144eb604ddaf37503397ba0941442e5fbDan Gohman MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3); 638e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, 639475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 640753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner 6416ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// getTargetNode - These are used for target selectors to create a new node 6426ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// with specified return type(s), target opcode, and operands. 6436ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// 6446ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// Note that getTargetNode returns the resultant node. If there is already a 6456ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// node of the specified opcode and operands, it returns that node instead of 6466ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// the current one. 64756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT); 64856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1); 64956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1, 65056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDValue Op2); 65156ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, 652e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Op1, SDValue Op2, SDValue Op3); 65356ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, 654e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps); 65556ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2); 65656ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, 65756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDValue Op1); 65856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, 659e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen MVT VT2, SDValue Op1, SDValue Op2); 66056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, 661e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3); 66256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, 663e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps); 66456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3, 665e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Op1, SDValue Op2); 66656ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3, 667e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Op1, SDValue Op2, SDValue Op3); 66856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3, 669e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps); 67056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3, 67156ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling MVT VT4, const SDValue *Ops, unsigned NumOps); 67256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, 67356ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling const std::vector<MVT> &ResultTys, const SDValue *Ops, 67456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling unsigned NumOps); 67508b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng 67608b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng /// getNodeIfExists - Get the specified node if it's already available, or 67708b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng /// else return NULL. 67808b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs, 679475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 6806542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner 681f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// DAGUpdateListener - Clients of various APIs that cause global effects on 682f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// the DAG can optionally implement this interface. This allows the clients 683f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// to handle the various sorts of updates that happen. 684f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner class DAGUpdateListener { 685f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner public: 686f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner virtual ~DAGUpdateListener(); 687edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands 688edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// NodeDeleted - The node N that was deleted and, if E is not null, an 689edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// equivalent node E that replaced it. 690edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands virtual void NodeDeleted(SDNode *N, SDNode *E) = 0; 691edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands 692edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// NodeUpdated - The node N that was updated. 693f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner virtual void NodeUpdated(SDNode *N) = 0; 694f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner }; 695f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner 696f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// RemoveDeadNode - Remove the specified node from the system. If any of its 697f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// operands then becomes dead, remove them as well. Inform UpdateListener 698f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// for each node deleted. 699f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0); 700f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner 7010fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman /// RemoveDeadNodes - This method deletes the unreachable nodes in the 7020fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman /// given list, and any nodes that become unreachable as a result. 7030fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes, 7040fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman DAGUpdateListener *UpdateListener = 0); 7050fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman 7066542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 70726005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner /// This can cause recursive merging of nodes in the DAG. Use the first 70826005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner /// version if 'From' is known to have a single result, use the second 70926005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner /// if you have two nodes with identical results, use the third otherwise. 7106542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner /// 711f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// These methods all take an optional UpdateListener, which (if not null) is 712f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// informed about nodes that are deleted and modified due to recursive 713f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// changes in the dag. 714fde3f3061d665babeb78443119a09876098fc35eChris Lattner /// 7159ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// These functions only replace all existing uses. It's possible that as 7169ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// these replacements are being performed, CSE may cause the From node 7179ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// to be given new uses. These new uses of From are left in place, and 7189ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// not automatically transfered to To. 7199ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// 720475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesWith(SDValue From, SDValue Op, 721f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 722fde3f3061d665babeb78443119a09876098fc35eChris Lattner void ReplaceAllUsesWith(SDNode *From, SDNode *To, 723f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 724475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesWith(SDNode *From, const SDValue *To, 725f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 726fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng 72780274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving 728f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// uses of other values produced by From.Val alone. 729475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesOfValueWith(SDValue From, SDValue To, 730f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 73180274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner 732e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but 733e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// for multiple values at once. This correctly handles the case where 734e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// there is an overlap between the From values and the To values. 735475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, 736e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman unsigned Num, 737e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman DAGUpdateListener *UpdateListener = 0); 738e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman 739f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// AssignTopologicalOrder - Topological-sort the AllNodes list and a 740f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// assign a unique node id for each node in the DAG based on their 741f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// topological order. Returns the number of nodes. 742f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman unsigned AssignTopologicalOrder(); 743e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng 7448be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// RepositionNode - Move node N in the AllNodes list to be immediately 7458be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// before the given iterator Position. This may be used to update the 7468be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// topological ordering when the list of nodes is modified. 7478be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman void RepositionNode(allnodes_iterator Position, SDNode *N) { 7488be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman AllNodes.insert(Position, AllNodes.remove(N)); 7498be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman } 7508be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman 7511efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng /// isCommutativeBinOp - Returns true if the opcode is a commutative binary 7521efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng /// operation. 7531efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng static bool isCommutativeBinOp(unsigned Opcode) { 7544ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner // FIXME: This should get its info from the td file, so that we can include 7554ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner // target info. 7561efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng switch (Opcode) { 7571efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::ADD: 7581efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MUL: 7591efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MULHU: 7601efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MULHS: 761b6c7437568f0472548ede2710458f52cfad4532eDan Gohman case ISD::SMUL_LOHI: 762b6c7437568f0472548ede2710458f52cfad4532eDan Gohman case ISD::UMUL_LOHI: 7631efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::FADD: 7641efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::FMUL: 7651efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::AND: 7661efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::OR: 7671efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::XOR: 7681efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::ADDC: 7691efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::ADDE: return true; 7701efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng default: return false; 7711efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng } 7721efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng } 7731efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng 774cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner void dump() const; 775d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner 77637ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner /// CreateStackTemporary - Create a stack temporary, suitable for holding the 777364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang /// specified value type. If minAlign is specified, the slot size will have 778364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang /// at least that alignment. 779475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1); 78047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands 78147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands /// CreateStackTemporary - Create a stack temporary suitable for holding 78247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands /// either of the specified value types. 78347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands SDValue CreateStackTemporary(MVT VT1, MVT VT2); 78447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands 785f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling /// FoldConstantArithmetic - 786f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling SDValue FoldConstantArithmetic(unsigned Opcode, 787f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling MVT VT, 788f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling ConstantSDNode *Cst1, 789f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling ConstantSDNode *Cst2); 790f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling 79151dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner /// FoldSetCC - Constant fold a setcc to true or false. 792475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue FoldSetCC(MVT VT, SDValue N1, 793ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen SDValue N2, ISD::CondCode Cond, DebugLoc dl); 79451dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner 7952e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We 7962e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman /// use this predicate to simplify operations downstream. 797475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const; 7982e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman 799ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We 800ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// use this predicate to simplify operations downstream. Op and Mask are 801ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// known to be the same type. 802475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0) 803ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman const; 804ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman 805ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// ComputeMaskedBits - Determine which of the bits specified in Mask are 806ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// known to be either zero or one and return them in the KnownZero/KnownOne 807ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// bitsets. This code only analyzes bits in Mask, in order to short-circuit 808ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// processing. Targets can implement the computeMaskedBitsForTargetNode 809ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// method in the TargetLowering class to allow target nodes to be understood. 810475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero, 811fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownOne, unsigned Depth = 0) const; 812fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman 813ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// ComputeNumSignBits - Return the number of times the sign bit of the 814ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// register is replicated into the other bits. We know that at least 1 bit 815ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// is always equal to the sign bit (itself), but other cases can give us 816ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// information. For example, immediately after an "SRA X, 2", we know that 817ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// the top 3 bits are all equal to each other, so we return 3. Targets can 818ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// implement the ComputeNumSignBitsForTarget method in the TargetLowering 819ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// class to allow target nodes to be understood. 820475871a144eb604ddaf37503397ba0941442e5fbDan Gohman unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const; 821a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 822475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has 823a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// been verified as a debug information descriptor. 824475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool isVerifiedDebugInfoDesc(SDValue Op) const; 82577f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng 82677f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng /// getShuffleScalarElt - Returns the scalar element that will make up the ith 82777f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng /// element of the result of the vector shuffle. 828475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx); 829ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman 830d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate: 831095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman bool RemoveNodeFromCSEMaps(SDNode *N); 832399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener); 833475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos); 834475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2, 835a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner void *&InsertPos); 836475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps, 837a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner void *&InsertPos); 838b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner 839fde3f3061d665babeb78443119a09876098fc35eChris Lattner void DeleteNodeNotInCSEMaps(SDNode *N); 840c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman void DeallocateNode(SDNode *N); 8419c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman 8429c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman unsigned getMVTAlignment(MVT MemoryVT) const; 843f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 844f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman void allnodes_clear(); 8457cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner 846101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// VTList - List of non-single value types. 847e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman std::vector<SDVTList> VTList; 848109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner 849101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// CondCodeNodes - Maps to auto-CSE operations. 8507cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner std::vector<CondCodeSDNode*> CondCodeNodes; 8511cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 85215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner std::vector<SDNode*> ValueTypeNodes; 8538e4eb09b1e3571965f49edcdfb56b1375b1b7551Duncan Sands std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes; 854056292fd738924f3f7703725d8f630983794b5a5Bill Wendling StringMap<SDNode*> ExternalSymbols; 855056292fd738924f3f7703725d8f630983794b5a5Bill Wendling StringMap<SDNode*> TargetExternalSymbols; 856cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner}; 857cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 8581080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> { 8591080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SelectionDAG::allnodes_iterator nodes_iterator; 8601080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static nodes_iterator nodes_begin(SelectionDAG *G) { 8611080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return G->allnodes_begin(); 8621080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8631080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static nodes_iterator nodes_end(SelectionDAG *G) { 8641080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return G->allnodes_end(); 8651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 8661080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 8671080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 868b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner} // end namespace llvm 869cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 870cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif 871