SelectionDAG.h revision d1474d09cbe5fdeec8ba0d6c6b52f316f3422532
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"
2298a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h"
23acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
245892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector>
25322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
26eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
29fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis;
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TargetLowering;
32fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineModuleInfo;
336e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patelclass DwarfWriter;
34fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineFunction;
35fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineConstantPoolValue;
36fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo;
37fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
388e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
398e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate:
409c01f2dd0b20e09f4edef832620a188eda62ff5aDan Gohman  mutable ilist_node<SDNode> Sentinel;
41fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic:
42fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  SDNode *createSentinel() const {
43c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif    return static_cast<SDNode*>(&Sentinel);
44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void destroySentinel(SDNode *) {}
46fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
47c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *provideInitialHead() const { return createSentinel(); }
48c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *ensureHead(SDNode*) const { return createSentinel(); }
49f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif  static void noteHead(SDNode*, SDNode*) {}
50c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif
51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void deleteNode(SDNode *) {
52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void createNode(const SDNode &);
56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman};
57c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
5825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel {
5925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  Unrestricted,   // Combine may create illegal operations and illegal types.
6025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalTypes, // Combine may create illegal operations but no illegal types.
6125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalOperations // Combine may only create legal operations and types.
6225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands};
6325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
64c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
65c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
66c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
67c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
68c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
69c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
70c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
71c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
73c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
74cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
75cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
76063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
777c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
78ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &FLI;
7944c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI;
806e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel  DwarfWriter *DW;
81d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext* Context;
82cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
83f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
84f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
85f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
86f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
87f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
88cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
89213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
90fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
91fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
92f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
93f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
94f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
95f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
96f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
97f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
98f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
99f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
100691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
101213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
102213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSE with existing nodes with a duplicate is requested.
103583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
104213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
105f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
106f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
107f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
108e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
109e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
110e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
111e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
112d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  /// VerifyNode - Sanity check the given node.  Aborts if it is invalid.
113d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  void VerifyNode(SDNode *N);
114d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands
115c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
116c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
117c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
118c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  bool setSubgraphColorHelper(SDNode *N, const char *Color,
119c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif                              DenseSet<SDNode *> &visited,
120c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
121c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
122cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
1237c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
124cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
125cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1267c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
1277c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
1287c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
129d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw,
130d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson            LLVMContext* C);
1317c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman
1327c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// clear - Clear state and free memory necessary to make this
133f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// SelectionDAG ready to process a new block.
134f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  ///
1357c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void clear();
136f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
1377c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction &getMachineFunction() const { return *MF; }
138063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
139063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
140ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
14144c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
14283489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel  DwarfWriter *getDwarfWriter() const { return DW; }
143d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext *getContext() const {return Context; }
144cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
145ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
1461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
147462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
1480b12aef49087b57d276ed760a83525d1e2602144Dan Gohman  void viewGraph();
149fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
150ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
151ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
152ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
1531080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
154ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
155ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
156ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
157fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
158ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
159ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
160ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
161fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
162ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
163ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
164ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
165fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
166ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
167ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
168ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
1691080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
170c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColor - Convenience for setting subgraph color attribute.
171c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
172c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  void setSubgraphColor(SDNode *N, const char *Color);
173c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
174fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
175b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
176b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
177fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::iterator allnodes_iterator;
178b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
179b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
180fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode>::size_type allnodes_size() const {
1810e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
1820e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
183fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
184c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
185cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
186475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
187cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
188c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
189c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
190f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue getEntryNode() const {
191f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    return SDValue(const_cast<SDNode *>(&EntryNode), 0);
192f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  }
193cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
194c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
195cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
196475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
197ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    assert((!N.getNode() || N.getValueType() == MVT::Other) &&
198acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
199acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman    return Root = N;
200acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
201cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2021d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
20325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
20425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
20525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
20698a366d547772010e94609e4584489b3e5ce0043Bill Wendling  void Combine(CombineLevel Level, AliasAnalysis &AA,
20798a366d547772010e94609e4584489b3e5ce0043Bill Wendling               CodeGenOpt::Level OptLevel);
20825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
20901d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
21025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
21125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
21201d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
21301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
21401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
21525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
21625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
217c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
218c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
219c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
220cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
221c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
222c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
22398a366d547772010e94609e4584489b3e5ce0043Bill Wendling  void Legalize(bool TypesNeedLegalizing, CodeGenOpt::Level OptLevel);
224c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
2255c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG
2265c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// that only uses vector math operations supported by the target.  This is
2275c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// necessary as a separate step from Legalize because unrolling a vector
2285c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// operation can introduce illegal types, which requires running
2295c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeTypes again.
2305c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
2315c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// This returns true if it made any changes; in that case, LegalizeTypes
2325c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// is called again before Legalize.
2335c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
2345c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// Note that this is an involved process that may invalidate pointers into
2355c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// the graph.
2365c22c8074404797f1313b1334757254fb5c6487aEli Friedman  bool LegalizeVectors();
2375c22c8074404797f1313b1334757254fb5c6487aEli Friedman
238d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
239190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
240190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
241130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
242130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
243130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
244130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
245130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
24670046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
24770046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
24883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT);
24983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2);
25083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
25113d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
25283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
253fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
2541b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
25570046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
25670046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
257475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
258475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
2594fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
260475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
261475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(uint64_t Val, MVT VT) {
262cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
263cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
264475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(const APInt &Val, MVT VT) {
2656394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
2666394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
2674fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
2684fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
2694fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
270475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
271475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
2724fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
273475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(double Val, MVT VT) {
274c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
275c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
276475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
277f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
278f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
2794fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
2804fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
2814fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
2832a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           int64_t offset = 0, bool isTargetGA = false,
2842a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           unsigned char TargetFlags = 0);
285475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
2862a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 int64_t offset = 0,
2872a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 unsigned char TargetFlags = 0) {
2882a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner    return getGlobalAddress(GV, VT, offset, true, TargetFlags);
289cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
290475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
291475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetFrameIndex(int FI, MVT VT) {
292c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
293c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
294f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false,
295f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                       unsigned char TargetFlags = 0);
296f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner  SDValue getTargetJumpTable(int JTI, MVT VT, unsigned char TargetFlags = 0) {
297f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getJumpTable(JTI, VT, true, TargetFlags);
298c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
299475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(Constant *C, MVT VT,
300f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
301f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
302475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(Constant *C, MVT VT,
303f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned Align = 0, int Offset = 0,
304f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned char TargetFlags = 0) {
305f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
306c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
307475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
308f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
309f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
310475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
31183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                                  MVT VT, unsigned Align = 0,
312f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                  int Offset = 0, unsigned char TargetFlags=0) {
313f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
314d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
3158ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // When generating a branch to a BB, we don't in general know enough
3168ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // to provide debug info for the BB at that time, so keep this one around.
317475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
318e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
319056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  SDValue getExternalSymbol(const char *Sym, MVT VT);
320e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
3211af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  SDValue getTargetExternalSymbol(const char *Sym, MVT VT,
3221af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner                                  unsigned char TargetFlags = 0);
323475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getArgFlags(ISD::ArgFlagsTy Flags);
324475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getValueType(MVT);
325475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getRegister(unsigned Reg, MVT VT);
326af29a5235d3a1a09e9fc2989a5d504f00fa9aaf3Chris Lattner  SDValue getDbgStopPoint(DebugLoc DL, SDValue Root,
327af29a5235d3a1a09e9fc2989a5d504f00fa9aaf3Chris Lattner                          unsigned Line, unsigned Col, Value *CU);
328fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
329e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                   unsigned LabelID);
330c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
3310f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
3320f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
3330f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   getRegister(Reg, N.getValueType()), N);
3340f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
335cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
336e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
337e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
338e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
3390f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
340be1be5ef0d5a2bb52746b6bd69d4b1e88513c81aEvan Cheng                       SDValue Flag) {
341fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
3420f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
343fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
3440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
34566a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
346475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
3470f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
3480f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                         SDValue Flag) {
349fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
3500f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, Reg, N, Flag };
351fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
3520f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
353fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
3540f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
355fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    SDVTList VTs = getVTList(VT, MVT::Other);
3560f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
357fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
3580f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
359fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
360e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
361e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
362e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
3630f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
3640f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Flag) {
365fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    SDVTList VTs = getVTList(VT, MVT::Other, MVT::Flag);
3660f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
367fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2);
3680f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
36918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
370475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
371cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
37277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
37377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
3740f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
3750f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue STy,
3760f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
3779008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
3789008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node.  The number of
3799008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// elements in VT, which must be a vector type, must match the number of
3805a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  /// mask elements NumElts.  A integer mask element equal to -1 is treated as
3819008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// undefined.
3829008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  SDValue getVectorShuffle(MVT VT, DebugLoc dl, SDValue N1, SDValue N2,
3839008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                           const int *MaskElts);
38477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
3851ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
3861ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
3876ce610f04bb232ce8b57e50e885f30f65d19e1a6Bill Wendling  SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
388fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
3894c2454623841f05c6c665659b34c214950d12d7eBob Wilson  /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
39041b9d278add97c744930aa2a0048ff1c01e48c4fBill Wendling  SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
3914c2454623841f05c6c665659b34c214950d12d7eBob Wilson
3926a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
393e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// a flag result (to ensure it's not CSE'd).  CALLSEQ_START does not have a
394e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// useful DebugLoc.
395475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
396fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
397475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
398fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
399fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman                   VTs, Ops, 2);
4006a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
4011ccae666f596d5aeca5c9942995763600b622062Chris Lattner
4020f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
403e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// flag result (to ensure it's not CSE'd).  CALLSEQ_END does not have
404e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// a useful DebugLoc.
405475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
406475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue InFlag) {
4070f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
408475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
4090f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
4100f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
4110f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
4120f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(InFlag);
413e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
414fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel                   &Ops[0],
415ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif                   (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
4160f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
4170f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
418e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// getUNDEF - Return an UNDEF node.  UNDEF does not have a useful DebugLoc.
419e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  SDValue getUNDEF(MVT VT) {
420e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
421e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  }
422e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen
423b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node.  This does
424b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// not have a useful DebugLoc.
425b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  SDValue getGLOBAL_OFFSET_TABLE(MVT VT) {
426b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen    return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT);
427b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  }
428b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen
429c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
430cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
4317ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
4327ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
4337ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
4347ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4357ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
4367ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4377ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
4387ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4397ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
4407ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
4417ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4427ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
4437ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4447ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4457ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL,
4467ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const std::vector<MVT> &ResultTys,
4477ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4487ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
4497ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4507ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4517ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4527ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
4537ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
4547ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4557ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2);
4567ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4577ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
4587ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4597ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
4607ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4617ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
4627ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
463475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
4640f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
4650f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    SDValue Size, unsigned Align, bool AlwaysInline,
4660f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    const Value *DstSV, uint64_t DstSVOff,
46701f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *SrcSV, uint64_t SrcSVOff);
4685c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
4690f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
4700f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                     SDValue Size, unsigned Align,
4710f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                     const Value *DstSV, uint64_t DstOSVff,
47201f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *SrcSV, uint64_t SrcSVOff);
4735c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
4740f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
4750f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    SDValue Size, unsigned Align,
47601f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff);
4775c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
4787cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
479475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
4807cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
481d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
482d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   ISD::CondCode Cond) {
483d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
484b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
485b43e9c196542acc80c9e4643809661065710848fNate Begeman
486b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
487475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
488b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
489d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
490d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                    ISD::CondCode Cond) {
491d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
4927cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
4939373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
4949373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
495475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
4969373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
497d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
498d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                      SDValue True, SDValue False, ISD::CondCode Cond) {
499d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DL, True.getValueType(),
500d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
5019373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
502fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
503acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
504acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
5050f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
5060f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   SDValue SV);
5077cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
508fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// getAtomic - Gets a node for an atomic op, produces result and chain and
509c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
510fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
511e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
512e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment=0);
513ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
514c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
515c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 2 operands.
516e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
517e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Val, const Value* PtrVal,
518e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment = 0);
519ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
520c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
521c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// result and takes a list of operands.
522e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
523e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const MVT *VTs, unsigned NumVTs,
524e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
525e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              MVT MemVT, const Value *srcValue, int SVOff,
526e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
527e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
528c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
529e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
530e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
531e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              MVT MemVT, const Value *srcValue, int SVOff,
532e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
533e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
534c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
5354bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
53654c94525f420cab274af60e98a77f081f96e59c2Dale Johannesen  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
537f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
538095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  /// getCall - Create a CALL node from the given information.
539095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  ///
540e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
541e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                  bool IsTailCall, bool isInreg, SDVTList VTs,
5426b61cd185eeb90bec93f042535594132ae1f0f41Tilmann Scheller                  const SDValue *Operands, unsigned NumOperands,
5436b61cd185eeb90bec93f042535594132ae1f0f41Tilmann Scheller                  unsigned NumFixedArgs);
544095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman
545c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
546c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
547cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
548e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
549e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    const Value *SV, int SVOffset, bool isVolatile=false,
550e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment=0);
551e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
552e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       SDValue Chain, SDValue Ptr, const Value *SV,
553e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       int SVOffset, MVT EVT, bool isVolatile=false,
554e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       unsigned Alignment=0);
555e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
556e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
557e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
558e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    MVT VT, SDValue Chain,
559e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Offset,
560e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    const Value *SV, int SVOffset, MVT EVT,
561e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    bool isVolatile=false, unsigned Alignment=0);
5622d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
563ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
564ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
565e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
566e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                     const Value *SV, int SVOffset, bool isVolatile=false,
567e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                     unsigned Alignment=0);
568e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
569e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                          const Value *SV, int SVOffset, MVT TVT,
570e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                          bool isVolatile=false, unsigned Alignment=0);
571e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
572e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
573ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
574101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getSrcValue - Construct a node to track a Value* through the backend.
575475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
57669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
577101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getMemOperand - Construct a node to track a memory reference
578101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// through the backend.
579475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemOperand(const MachineMemOperand &MO);
580cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
58192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// getShiftAmountOperand - Return the specified value casted to
58292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// the target's desired shift amount type.
58392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  SDValue getShiftAmountOperand(SDValue Op);
58492abc62399881ba9c525be80362c134ad836e2d9Duncan Sands
585b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
586b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
587b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
588b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
589b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
590b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
591475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op);
592475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
593475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
594475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
595475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
596475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
597475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
598475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
599475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N,
600475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
601fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
6021b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
6031b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
6041b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
605e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
60683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
607475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
60883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
609475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
61083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
611475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
61283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
613475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
614cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
615cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
616475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, const SDValue *Ops, unsigned NumOps);
617cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
618475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
61913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
62013d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
62113d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       unsigned NumOps);
622cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
623475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1);
62483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
625475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2);
62683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
627475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
62813d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
62913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
630cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
631475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
632694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
633e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// MorphNodeTo - These *mutate* the specified node to have the specified
634e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
635e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
636475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
637e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
638475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2);
639e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
640475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2, SDValue Op3);
641e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
642475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
643e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
644e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
645475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, const SDValue *Ops, unsigned NumOps);
646e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
647475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
648e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
649475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1);
650e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
651475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2);
652e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
653475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
654e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
655475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
656753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
6576ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// getTargetNode - These are used for target selectors to create a new node
6586ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// with specified return type(s), target opcode, and operands.
6596ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
6606ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// Note that getTargetNode returns the resultant node.  If there is already a
6616ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// node of the specified opcode and operands, it returns that node instead of
6626ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// the current one.
66356ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
66456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
665fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
66656ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        SDValue Op2);
66756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
668e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2, SDValue Op3);
66956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
670e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
67156ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
672fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
67356ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        SDValue Op1);
67456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
675e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        MVT VT2, SDValue Op1, SDValue Op2);
67656ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
677e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
67856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
679e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
68056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
681e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2);
68256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
683e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2, SDValue Op3);
68456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
685e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
68656ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
68756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        MVT VT4, const SDValue *Ops, unsigned NumOps);
68856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
68956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        const std::vector<MVT> &ResultTys, const SDValue *Ops,
69056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        unsigned NumOps);
69108b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
69208b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
69308b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
69408b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
695475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
696fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
697f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
698f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
699f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
700f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
701f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
702f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
703edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
704edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
705edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
706edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
707edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
708edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
709f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
710f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
711fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
712f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
713f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
714f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
715f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
716fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
7170fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
7180fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
7190fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
7200fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
7210fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
7226542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
72326005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
72426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
725c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// if you have two nodes with identical results (or if 'To' has a superset
726c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// of the results of 'From'), use the third otherwise.
7276542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
728fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// These methods all take an optional UpdateListener, which (if not null) is
729f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
730f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
731fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
7329ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// These functions only replace all existing uses. It's possible that as
7339ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// these replacements are being performed, CSE may cause the From node
7349ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// to be given new uses. These new uses of From are left in place, and
7359ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// not automatically transfered to To.
7369ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  ///
737475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
738f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
739fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
740f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
741475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
742f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
743fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
74480274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
745f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
746475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
747f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
74880274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
749e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
750e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
751e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
752475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
753e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
754e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
755e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
756f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
757f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
758f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
759f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
760e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
7618be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
7628be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
7638be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
7648be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
7658be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
7668be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
7678be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
7681efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
7691efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
7701efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
7714ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
7724ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
7731efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
7741efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
7751efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
7761efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
7771efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
778b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
779b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
7801efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
7811efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
7821efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
7831efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
7841efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
78556e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::SADDO:
78656e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::UADDO:
787fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    case ISD::ADDC:
7881efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
7891efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
7901efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
7911efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
7921efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
793cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
794d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
79537ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
796364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
797364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
798475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
79947d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
80047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// CreateStackTemporary - Create a stack temporary suitable for holding
80147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// either of the specified value types.
80247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  SDValue CreateStackTemporary(MVT VT1, MVT VT2);
80347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
804fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// FoldConstantArithmetic -
805f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  SDValue FoldConstantArithmetic(unsigned Opcode,
806f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 MVT VT,
807f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst1,
808f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst2);
809f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
81051dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
811475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue FoldSetCC(MVT VT, SDValue N1,
812ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                    SDValue N2, ISD::CondCode Cond, DebugLoc dl);
813fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
8142e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
8152e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
816475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
8172e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
818ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
819ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
820ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
821475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
822ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
823fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
824ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
825ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
826ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
827fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
828ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
829475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
830fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
831fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
832ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
833ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
834ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
835ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
836ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
837ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
838ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
839475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
840a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
841475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
842a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng  /// been verified as a debug information descriptor.
843475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool isVerifiedDebugInfoDesc(SDValue Op) const;
84477f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng
84577f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// getShuffleScalarElt - Returns the scalar element that will make up the ith
84677f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// element of the result of the vector shuffle.
8475a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  SDValue getShuffleScalarElt(const ShuffleVectorSDNode *N, unsigned Idx);
848fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
849d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
850095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
851399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman  void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
852475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
853475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
854a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
855475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
856a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
857b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
858fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
859c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman  void DeallocateNode(SDNode *N);
8609c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
8619c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman  unsigned getMVTAlignment(MVT MemoryVT) const;
862f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
863f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
864fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
865101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// VTList - List of non-single value types.
866e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
867fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
868101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// CondCodeNodes - Maps to auto-CSE operations.
8697cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
8701cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
87115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
8728e4eb09b1e3571965f49edcdfb56b1375b1b7551Duncan Sands  std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
873056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
8741af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner
8751af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
876cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
877cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
8781080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
8791080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
8801080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
8811080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
8821080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
8831080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
8841080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
8851080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
8861080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
8871080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
888b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
889cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
890cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
891