SelectionDAG.h revision 41b9d278add97c744930aa2a0048ff1c01e48c4f
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// This file declares the SelectionDAG class, and transitively defines the
11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// SDNode class and subclasses.
12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner//===----------------------------------------------------------------------===//
14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAG_H
16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#define LLVM_CODEGEN_SELECTIONDAG_H
17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
18fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h"
19c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene#include "llvm/ADT/DenseSet.h"
20583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/ADT/FoldingSet.h"
214b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h"
22583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h"
23b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
24acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
255892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector>
26322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
27eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis;
32fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TargetLowering;
33fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TargetMachine;
34fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineModuleInfo;
356e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patelclass DwarfWriter;
36fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineFunction;
37fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineConstantPoolValue;
38fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo;
39fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
408e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
418e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate:
42fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  mutable SDNode Sentinel;
43fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic:
44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist_traits() : Sentinel(ISD::DELETED_NODE, SDVTList()) {}
45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
46fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  SDNode *createSentinel() const {
47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    return &Sentinel;
48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void destroySentinel(SDNode *) {}
50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void deleteNode(SDNode *) {
52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void createNode(const SDNode &);
56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman};
57c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
5825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel {
5925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  Unrestricted,   // Combine may create illegal operations and illegal types.
6025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalTypes, // Combine may create illegal operations but no illegal types.
6125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalOperations // Combine may only create legal operations and types.
6225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands};
6325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
64c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
65c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
66c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
67c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
68c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
69c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
70c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
71c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
73c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
74cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
75cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
76063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
777c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
78ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &FLI;
7944c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI;
806e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel  DwarfWriter *DW;
81cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
82fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen  /// CurDebugLoc - current file + line number.  Changes as we build the DAG.
83fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen  DebugLoc CurDebugLoc;
84fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen
85f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
86f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
87f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
88f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
89f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
90cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
91213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
92fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
93fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
94f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
95f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
96f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
97f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
98f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
99f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
100f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
101f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
102691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
103213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
104213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSE with existing nodes with a duplicate is requested.
105583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
106213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
107f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
108f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
109f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
110e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
111e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
112e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
113e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
114d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  /// VerifyNode - Sanity check the given node.  Aborts if it is invalid.
115d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  void VerifyNode(SDNode *N);
116d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands
117c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
118c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
119c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
120c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  bool setSubgraphColorHelper(SDNode *N, const char *Color, DenseSet<SDNode *> &visited,
121c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
122c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
123cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
1247c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
125cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
126cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1277c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
1287c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
1297c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
1306e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel  void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
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; }
143fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen  DebugLoc getCurDebugLoc() const { return CurDebugLoc; }
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();
149ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
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();
157ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
158ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
159ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
160ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
161ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
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;
165ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
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  }
183b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
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
202fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen  void setCurDebugLoc(DebugLoc dl) { CurDebugLoc = dl; }
203fa42dea48b76b32a17f2d777115790f364f1984fDale Johannesen
2041d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
20525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
20625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
20725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
20825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  void Combine(CombineLevel Level, AliasAnalysis &AA, bool Fast);
20925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
21001d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
21125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
21225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
21301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
21401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
21501d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
21625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
21725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
218c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
219c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
220c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
221cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
222c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
223c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
224b6862bbe34be4a832f709596f8dc971ab9895b06Duncan Sands  void Legalize(bool TypesNeedLegalizing);
225c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
226d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
227190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
228190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
229130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
230130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
231130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
232130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
233130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
23470046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
23570046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
23683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT);
23783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2);
23883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
23913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
24083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
24170046e920fa37989a041af663ada2b2b646e258fChris Lattner
24270046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getNodeValueTypes - These are obsolete, use getVTList instead.
24383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT) {
24470046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT).VTs;
24570046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
24683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2) {
24770046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2).VTs;
24870046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
24983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) {
25070046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2, VT3).VTs;
25170046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
25213d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3, MVT VT4) {
25313d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling    return getVTList(VT1, VT2, VT3, VT4).VTs;
25413d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  }
255f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) {
25613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling    return getVTList(&vtList[0], (unsigned)vtList.size()).VTs;
25770046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
25870046e920fa37989a041af663ada2b2b646e258fChris Lattner
25970046e920fa37989a041af663ada2b2b646e258fChris Lattner
2601b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
26170046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
26270046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
263475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
264475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
2654fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
266475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
267475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(uint64_t Val, MVT VT) {
268cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
269cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
270475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(const APInt &Val, MVT VT) {
2716394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
2726394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
2734fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
2744fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
2754fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
276475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
277475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
2784fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
279475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(double Val, MVT VT) {
280c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
281c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
283f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
284f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
2854fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
2864fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
2874fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
288475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
2896520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman                           int64_t offset = 0, bool isTargetGA = false);
290475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
2916520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman                                 int64_t offset = 0) {
292cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getGlobalAddress(GV, VT, offset, true);
293cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
294475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
295475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetFrameIndex(int FI, MVT VT) {
296c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
297c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
298475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false);
299475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetJumpTable(int JTI, MVT VT) {
300c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getJumpTable(JTI, VT, true);
301c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
302475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(Constant *C, MVT VT,
303c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                            unsigned Align = 0, int Offs = 0, bool isT=false);
304475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(Constant *C, MVT VT,
305c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                                  unsigned Align = 0, int Offset = 0) {
306c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantPool(C, VT, Align, Offset, true);
307c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
308475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
309d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                            unsigned Align = 0, int Offs = 0, bool isT=false);
310475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
31183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                                  MVT VT, unsigned Align = 0,
312d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                                  int Offset = 0) {
313d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return getConstantPool(C, VT, Align, Offset, true);
314d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
315475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
316e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
317056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  SDValue getExternalSymbol(const char *Sym, MVT VT);
318e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
319056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
320e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
321475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getArgFlags(ISD::ArgFlagsTy Flags);
322475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getValueType(MVT);
323475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getRegister(unsigned Reg, MVT VT);
324475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
32583489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel                          Value *CU);
326475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
327e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
328e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                   unsigned LabelID);
329c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
330475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
331d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyToReg, MVT::Other, Chain,
332d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner                   getRegister(Reg, N.getValueType()), N);
333cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
334cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
335e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
336e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
337e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
338475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N,
339475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
34083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
341475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
342ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
343e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
34466a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
345475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
346475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, SDValue Reg, SDValue N,
347475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
34883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
349475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, Reg, N, Flag };
350ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
35166a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  }
352e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
353475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT) {
35483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
355475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
3562fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyFromReg, VTs, 2, Ops, 2);
35718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  }
358e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
359e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
360e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
361e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
362475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT,
363475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Flag) {
36483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
365475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
366ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyFromReg, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
367e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
36818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
369475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
370cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
37177cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
37277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
37377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  SDValue getConvertRndSat(MVT VT, SDValue Val, SDValue DTy, SDValue STy,
37477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
37577cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
3761ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
3771ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
378475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
3796a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner
3804c2454623841f05c6c665659b34c214950d12d7eBob Wilson  /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
3814c2454623841f05c6c665659b34c214950d12d7eBob Wilson  SDValue getNOT(SDValue Val, MVT VT);
38241b9d278add97c744930aa2a0048ff1c01e48c4fBill Wendling  SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
3834c2454623841f05c6c665659b34c214950d12d7eBob Wilson
3846a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
3856a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// a flag result (to ensure it's not CSE'd).
386475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
38783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
388475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
3892fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CALLSEQ_START, VTs, 2, Ops, 2);
3906a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
3911ccae666f596d5aeca5c9942995763600b622062Chris Lattner
3920f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
3930f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// flag result (to ensure it's not CSE'd).
394475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
395475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue InFlag) {
3960f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
397475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
3980f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
3990f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
4000f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
4010f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(InFlag);
4020f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    return getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0],
403ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif                   (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
4040f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
4050f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
406c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
407cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
408475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT);
4097ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
410475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
4117ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
412475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N1, SDValue N2);
4137ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
414475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
4157ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
4167ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4177ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
418475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
4197ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
4207ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4217ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
422475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
4237ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
4247ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
4257ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4267ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
4277ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
428475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
4297ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
4307ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4317ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
432475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
4337ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4347ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
4357ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
436475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
4377ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4387ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL,
4397ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const std::vector<MVT> &ResultTys,
4407ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
441475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const MVT *VTs, unsigned NumVTs,
4427ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4437ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
4447ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4457ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, SDVTList VTs,
4467ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4477ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4487ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
4497ade28cd62f5188951387e1056a46001388a21f9Bill Wendling
450475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs);
4517ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
452475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N);
4537ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
454475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N1, SDValue N2);
4557ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4567ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2);
457475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
45801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3);
4597ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4607ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
461475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
46201f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
4637ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4647ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
465475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
46601f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
46701f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N5);
4687ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
4697ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
4707ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
471475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
472475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemcpy(SDValue Chain, SDValue Dst, SDValue Src,
47301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Size, unsigned Align, bool AlwaysInline,
47401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff,
47501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *SrcSV, uint64_t SrcSVOff);
4765c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
477475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemmove(SDValue Chain, SDValue Dst, SDValue Src,
47801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     SDValue Size, unsigned Align,
47901f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *DstSV, uint64_t DstOSVff,
48001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *SrcSV, uint64_t SrcSVOff);
4815c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
482475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemset(SDValue Chain, SDValue Dst, SDValue Src,
48301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Size, unsigned Align,
48401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff);
4855c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
4867cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
487475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
4887cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
489475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS,
49001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                   ISD::CondCode Cond) {
491d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DebugLoc::getUnknownLoc(), VT,
492d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, getCondCode(Cond));
493d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  }
494d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
495d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   ISD::CondCode Cond) {
496d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
497b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
498b43e9c196542acc80c9e4643809661065710848fNate Begeman
499b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
500475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
501b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
502475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS,
50301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    ISD::CondCode Cond) {
504d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::VSETCC, DebugLoc::getUnknownLoc(), VT,
505d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, getCondCode(Cond));
506d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  }
507d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
508d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                    ISD::CondCode Cond) {
509d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
5107cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
5119373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
5129373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
513475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
5149373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
515475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSelectCC(SDValue LHS, SDValue RHS,
51601f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                      SDValue True, SDValue False, ISD::CondCode Cond) {
517d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DebugLoc::getUnknownLoc(), True.getValueType(),
518d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
519d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  }
520d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
521d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                      SDValue True, SDValue False, ISD::CondCode Cond) {
522d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DL, True.getValueType(),
523d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
5249373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
5257cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
526acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
527acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
528475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVAArg(MVT VT, SDValue Chain, SDValue Ptr,
52901f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                   SDValue SV);
5307cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
531c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
532c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
5330b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  SDValue getAtomic(unsigned Opcode, MVT MemVT, SDValue Chain, SDValue Ptr,
53401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Cmp, SDValue Swp, const Value* PtrVal,
53501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    unsigned Alignment=0);
536e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
537e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
538e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment=0);
539ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
540c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
541c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 2 operands.
5420b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  SDValue getAtomic(unsigned Opcode, MVT MemVT, SDValue Chain, SDValue Ptr,
54301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Val, const Value* PtrVal,
54401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    unsigned Alignment = 0);
545e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
546e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Val, const Value* PtrVal,
547e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment = 0);
548ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
549c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
550c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// result and takes a list of operands.
551c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  SDValue getMemIntrinsicNode(unsigned Opcode,
552c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const MVT *VTs, unsigned NumVTs,
553c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const SDValue *Ops, unsigned NumOps,
554c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              MVT MemVT, const Value *srcValue, int SVOff,
555c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              unsigned Align = 0, bool Vol = false,
556c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              bool ReadMem = true, bool WriteMem = true);
557e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
558e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const MVT *VTs, unsigned NumVTs,
559e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
560e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              MVT MemVT, const Value *srcValue, int SVOff,
561e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
562e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
563c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
564c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  SDValue getMemIntrinsicNode(unsigned Opcode, SDVTList VTList,
565c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const SDValue *Ops, unsigned NumOps,
566c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              MVT MemVT, const Value *srcValue, int SVOff,
567c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              unsigned Align = 0, bool Vol = false,
568c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              bool ReadMem = true, bool WriteMem = true);
569e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
570e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
571e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              MVT MemVT, const Value *srcValue, int SVOff,
572e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
573e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
574c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
5754bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
576aaffa05d0a652dd3eae76a941d02d6b0469fa821Duncan Sands  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps);
577f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
578095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  /// getCall - Create a CALL node from the given information.
579095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  ///
580095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  SDValue getCall(unsigned CallingConv, bool IsVarArgs, bool IsTailCall,
58186098bd6a63d2cdf0c9be9ef3151bd2728281fd7Dale Johannesen                  bool isInreg, SDVTList VTs, const SDValue *Operands,
58286098bd6a63d2cdf0c9be9ef3151bd2728281fd7Dale Johannesen                  unsigned NumOperands);
583e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
584e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                  bool IsTailCall, bool isInreg, SDVTList VTs,
585e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                  const SDValue *Operands, unsigned NumOperands);
586095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman
587c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
588c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
589cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
590475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(MVT VT, SDValue Chain, SDValue Ptr,
59195c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    const Value *SV, int SVOffset, bool isVolatile=false,
59295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    unsigned Alignment=0);
593e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
594e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    const Value *SV, int SVOffset, bool isVolatile=false,
595e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment=0);
596475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getExtLoad(ISD::LoadExtType ExtType, MVT VT,
597475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Chain, SDValue Ptr, const Value *SV,
59883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       int SVOffset, MVT EVT, bool isVolatile=false,
59995c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                       unsigned Alignment=0);
600e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
601e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       SDValue Chain, SDValue Ptr, const Value *SV,
602e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       int SVOffset, MVT EVT, bool isVolatile=false,
603e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                       unsigned Alignment=0);
604475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedLoad(SDValue OrigLoad, SDValue Base,
605475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
606e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
607e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
608475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
609475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    MVT VT, SDValue Chain,
610475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue Ptr, SDValue Offset,
61183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                    const Value *SV, int SVOffset, MVT EVT,
612e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands                    bool isVolatile=false, unsigned Alignment=0);
613e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
614e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    MVT VT, SDValue Chain,
615e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Offset,
616e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    const Value *SV, int SVOffset, MVT EVT,
617e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    bool isVolatile=false, unsigned Alignment=0);
6182d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
619ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
620ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
621475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getStore(SDValue Chain, SDValue Val, SDValue Ptr,
62295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     const Value *SV, int SVOffset, bool isVolatile=false,
62395c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     unsigned Alignment=0);
624e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
625e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                     const Value *SV, int SVOffset, bool isVolatile=false,
626e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                     unsigned Alignment=0);
627475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTruncStore(SDValue Chain, SDValue Val, SDValue Ptr,
62883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                          const Value *SV, int SVOffset, MVT TVT,
62995c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                          bool isVolatile=false, unsigned Alignment=0);
630e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
631e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                          const Value *SV, int SVOffset, MVT TVT,
632e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                          bool isVolatile=false, unsigned Alignment=0);
633475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
634475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
635e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
636e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
637ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
638101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getSrcValue - Construct a node to track a Value* through the backend.
639475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
64069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
641101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getMemOperand - Construct a node to track a memory reference
642101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// through the backend.
643475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemOperand(const MachineMemOperand &MO);
644cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
645b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
646b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
647b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
648b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
649b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
650b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
651475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op);
652475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
653475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
654475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
655475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
656475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
657475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
658475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
659475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N,
660475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
6611b95095857b78e12138c22e76c7936611c51355bChris Lattner
6621b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
6631b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
6641b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
665e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
66683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
667475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
66883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
669475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
67083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
671475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
67283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
673475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
674cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
675cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
676475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, const SDValue *Ops, unsigned NumOps);
677cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
678475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
67913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
68013d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
68113d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       unsigned NumOps);
682cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
683475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1);
68483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
685475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2);
68683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
687475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
68813d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
68913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
690cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
691475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
692694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
693e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// MorphNodeTo - These *mutate* the specified node to have the specified
694e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
695e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
696475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
697e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
698475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2);
699e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
700475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2, SDValue Op3);
701e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
702475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
703e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
704e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
705475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, const SDValue *Ops, unsigned NumOps);
706e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
707475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
708e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
709475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1);
710e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
711475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2);
712e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
713475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
714e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
715475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
716753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
7176ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// getTargetNode - These are used for target selectors to create a new node
7186ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// with specified return type(s), target opcode, and operands.
7196ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
7206ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// Note that getTargetNode returns the resultant node.  If there is already a
7216ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// node of the specified opcode and operands, it returns that node instead of
7226ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// the current one.
72383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT);
72456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
72556ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
726475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1);
72756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
72856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
729475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1, SDValue Op2);
73056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
73156ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        SDValue Op2);
73256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
73383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
734475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
73556ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
736e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2, SDValue Op3);
73756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
73883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
739475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
74056ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
741e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
74256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
74383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2);
74456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
74556ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
746475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, SDValue Op1);
74756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
74856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        SDValue Op1);
74956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
75083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
751475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2);
75256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
753e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        MVT VT2, SDValue Op1, SDValue Op2);
75456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
75583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
756475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
75756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
758e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
75956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
76083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2,
761475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
76256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
763e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
76456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
76583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
766475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2);
76756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
768e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2);
76956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
77083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
771475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
77256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
773e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        SDValue Op1, SDValue Op2, SDValue Op3);
77456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
77583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
776475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
77756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
778e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                        const SDValue *Ops, unsigned NumOps);
77956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
78083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3, MVT VT4,
781475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
78256ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
78356ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        MVT VT4, const SDValue *Ops, unsigned NumOps);
78456ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling
785f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  SDNode *getTargetNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
786475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
78756ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling  SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
78856ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        const std::vector<MVT> &ResultTys, const SDValue *Ops,
78956ab1a281511dde8c173cd2dc8ef55a916049037Bill Wendling                        unsigned NumOps);
79008b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
79108b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
79208b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
79308b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
794475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
7956542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
796f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
797f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
798f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
799f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
800f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
801f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
802edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
803edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
804edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
805edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
806edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
807edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
808f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
809f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
810f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
811f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
812f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
813f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
814f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
815f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
8160fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
8170fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
8180fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
8190fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
8200fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
8216542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
82226005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
82326005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
82426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// if you have two nodes with identical results, use the third otherwise.
8256542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
826f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// These methods all take an optional UpdateListener, which (if not null) is
827f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
828f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
829fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
8309ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// These functions only replace all existing uses. It's possible that as
8319ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// these replacements are being performed, CSE may cause the From node
8329ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// to be given new uses. These new uses of From are left in place, and
8339ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// not automatically transfered to To.
8349ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  ///
835475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
836f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
837fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
838f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
839475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
840f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
841fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
84280274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
843f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
844475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
845f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
84680274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
847e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
848e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
849e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
850475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
851e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
852e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
853e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
854f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
855f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
856f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
857f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
858e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
8598be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
8608be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
8618be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
8628be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
8638be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
8648be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
8658be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
8661efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
8671efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
8681efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
8694ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
8704ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
8711efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
8721efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
8731efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
8741efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
8751efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
876b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
877b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
8781efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
8791efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
8801efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
8811efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
8821efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
8831efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDC:
8841efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
8851efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
8861efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
8871efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
8881efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
889cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
890d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
89137ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
892364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
893364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
894475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
89547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
89647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// CreateStackTemporary - Create a stack temporary suitable for holding
89747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// either of the specified value types.
89847d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  SDValue CreateStackTemporary(MVT VT1, MVT VT2);
89947d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
900f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  /// FoldConstantArithmetic -
901f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  SDValue FoldConstantArithmetic(unsigned Opcode,
902f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 MVT VT,
903f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst1,
904f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst2);
905f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
90651dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
907475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue FoldSetCC(MVT VT, SDValue N1,
908f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                    SDValue N2, ISD::CondCode Cond);
90951dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner
9102e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
9112e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
912475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
9132e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
914ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
915ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
916ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
917475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
918ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
919ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
920ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
921ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
922ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
923ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
924ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
925475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
926fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
927fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
928ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
929ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
930ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
931ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
932ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
933ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
934ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
935475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
936a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
937475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
938a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng  /// been verified as a debug information descriptor.
939475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool isVerifiedDebugInfoDesc(SDValue Op) const;
94077f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng
94177f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// getShuffleScalarElt - Returns the scalar element that will make up the ith
94277f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// element of the result of the vector shuffle.
943475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
944ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
945d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
946095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
947399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman  void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
948475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
949475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
950a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
951475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
952a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
953b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
954fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
955c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman  void DeallocateNode(SDNode *N);
9569c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
9579c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman  unsigned getMVTAlignment(MVT MemoryVT) const;
958f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
959f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
9607cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
961101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// VTList - List of non-single value types.
962e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
963109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
964101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// CondCodeNodes - Maps to auto-CSE operations.
9657cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
9661cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
96715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
9688e4eb09b1e3571965f49edcdfb56b1375b1b7551Duncan Sands  std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
969056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
970056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> TargetExternalSymbols;
971cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
972cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
9731080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
9741080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
9751080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
9761080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
9771080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
9781080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
9791080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
9801080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
9811080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
9821080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
983b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
984cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
985cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
986