SelectionDAG.h revision d4c6c3a7c3140ce487a805138b6f53f82ff6b783
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" 204b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h" 21583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h" 22c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman#include "llvm/Support/RecyclingAllocator.h" 2398a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h" 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; 326e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patelclass DwarfWriter; 33fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo; 34b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineConstantPoolValue; 35b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineFunction; 36b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineModuleInfo; 37b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass SDNodeOrdering; 38bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgValue; 39b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass TargetLowering; 40fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 418e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> { 428e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate: 437309be6735666143bd9835b275dc8501617a2591Gabor Greif mutable ilist_half_node<SDNode> Sentinel; 44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic: 45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman SDNode *createSentinel() const { 46c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif return static_cast<SDNode*>(&Sentinel); 47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman } 48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void destroySentinel(SDNode *) {} 49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 50c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif SDNode *provideInitialHead() const { return createSentinel(); } 51c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif SDNode *ensureHead(SDNode*) const { return createSentinel(); } 52f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif static void noteHead(SDNode*, SDNode*) {} 53c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void deleteNode(SDNode *) { 55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!"); 56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman } 57fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate: 58fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman static void createNode(const SDNode &); 59fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman}; 60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 61bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// SDDbgInfo - Keeps track of dbg_value information through SDISel. We do 62bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// not build SDNodes for these so as not to perturb the generated code; 63bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// instead the info is kept off to the side in this structure. Each SDNode may 64bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// have one or more associated dbg_value entries. This information is kept in 65bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// DbgValMap. 66bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgInfo { 67bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng SmallVector<SDDbgValue*, 32> DbgValues; 68d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> > DbgValMap; 69bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 70bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen void operator=(const SDDbgInfo&); // Do not implement. 71bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen SDDbgInfo(const SDDbgInfo&); // Do not implement. 72bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenpublic: 73bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen SDDbgInfo() {} 74bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 75bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng void add(SDDbgValue *V, const SDNode *Node = 0) { 76bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng if (Node) 77d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel DbgValMap[Node].push_back(V); 78bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng DbgValues.push_back(V); 79bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen } 80bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng 81bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen void clear() { 82d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel DbgValMap.clear(); 83bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng DbgValues.clear(); 84bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng } 85bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng 86bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng bool empty() const { 87bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng return DbgValues.empty(); 88bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen } 89bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng 90bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng SmallVector<SDDbgValue*,2> &getSDDbgValues(const SDNode *Node) { 91d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel return DbgValMap[Node]; 92bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen } 93bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng 94bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng typedef SmallVector<SDDbgValue*,32>::iterator DbgIterator; 95bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng DbgIterator DbgBegin() { return DbgValues.begin(); } 96bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng DbgIterator DbgEnd() { return DbgValues.end(); } 97bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen}; 98bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 9925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel { 10025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands Unrestricted, // Combine may create illegal operations and illegal types. 10125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands NoIllegalTypes, // Combine may create illegal operations but no illegal types. 10225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands NoIllegalOperations // Combine may only create legal operations and types. 10325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands}; 10425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 105cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greeneclass SelectionDAG; 106cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SDNode *N); 107cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SelectionDAG *DAG); 108cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene 109c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function 110c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction 111c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection. This DAG is constructed as the first step of instruction 112c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations 113c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications. 114c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// 115c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent 116c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation, 117c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a 118c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form. 119cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner/// 120cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG { 121063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner TargetLowering &TLI; 1227c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman MachineFunction *MF; 123ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner FunctionLoweringInfo &FLI; 12444c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey MachineModuleInfo *MMI; 1256e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel DwarfWriter *DW; 126d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson LLVMContext* Context; 127cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 128f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// EntryNode - The starting token. 129f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDNode EntryNode; 130f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 131f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// Root - The root of the entire DAG. 132f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDValue Root; 133cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 134213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner /// AllNodes - A linked list of nodes in the current DAG. 135fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman ilist<SDNode> AllNodes; 136fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 137f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use 138f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// pool allocation with recycling. 139f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode), 140f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman AlignOf<MostAlignedSDNode>::Alignment> 141f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman NodeAllocatorType; 142f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 143f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// NodeAllocator - Pool allocation for nodes. 144f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman NodeAllocatorType NodeAllocator; 145691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 146213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner /// CSEMap - This structure is used to memoize nodes, automatically performing 147d23b33435ae722ff5aa5ab97135a4f31041959e2Bob Wilson /// CSE with existing nodes when a duplicate is requested. 148583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey FoldingSet<SDNode> CSEMap; 149213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner 150f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// OperandAllocator - Pool allocation for machine-opcode SDNode operands. 151f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman BumpPtrAllocator OperandAllocator; 152f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 153e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// Allocator - Pool allocation for misc. objects that are created once per 154e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// SelectionDAG. 155e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman BumpPtrAllocator Allocator; 156e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman 157b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling /// SDNodeOrdering - The ordering of the SDNodes. It roughly corresponds to 158b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling /// the ordering of the original LLVM instructions. 159b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling SDNodeOrdering *Ordering; 160819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar 161bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen /// DbgInfo - Tracks dbg_value information through SDISel. 162bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen SDDbgInfo *DbgInfo; 163bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 164d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands /// VerifyNode - Sanity check the given node. Aborts if it is invalid. 165d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands void VerifyNode(SDNode *N); 166d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands 167c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// setGraphColorHelper - Implementation of setSubgraphColor. 168c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// Return whether we had to truncate the search. 169c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// 170c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif bool setSubgraphColorHelper(SDNode *N, const char *Color, 171c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif DenseSet<SDNode *> &visited, 172c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene int level, bool &printed); 173c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene 174819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar void operator=(const SelectionDAG&); // Do not implement. 175819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar SelectionDAG(const SelectionDAG&); // Do not implement. 176819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar 177cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic: 1787c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli); 179cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner ~SelectionDAG(); 180cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 1817c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// init - Prepare this SelectionDAG to process code in the given 1827c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// MachineFunction. 1837c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// 1845dcaceb0a6a7fcf508d9898547e10d374b0e4cd1Owen Anderson void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw); 1857c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman 1867c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman /// clear - Clear state and free memory necessary to make this 187f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// SelectionDAG ready to process a new block. 188f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman /// 1897c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman void clear(); 190f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 1917c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman MachineFunction &getMachineFunction() const { return *MF; } 192063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner const TargetMachine &getTarget() const; 193063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner TargetLowering &getTargetLoweringInfo() const { return TLI; } 194ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; } 19544c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey MachineModuleInfo *getMachineModuleInfo() const { return MMI; } 19683489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DwarfWriter *getDwarfWriter() const { return DW; } 197d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson LLVMContext *getContext() const {return Context; } 198cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 199ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'. 2001080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner /// 201462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman void viewGraph(const std::string &Title); 2020b12aef49087b57d276ed760a83525d1e2602144Dan Gohman void viewGraph(); 203fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 204ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG 205ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey std::map<const SDNode *, std::string> NodeGraphAttrs; 206ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif 2071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 208ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// clearGraphAttrs - Clear all previously defined node graph attributes. 209ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// Intended to be used from a debugging tool (eg. gdb). 210ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void clearGraphAttrs(); 211fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 212ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".) 213ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// 214ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void setGraphAttrs(const SDNode *N, const char *Attrs); 215fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 216ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".) 217ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// Used from getNodeAttributes. 218ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey const std::string getGraphAttrs(const SDNode *N) const; 219fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 220ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// setGraphColor - Convenience for setting node color attribute. 221ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey /// 222ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey void setGraphColor(const SDNode *N, const char *Color); 2231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 224c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// setGraphColor - Convenience for setting subgraph color attribute. 225c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene /// 226c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene void setSubgraphColor(SDNode *N, const char *Color); 227c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene 228fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman typedef ilist<SDNode>::const_iterator allnodes_const_iterator; 229b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); } 230b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_const_iterator allnodes_end() const { return AllNodes.end(); } 231fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman typedef ilist<SDNode>::iterator allnodes_iterator; 232b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_iterator allnodes_begin() { return AllNodes.begin(); } 233b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner allnodes_iterator allnodes_end() { return AllNodes.end(); } 234fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman ilist<SDNode>::size_type allnodes_size() const { 2350e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman return AllNodes.size(); 2360e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman } 237fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 238c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getRoot - Return the root tag of the SelectionDAG. 239cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 240475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue &getRoot() const { return Root; } 241cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 242c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getEntryNode - Return the token chain corresponding to the entry of the 243c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// function. 244f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman SDValue getEntryNode() const { 245f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman return SDValue(const_cast<SDNode *>(&EntryNode), 0); 246f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman } 247cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 248c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// setRoot - Set the current root tag of the SelectionDAG. 249cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 250475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue &setRoot(SDValue N) { 251825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson assert((!N.getNode() || N.getValueType() == MVT::Other) && 252acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman "DAG root value is not a chain!"); 253cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene if (N.getNode()) 254cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene checkForCycles(N.getNode()); 255cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene Root = N; 256cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene if (N.getNode()) 257cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene checkForCycles(this); 258cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene return Root; 259acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman } 260cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 2611d4d41411190dd9e62764e56713753d4155764ddNate Begeman /// Combine - This iterates over the nodes in the SelectionDAG, folding 26225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// certain types of nodes together, or eliminating superfluous nodes. The 26325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// Level argument controls whether Combine is allowed to produce nodes and 26425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// types that are illegal on the target. 26598a366d547772010e94609e4584489b3e5ce0043Bill Wendling void Combine(CombineLevel Level, AliasAnalysis &AA, 26698a366d547772010e94609e4584489b3e5ce0043Bill Wendling CodeGenOpt::Level OptLevel); 26725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 26801d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that 26925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// only uses types natively supported by the target. Returns "true" if it 27025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands /// made any changes. 27101d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// 27201d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// Note that this is an involved process that may invalidate pointers into 27301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner /// the graph. 27425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands bool LegalizeTypes(); 27525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands 276c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is 277c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// compatible with the target instruction selector, as indicated by the 278c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// TargetLowering object. 279cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 280c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// Note that this is an involved process that may invalidate pointers into 281c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// the graph. 282714efc63d4319b771d89a95aa7a42d400f03d8c9Dan Gohman void Legalize(CodeGenOpt::Level OptLevel); 283c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 2845c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG 2855c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// that only uses vector math operations supported by the target. This is 2865c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// necessary as a separate step from Legalize because unrolling a vector 2875c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// operation can introduce illegal types, which requires running 2885c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// LegalizeTypes again. 2895c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// 2905c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// This returns true if it made any changes; in that case, LegalizeTypes 2915c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// is called again before Legalize. 2925c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// 2935c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// Note that this is an involved process that may invalidate pointers into 2945c22c8074404797f1313b1334757254fb5c6487aEli Friedman /// the graph. 2955c22c8074404797f1313b1334757254fb5c6487aEli Friedman bool LegalizeVectors(); 2965c22c8074404797f1313b1334757254fb5c6487aEli Friedman 297d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner /// RemoveDeadNodes - This method deletes all unreachable nodes in the 298190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner /// SelectionDAG. 299190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner void RemoveDeadNodes(); 300130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng 301130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng /// DeleteNode - Remove the specified node from the system. This node must 302130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng /// have no referrers. 303130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng void DeleteNode(SDNode *N); 304130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng 30570046e920fa37989a041af663ada2b2b646e258fChris Lattner /// getVTList - Return an SDVTList that represents the list of values 30670046e920fa37989a041af663ada2b2b646e258fChris Lattner /// specified. 307e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDVTList getVTList(EVT VT); 308e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDVTList getVTList(EVT VT1, EVT VT2); 309e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3); 310e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4); 311e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDVTList getVTList(const EVT *VTs, unsigned NumVTs); 312fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 3131b1a49714ef26225a42199cf2930529f31868322Chris Lattner //===--------------------------------------------------------------------===// 31470046e920fa37989a041af663ada2b2b646e258fChris Lattner // Node creation methods. 31570046e920fa37989a041af663ada2b2b646e258fChris Lattner // 316e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstant(uint64_t Val, EVT VT, bool isTarget = false); 317e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstant(const APInt &Val, EVT VT, bool isTarget = false); 318e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstant(const ConstantInt &Val, EVT VT, bool isTarget = false); 319475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false); 320e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstant(uint64_t Val, EVT VT) { 321cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner return getConstant(Val, VT, true); 322cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner } 323e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstant(const APInt &Val, EVT VT) { 3246394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman return getConstant(Val, VT, true); 3256394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman } 326e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstant(const ConstantInt &Val, EVT VT) { 3274fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman return getConstant(Val, VT, true); 3284fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman } 329e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstantFP(double Val, EVT VT, bool isTarget = false); 330e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstantFP(const APFloat& Val, EVT VT, bool isTarget = false); 331e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstantFP(const ConstantFP &CF, EVT VT, bool isTarget = false); 332e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstantFP(double Val, EVT VT) { 333c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getConstantFP(Val, VT, true); 334c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 335e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstantFP(const APFloat& Val, EVT VT) { 336f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen return getConstantFP(Val, VT, true); 337f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen } 338e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstantFP(const ConstantFP &Val, EVT VT) { 3394fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman return getConstantFP(Val, VT, true); 3404fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman } 341e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getGlobalAddress(const GlobalValue *GV, EVT VT, 3422a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner int64_t offset = 0, bool isTargetGA = false, 3432a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner unsigned char TargetFlags = 0); 344e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetGlobalAddress(const GlobalValue *GV, EVT VT, 3452a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner int64_t offset = 0, 3462a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner unsigned char TargetFlags = 0) { 3472a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner return getGlobalAddress(GV, VT, offset, true, TargetFlags); 348cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner } 349e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getFrameIndex(int FI, EVT VT, bool isTarget = false); 350e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetFrameIndex(int FI, EVT VT) { 351c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner return getFrameIndex(FI, VT, true); 352c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 353e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getJumpTable(int JTI, EVT VT, bool isTarget = false, 354f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned char TargetFlags = 0); 355e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetJumpTable(int JTI, EVT VT, unsigned char TargetFlags = 0) { 356f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner return getJumpTable(JTI, VT, true, TargetFlags); 357c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 358e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstantPool(Constant *C, EVT VT, 359f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned Align = 0, int Offs = 0, bool isT=false, 360f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned char TargetFlags = 0); 361e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetConstantPool(Constant *C, EVT VT, 362f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned Align = 0, int Offset = 0, 363f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned char TargetFlags = 0) { 364f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner return getConstantPool(C, VT, Align, Offset, true, TargetFlags); 365c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner } 366e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConstantPool(MachineConstantPoolValue *C, EVT VT, 367f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned Align = 0, int Offs = 0, bool isT=false, 368f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner unsigned char TargetFlags = 0); 369475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getTargetConstantPool(MachineConstantPoolValue *C, 370e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT, unsigned Align = 0, 371f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner int Offset = 0, unsigned char TargetFlags=0) { 372f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner return getConstantPool(C, VT, Align, Offset, true, TargetFlags); 373d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 3748ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen // When generating a branch to a BB, we don't in general know enough 3758ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen // to provide debug info for the BB at that time, so keep this one around. 376475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getBasicBlock(MachineBasicBlock *MBB); 377e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl); 378e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getExternalSymbol(const char *Sym, EVT VT); 379e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getExternalSymbol(const char *Sym, DebugLoc dl, EVT VT); 380e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getTargetExternalSymbol(const char *Sym, EVT VT, 3811af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner unsigned char TargetFlags = 0); 382e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getValueType(EVT); 383e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getRegister(unsigned Reg, EVT VT); 3847561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner SDValue getEHLabel(DebugLoc dl, SDValue Root, MCSymbol *Label); 38529cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman SDValue getBlockAddress(BlockAddress *BA, EVT VT, 38629cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman bool isTarget = false, unsigned char TargetFlags = 0); 387c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 3880f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) { 389825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson return getNode(ISD::CopyToReg, dl, MVT::Other, Chain, 3900f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen getRegister(Reg, N.getValueType()), N); 3910f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 392cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 393e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // This version of the getCopyToReg method takes an extra operand, which 394e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // indicates that there is potentially an incoming flag value (if Flag is not 395e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // null) and that there should be a flag result. 3960f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N, 397be1be5ef0d5a2bb52746b6bd69d4b1e88513c81aEvan Cheng SDValue Flag) { 398825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList VTs = getVTList(MVT::Other, MVT::Flag); 3990f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag }; 400fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3); 4010f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 40266a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng 403475871a144eb604ddaf37503397ba0941442e5fbDan Gohman // Similar to last getCopyToReg() except parameter Reg is a SDValue 4040f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N, 4050f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Flag) { 406825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList VTs = getVTList(MVT::Other, MVT::Flag); 4070f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, Reg, N, Flag }; 408fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3); 4090f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 410fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 411e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT) { 412825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList VTs = getVTList(VT, MVT::Other); 4130f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, VT) }; 414fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2); 4150f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 416fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 417e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // This version of the getCopyFromReg method takes an extra operand, which 418e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // indicates that there is potentially an incoming flag value (if Flag is not 419e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner // null) and that there should be a flag result. 420e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT, 4210f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Flag) { 422825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList VTs = getVTList(VT, MVT::Other, MVT::Flag); 4230f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag }; 424fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2); 4250f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen } 42618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 427475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCondCode(ISD::CondCode Cond); 428cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 42977cdf30742284a173fe818417eb482224cdee8d4Mon P Wang /// Returns the ConvertRndSat Note: Avoid using this node because it may 43077cdf30742284a173fe818417eb482224cdee8d4Mon P Wang /// disappear in the future and most targets don't support it. 431e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getConvertRndSat(EVT VT, DebugLoc dl, SDValue Val, SDValue DTy, 4320f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue STy, 4330f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Rnd, SDValue Sat, ISD::CvtCode Code); 4349008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman 4359008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node. The number of 4369008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman /// elements in VT, which must be a vector type, must match the number of 4375a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman /// mask elements NumElts. A integer mask element equal to -1 is treated as 4389008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman /// undefined. 439e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2, 4409008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman const int *MaskElts); 44177cdf30742284a173fe818417eb482224cdee8d4Mon P Wang 4423a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands /// getSExtOrTrunc - Convert Op, which must be of integer type, to the 4433a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands /// integer type VT, by either sign-extending or truncating it. 4443a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands SDValue getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT); 4453a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands 4463a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands /// getZExtOrTrunc - Convert Op, which must be of integer type, to the 4473a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands /// integer type VT, by either zero-extending or truncating it. 4483a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands SDValue getZExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT); 4493a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands 4501ccae666f596d5aeca5c9942995763600b622062Chris Lattner /// getZeroExtendInReg - Return the expression required to zero extend the Op 4511ccae666f596d5aeca5c9942995763600b622062Chris Lattner /// value assuming it was the smaller SrcTy value. 452e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, EVT SrcTy); 453fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 4544c2454623841f05c6c665659b34c214950d12d7eBob Wilson /// getNOT - Create a bitwise NOT operation as (XOR Val, -1). 455e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNOT(DebugLoc DL, SDValue Val, EVT VT); 4564c2454623841f05c6c665659b34c214950d12d7eBob Wilson 4576a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have 458e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a 459e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// useful DebugLoc. 460475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) { 461825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList VTs = getVTList(MVT::Other, MVT::Flag); 462475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Ops[] = { Chain, Op }; 463fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(), 464fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman VTs, Ops, 2); 4656a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner } 4661ccae666f596d5aeca5c9942995763600b622062Chris Lattner 4670f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a 468e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have 469e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// a useful DebugLoc. 470475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, 471475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue InFlag) { 472825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag); 473475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SmallVector<SDValue, 4> Ops; 4740f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Chain); 4750f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Op1); 4760f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(Op2); 4770f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling Ops.push_back(InFlag); 478e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys, 479fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel &Ops[0], 480ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0)); 4810f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling } 4820f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling 483e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc. 484e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getUNDEF(EVT VT) { 485e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT); 486e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen } 487e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen 488b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node. This does 489b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen /// not have a useful DebugLoc. 490e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getGLOBAL_OFFSET_TABLE(EVT VT) { 491b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT); 492b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen } 493b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen 494c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getNode - Gets or creates the specified node. 495cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 496e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT); 497e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N); 498e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N1, SDValue N2); 499e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, 5007ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3); 501e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, 5027ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4); 503e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, 5047ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4, 5057ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N5); 506e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, 5077ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDUse *Ops, unsigned NumOps); 508e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, 5097ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 5107ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, 511e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson const std::vector<EVT> &ResultTys, 5127ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 513e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getNode(unsigned Opcode, DebugLoc DL, const EVT *VTs, unsigned NumVTs, 5147ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 5157ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 5167ade28cd62f5188951387e1056a46001388a21f9Bill Wendling const SDValue *Ops, unsigned NumOps); 5177ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs); 5187ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N); 5197ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 5207ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2); 5217ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 5227ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3); 5237ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 5247ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4); 5257ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, 5267ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N1, SDValue N2, SDValue N3, SDValue N4, 5277ade28cd62f5188951387e1056a46001388a21f9Bill Wendling SDValue N5); 528475871a144eb604ddaf37503397ba0941442e5fbDan Gohman 52998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman /// getStackArgumentTokenFactor - Compute a TokenFactor to force all 53098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman /// the incoming stack arguments to be loaded from the stack. This is 53198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman /// used in tail call lowering to protect stack arguments from being 53298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman /// clobbered. 53398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue getStackArgumentTokenFactor(SDValue Chain); 53498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 5350f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 5360f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, bool AlwaysInline, 5370f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const Value *DstSV, uint64_t DstSVOff, 53801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *SrcSV, uint64_t SrcSVOff); 5395c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 5400f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 5410f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, 5420f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen const Value *DstSV, uint64_t DstOSVff, 54301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *SrcSV, uint64_t SrcSVOff); 5445c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 5450f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src, 5460f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue Size, unsigned Align, 54701f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng const Value *DstSV, uint64_t DstSVOff); 5485c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola 5497cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner /// getSetCC - Helper function to make it easier to build SetCC's if you just 550475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// have an ISD::CondCode instead of an SDValue. 5517cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner /// 552e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS, 553d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling ISD::CondCode Cond) { 554d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond)); 555b43e9c196542acc80c9e4643809661065710848fNate Begeman } 556b43e9c196542acc80c9e4643809661065710848fNate Begeman 557b43e9c196542acc80c9e4643809661065710848fNate Begeman /// getVSetCC - Helper function to make it easier to build VSetCC's nodes 558475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// if you just have an ISD::CondCode instead of an SDValue. 559b43e9c196542acc80c9e4643809661065710848fNate Begeman /// 560e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getVSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS, 561d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling ISD::CondCode Cond) { 562d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond)); 5637cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner } 5649373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman 5659373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman /// getSelectCC - Helper function to make it easier to build SelectCC's if you 566475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// just have an ISD::CondCode instead of an SDValue. 5679373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman /// 568d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS, 569d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling SDValue True, SDValue False, ISD::CondCode Cond) { 570d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling return getNode(ISD::SELECT_CC, DL, True.getValueType(), 571d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling LHS, RHS, True, False, getCondCode(Cond)); 5729373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman } 573fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 574acc398c195a697795bff3245943d104eb19192b9Nate Begeman /// getVAArg - VAArg produces a result and token chain, and takes a pointer 575acc398c195a697795bff3245943d104eb19192b9Nate Begeman /// and a source value as input. 576e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getVAArg(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr, 5770f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen SDValue SV); 5787cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 579fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel /// getAtomic - Gets a node for an atomic op, produces result and chain and 580c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// takes 3 operands 581e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain, 582e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal, 583e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment=0); 584c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain, 585c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue Ptr, SDValue Cmp, SDValue Swp, 586c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman MachineMemOperand *MMO); 587ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth 588c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// getAtomic - Gets a node for an atomic op, produces result and chain and 589c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// takes 2 operands. 590e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain, 591e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Ptr, SDValue Val, const Value* PtrVal, 592e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Alignment = 0); 593c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain, 594c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue Ptr, SDValue Val, 595c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman MachineMemOperand *MMO); 596ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth 597c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a 598c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// result and takes a list of operands. Opcode may be INTRINSIC_VOID, 599c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// INTRINSIC_W_CHAIN, or a target-specific opcode with a value not 600c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// less than FIRST_TARGET_MEMORY_OPCODE. 601e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, 602e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson const EVT *VTs, unsigned NumVTs, 603e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps, 604e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT MemVT, const Value *srcValue, int SVOff, 605e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Align = 0, bool Vol = false, 606e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool ReadMem = true, bool WriteMem = true); 607c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang 608e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList, 609e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen const SDValue *Ops, unsigned NumOps, 610e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT MemVT, const Value *srcValue, int SVOff, 611e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen unsigned Align = 0, bool Vol = false, 612e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen bool ReadMem = true, bool WriteMem = true); 613c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang 614c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList, 615c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const SDValue *Ops, unsigned NumOps, 616c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman EVT MemVT, MachineMemOperand *MMO); 617c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 6184bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands /// getMergeValues - Create a MERGE_VALUES node from the given operands. 61954c94525f420cab274af60e98a77f081f96e59c2Dale Johannesen SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl); 620f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands 621c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// getLoad - Loads are not normal binary operators: their result type is not 622c3aae25116e66c177579b0b79182b09340b19753Chris Lattner /// determined by their operands, and they produce a value AND a token chain. 623cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner /// 624e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr, 6251e559443a17d1b335f697551c6263ba60d5dd827David Greene const Value *SV, int SVOffset, bool isVolatile, 6261e559443a17d1b335f697551c6263ba60d5dd827David Greene bool isNonTemporal, unsigned Alignment); 627e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT, 6281e559443a17d1b335f697551c6263ba60d5dd827David Greene SDValue Chain, SDValue Ptr, const Value *SV, 6291e559443a17d1b335f697551c6263ba60d5dd827David Greene int SVOffset, EVT MemVT, bool isVolatile, 6301e559443a17d1b335f697551c6263ba60d5dd827David Greene bool isNonTemporal, unsigned Alignment); 631e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base, 632e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Offset, ISD::MemIndexedMode AM); 633e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType, 634e6798372ea38e5ea24c26282a0d69aa6e3829854Nate Begeman EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset, 6358a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman const Value *SV, int SVOffset, EVT MemVT, 6361e559443a17d1b335f697551c6263ba60d5dd827David Greene bool isVolatile, bool isNonTemporal, unsigned Alignment); 637c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType, 638c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset, 639c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman EVT MemVT, MachineMemOperand *MMO); 6402d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 641ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng /// getStore - Helper function to build ISD::STORE nodes. 642ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng /// 643e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 6441e559443a17d1b335f697551c6263ba60d5dd827David Greene const Value *SV, int SVOffset, bool isVolatile, 6451e559443a17d1b335f697551c6263ba60d5dd827David Greene bool isNonTemporal, unsigned Alignment); 646c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 647c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman MachineMemOperand *MMO); 648e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 6491e559443a17d1b335f697551c6263ba60d5dd827David Greene const Value *SV, int SVOffset, EVT TVT, 6501e559443a17d1b335f697551c6263ba60d5dd827David Greene bool isNonTemporal, bool isVolatile, 6511e559443a17d1b335f697551c6263ba60d5dd827David Greene unsigned Alignment); 652c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr, 653c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman EVT TVT, MachineMemOperand *MMO); 654e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base, 655e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen SDValue Offset, ISD::MemIndexedMode AM); 656ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng 657101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// getSrcValue - Construct a node to track a Value* through the backend. 658475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getSrcValue(const Value *v); 65969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman 66092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands /// getShiftAmountOperand - Return the specified value casted to 66192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands /// the target's desired shift amount type. 66292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands SDValue getShiftAmountOperand(SDValue Op); 66392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands 664b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// UpdateNodeOperands - *Mutate* the specified node in-place to have the 665b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// specified operands. If the resultant node already exists in the DAG, 666b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// this does not modify the specified node, instead it returns the node that 667b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// already exists. If the resultant node does not exist in the DAG, the 668b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// input node is returned. As a degenerate case, if you specify the same 669b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner /// input operands as the node already has, the input node is returned. 670475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op); 671475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2); 672475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 673475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3); 674475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 675475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3, SDValue Op4); 676475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2, 677475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op3, SDValue Op4, SDValue Op5); 678475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue UpdateNodeOperands(SDValue N, 679475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 680fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 6811b95095857b78e12138c22e76c7936611c51355bChris Lattner /// SelectNodeTo - These are used for target selectors to *mutate* the 6821b95095857b78e12138c22e76c7936611c51355bChris Lattner /// specified node to have the specified return type, Target opcode, and 6831b95095857b78e12138c22e76c7936611c51355bChris Lattner /// operands. Note that target opcodes are stored as 684e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// ~TargetOpcode in the node opcode field. The resultant node is returned. 685e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT); 686e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, SDValue Op1); 687e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, 688475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2); 689e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, 690475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Op1, SDValue Op2, SDValue Op3); 691e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, 692475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 693e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, EVT VT2); 694e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 695e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, const SDValue *Ops, unsigned NumOps); 696e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 697e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, EVT VT3, const SDValue *Ops, unsigned NumOps); 698e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT1, 699e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, EVT VT3, EVT VT4, const SDValue *Ops, 70013d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling unsigned NumOps); 701e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 702e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, SDValue Op1); 703e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 704e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, SDValue Op1, SDValue Op2); 705e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 706e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3); 707e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, 708e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT2, EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3); 709cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs, 710475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 711694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng 712df51247725143acb781c224faffd848cc7cf95d8Chris Lattner /// MorphNodeTo - This *mutates* the specified node to have the specified 713e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// return type, opcode, and operands. 714e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, 715475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 716753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner 717602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman /// getMachineNode - These are used for target selectors to create a new node 718602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman /// with specified return type(s), MachineInstr opcode, and operands. 7196ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng /// 720602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman /// Note that getMachineNode returns the resultant node. If there is already 721602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman /// a node of the specified opcode and operands, it returns that node instead 722602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman /// of the current one. 723c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT); 724c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT, 725c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman SDValue Op1); 726c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT, 727c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman SDValue Op1, SDValue Op2); 728c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT, 729602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman SDValue Op1, SDValue Op2, SDValue Op3); 730c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT, 731602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman const SDValue *Ops, unsigned NumOps); 732c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2); 733c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 734602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman SDValue Op1); 735c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, 736602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT2, SDValue Op1, SDValue Op2); 737c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, 738602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3); 739c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 740602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman const SDValue *Ops, unsigned NumOps); 741c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 742602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT3, SDValue Op1, SDValue Op2); 743c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 744602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3); 745c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 746602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT3, const SDValue *Ops, unsigned NumOps); 747c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2, 748602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman EVT VT3, EVT VT4, const SDValue *Ops, unsigned NumOps); 749c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, 750c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const std::vector<EVT> &ResultTys, const SDValue *Ops, 751c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman unsigned NumOps); 752c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, SDVTList VTs, 753c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const SDValue *Ops, unsigned NumOps); 75408b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng 7556a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman /// getTargetExtractSubreg - A convenience function for creating 7566a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman /// TargetInstrInfo::EXTRACT_SUBREG nodes. 7576a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman SDValue getTargetExtractSubreg(int SRIdx, DebugLoc DL, EVT VT, 7586a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman SDValue Operand); 7596a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman 7605fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson /// getTargetInsertSubreg - A convenience function for creating 7615fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson /// TargetInstrInfo::INSERT_SUBREG nodes. 7625fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson SDValue getTargetInsertSubreg(int SRIdx, DebugLoc DL, EVT VT, 7635fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson SDValue Operand, SDValue Subreg); 7645fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson 76508b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng /// getNodeIfExists - Get the specified node if it's already available, or 76608b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng /// else return NULL. 76708b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs, 768475871a144eb604ddaf37503397ba0941442e5fbDan Gohman const SDValue *Ops, unsigned NumOps); 769fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 770f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// DAGUpdateListener - Clients of various APIs that cause global effects on 771f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// the DAG can optionally implement this interface. This allows the clients 772f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// to handle the various sorts of updates that happen. 773f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner class DAGUpdateListener { 774f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner public: 775f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner virtual ~DAGUpdateListener(); 776edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands 777edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// NodeDeleted - The node N that was deleted and, if E is not null, an 778edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// equivalent node E that replaced it. 779edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands virtual void NodeDeleted(SDNode *N, SDNode *E) = 0; 780edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands 781edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands /// NodeUpdated - The node N that was updated. 782f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner virtual void NodeUpdated(SDNode *N) = 0; 783f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner }; 784fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 785f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// RemoveDeadNode - Remove the specified node from the system. If any of its 786f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// operands then becomes dead, remove them as well. Inform UpdateListener 787f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// for each node deleted. 788f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0); 789fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 7900fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman /// RemoveDeadNodes - This method deletes the unreachable nodes in the 7910fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman /// given list, and any nodes that become unreachable as a result. 7920fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes, 7930fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman DAGUpdateListener *UpdateListener = 0); 7940fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman 7956542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 79626005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner /// This can cause recursive merging of nodes in the DAG. Use the first 79726005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner /// version if 'From' is known to have a single result, use the second 798c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman /// if you have two nodes with identical results (or if 'To' has a superset 799c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman /// of the results of 'From'), use the third otherwise. 8006542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner /// 801fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel /// These methods all take an optional UpdateListener, which (if not null) is 802f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// informed about nodes that are deleted and modified due to recursive 803f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// changes in the dag. 804fde3f3061d665babeb78443119a09876098fc35eChris Lattner /// 8059ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// These functions only replace all existing uses. It's possible that as 8069ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// these replacements are being performed, CSE may cause the From node 8079ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// to be given new uses. These new uses of From are left in place, and 8089ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// not automatically transfered to To. 8099ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman /// 810475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesWith(SDValue From, SDValue Op, 811f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 812fde3f3061d665babeb78443119a09876098fc35eChris Lattner void ReplaceAllUsesWith(SDNode *From, SDNode *To, 813f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 814475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesWith(SDNode *From, const SDValue *To, 815f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 816fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng 81780274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving 818f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner /// uses of other values produced by From.Val alone. 819475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesOfValueWith(SDValue From, SDValue To, 820f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner DAGUpdateListener *UpdateListener = 0); 82180274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner 822e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but 823e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// for multiple values at once. This correctly handles the case where 824e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman /// there is an overlap between the From values and the To values. 825475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, 826e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman unsigned Num, 827e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman DAGUpdateListener *UpdateListener = 0); 828e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman 829f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// AssignTopologicalOrder - Topological-sort the AllNodes list and a 830f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// assign a unique node id for each node in the DAG based on their 831f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman /// topological order. Returns the number of nodes. 832f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman unsigned AssignTopologicalOrder(); 833e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng 8348be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// RepositionNode - Move node N in the AllNodes list to be immediately 8358be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// before the given iterator Position. This may be used to update the 8368be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman /// topological ordering when the list of nodes is modified. 8378be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman void RepositionNode(allnodes_iterator Position, SDNode *N) { 8388be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman AllNodes.insert(Position, AllNodes.remove(N)); 8398be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman } 8408be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman 8411efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng /// isCommutativeBinOp - Returns true if the opcode is a commutative binary 8421efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng /// operation. 8431efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng static bool isCommutativeBinOp(unsigned Opcode) { 8444ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner // FIXME: This should get its info from the td file, so that we can include 8454ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner // target info. 8461efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng switch (Opcode) { 8471efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::ADD: 8481efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MUL: 8491efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MULHU: 8501efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::MULHS: 851b6c7437568f0472548ede2710458f52cfad4532eDan Gohman case ISD::SMUL_LOHI: 852b6c7437568f0472548ede2710458f52cfad4532eDan Gohman case ISD::UMUL_LOHI: 8531efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::FADD: 8541efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::FMUL: 8551efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::AND: 8561efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::OR: 8571efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::XOR: 85856e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman case ISD::SADDO: 85956e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman case ISD::UADDO: 860fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel case ISD::ADDC: 8611efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng case ISD::ADDE: return true; 8621efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng default: return false; 8631efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng } 8641efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng } 8651efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng 866b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling /// AssignOrdering - Assign an order to the SDNode. 8674533cac557cdcc13e7c990942758ec8338d9172aBill Wendling void AssignOrdering(const SDNode *SD, unsigned Order); 868b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling 8690777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling /// GetOrdering - Get the order for the SDNode. 8700777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling unsigned GetOrdering(const SDNode *SD) const; 8710777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling 872bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the 873bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng /// value is produced by SD. 874bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng void AddDbgValue(SDDbgValue *DB, SDNode *SD = 0); 875bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 876bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng /// GetDbgValues - Get the debug values which reference the given SDNode. 877bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng SmallVector<SDDbgValue*,2> &GetDbgValues(const SDNode* SD) { 878bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng return DbgInfo->getSDDbgValues(SD); 879bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng } 880bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 881bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng /// hasDebugValues - Return true if there are any SDDbgValue nodes associated 882bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng /// with this SelectionDAG. 883bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng bool hasDebugValues() const { return !DbgInfo->empty(); } 884bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 885bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); } 886bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng SDDbgInfo::DbgIterator DbgEnd() { return DbgInfo->DbgEnd(); } 887bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen 888cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner void dump() const; 889d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner 89037ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner /// CreateStackTemporary - Create a stack temporary, suitable for holding the 891364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang /// specified value type. If minAlign is specified, the slot size will have 892364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang /// at least that alignment. 893e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue CreateStackTemporary(EVT VT, unsigned minAlign = 1); 89447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands 89547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands /// CreateStackTemporary - Create a stack temporary suitable for holding 89647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands /// either of the specified value types. 897e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue CreateStackTemporary(EVT VT1, EVT VT2); 89847d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands 899fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel /// FoldConstantArithmetic - 900f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling SDValue FoldConstantArithmetic(unsigned Opcode, 901e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT, 902f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling ConstantSDNode *Cst1, 903f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling ConstantSDNode *Cst2); 904f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling 90551dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner /// FoldSetCC - Constant fold a setcc to true or false. 906e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue FoldSetCC(EVT VT, SDValue N1, 907ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen SDValue N2, ISD::CondCode Cond, DebugLoc dl); 908fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 9092e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We 9102e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman /// use this predicate to simplify operations downstream. 911475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const; 9122e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman 913ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We 914ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// use this predicate to simplify operations downstream. Op and Mask are 915ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// known to be the same type. 916475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0) 917ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman const; 918fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 919ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// ComputeMaskedBits - Determine which of the bits specified in Mask are 920ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// known to be either zero or one and return them in the KnownZero/KnownOne 921ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// bitsets. This code only analyzes bits in Mask, in order to short-circuit 922fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel /// processing. Targets can implement the computeMaskedBitsForTargetNode 923ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// method in the TargetLowering class to allow target nodes to be understood. 924475871a144eb604ddaf37503397ba0941442e5fbDan Gohman void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero, 925fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownOne, unsigned Depth = 0) const; 926fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman 927ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// ComputeNumSignBits - Return the number of times the sign bit of the 928ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// register is replicated into the other bits. We know that at least 1 bit 929ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// is always equal to the sign bit (itself), but other cases can give us 930ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// information. For example, immediately after an "SRA X, 2", we know that 931ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// the top 3 bits are all equal to each other, so we return 3. Targets can 932ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// implement the ComputeNumSignBitsForTarget method in the TargetLowering 933ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman /// class to allow target nodes to be understood. 934475871a144eb604ddaf37503397ba0941442e5fbDan Gohman unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const; 935a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 9368d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman /// isKnownNeverNan - Test whether the given SDValue is known to never be NaN. 9378d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman bool isKnownNeverNaN(SDValue Op) const; 9388d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman 939e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman /// isKnownNeverZero - Test whether the given SDValue is known to never be 940e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman /// positive or negative Zero. 941e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman bool isKnownNeverZero(SDValue Op) const; 942e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman 943e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman /// isEqualTo - Test whether two SDValues are known to compare equal. This 944e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman /// is true if they are the same value, or if one is negative zero and the 945e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman /// other positive zero. 946e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman bool isEqualTo(SDValue A, SDValue B) const; 947e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman 948475871a144eb604ddaf37503397ba0941442e5fbDan Gohman /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has 949a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// been verified as a debug information descriptor. 950475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool isVerifiedDebugInfoDesc(SDValue Op) const; 95177f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng 95277f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng /// getShuffleScalarElt - Returns the scalar element that will make up the ith 95377f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng /// element of the result of the vector shuffle. 9545a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman SDValue getShuffleScalarElt(const ShuffleVectorSDNode *N, unsigned Idx); 955fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 956cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// UnrollVectorOp - Utility function used by legalize and lowering to 957cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// "unroll" a vector operation by splitting out the scalars and operating 958cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// on each element individually. If the ResNE is 0, fully unroll the vector 959cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// op. If ResNE is less than the width of the vector op, unroll up to ResNE. 960cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// If the ResNE is greater than the width of the vector op, unroll the 961cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang /// vector op and fill the end of the resulting vector with UNDEFS. 962cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0); 963cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang 96464fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a 96564fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng /// location that is 'Dist' units away from the location that the 'Base' load 96664fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng /// is loading from. 96764fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng bool isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base, 96864fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng unsigned Bytes, int Dist) const; 96964fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng 970f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if 971f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng /// it cannot be inferred. 9727ced2e0b304e76ab746c7d9a54ad8d4930445a38Evan Cheng unsigned InferPtrAlignment(SDValue Ptr) const; 973f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng 974d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate: 975095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman bool RemoveNodeFromCSEMaps(SDNode *N); 976399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener); 977475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos); 978475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2, 979a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner void *&InsertPos); 980475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps, 981a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner void *&InsertPos); 982b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner 983fde3f3061d665babeb78443119a09876098fc35eChris Lattner void DeleteNodeNotInCSEMaps(SDNode *N); 984c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman void DeallocateNode(SDNode *N); 9859c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman 986e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson unsigned getEVTAlignment(EVT MemoryVT) const; 987f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman 988f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman void allnodes_clear(); 989fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 990101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// VTList - List of non-single value types. 991e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman std::vector<SDVTList> VTList; 992fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel 993101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman /// CondCodeNodes - Maps to auto-CSE operations. 9947cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner std::vector<CondCodeSDNode*> CondCodeNodes; 9951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 99615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner std::vector<SDNode*> ValueTypeNodes; 997e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson std::map<EVT, SDNode*, EVT::compareRawBits> ExtendedValueTypeNodes; 998056292fd738924f3f7703725d8f630983794b5a5Bill Wendling StringMap<SDNode*> ExternalSymbols; 9991af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner 10001af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols; 1001cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner}; 1002cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 10031080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> { 10041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SelectionDAG::allnodes_iterator nodes_iterator; 10051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static nodes_iterator nodes_begin(SelectionDAG *G) { 10061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return G->allnodes_begin(); 10071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 10081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static nodes_iterator nodes_end(SelectionDAG *G) { 10091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return G->allnodes_end(); 10101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 10111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 10121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 1013b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner} // end namespace llvm 1014cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 1015cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif 1016