SelectionDAG.h revision aaffa05d0a652dd3eae76a941d02d6b0469fa821
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;
35fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineFunction;
36fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineConstantPoolValue;
37fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo;
38fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
398e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
408e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate:
41fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  mutable SDNode Sentinel;
42fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic:
43fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist_traits() : Sentinel(ISD::DELETED_NODE, SDVTList()) {}
44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  SDNode *createSentinel() const {
46fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    return &Sentinel;
47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void destroySentinel(SDNode *) {}
49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void deleteNode(SDNode *) {
51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void createNode(const SDNode &);
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman};
56c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
5725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel {
5825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  Unrestricted,   // Combine may create illegal operations and illegal types.
5925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalTypes, // Combine may create illegal operations but no illegal types.
6025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalOperations // Combine may only create legal operations and types.
6125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands};
6225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
63c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
64c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
65c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
66c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
67c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
68c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
69c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
70c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
71c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
73cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
74cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
75063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
767c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
77ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &FLI;
7844c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI;
79cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
80f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
81f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
82f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
83f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
84f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
85cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
86213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
87fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
88fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
89f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
90f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
91f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
92f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
93f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
94f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
95f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
96f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
97691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
98213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
99213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSE with existing nodes with a duplicate is requested.
100583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
101213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
102f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
103f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
104f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
105e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
106e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
107e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
108e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
109d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  /// VerifyNode - Sanity check the given node.  Aborts if it is invalid.
110d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  void VerifyNode(SDNode *N);
111d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands
112c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
113c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
114c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
115c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  bool setSubgraphColorHelper(SDNode *N, const char *Color, DenseSet<SDNode *> &visited,
116c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
117c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
118cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
1197c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
120cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
121cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1227c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
1237c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
1247c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
1257c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void init(MachineFunction &mf, MachineModuleInfo *mmi);
1267c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman
1277c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// clear - Clear state and free memory necessary to make this
128f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// SelectionDAG ready to process a new block.
129f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  ///
1307c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void clear();
131f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
1327c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction &getMachineFunction() const { return *MF; }
133063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
134063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
135ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
13644c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
137cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
138ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
1391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
140462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
1410b12aef49087b57d276ed760a83525d1e2602144Dan Gohman  void viewGraph();
142ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
143ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
144ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
145ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
1461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
147ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
148ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
149ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
150ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
151ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
152ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
153ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
154ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
155ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
156ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
157ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
158ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
159ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
160ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
161ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
1621080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
163c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColor - Convenience for setting subgraph color attribute.
164c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
165c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  void setSubgraphColor(SDNode *N, const char *Color);
166c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
167fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
168b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
169b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
170fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::iterator allnodes_iterator;
171b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
172b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
173fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode>::size_type allnodes_size() const {
1740e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
1750e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
176b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
177c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
178cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
179475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
180cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
181c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
182c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
183f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue getEntryNode() const {
184f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    return SDValue(const_cast<SDNode *>(&EntryNode), 0);
185f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  }
186cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
187c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
188cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
189475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
190ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    assert((!N.getNode() || N.getValueType() == MVT::Other) &&
191acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
192acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman    return Root = N;
193acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
194cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1951d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
19625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
19725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
19825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
19925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  void Combine(CombineLevel Level, AliasAnalysis &AA, bool Fast);
20025cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
20101d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
20225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
20325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
20401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
20501d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
20601d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
20725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
20825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
209c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
210c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
211c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
212cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
213c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
214c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
215063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  void Legalize();
216c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
217d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
218190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
219190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
220130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
221130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
222130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
223130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
224130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
22570046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
22670046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
22783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT);
22883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2);
22983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
23083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
23170046e920fa37989a041af663ada2b2b646e258fChris Lattner
23270046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getNodeValueTypes - These are obsolete, use getVTList instead.
23383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT) {
23470046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT).VTs;
23570046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
23683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2) {
23770046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2).VTs;
23870046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
23983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) {
24070046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2, VT3).VTs;
24170046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
242f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) {
24313d57320bd212483463d4f8992d5787b29eda5dfBill Wendling    return getVTList(&vtList[0], (unsigned)vtList.size()).VTs;
24470046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
24570046e920fa37989a041af663ada2b2b646e258fChris Lattner
24670046e920fa37989a041af663ada2b2b646e258fChris Lattner
2471b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
24870046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
24970046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
250475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
251475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
2524fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
253475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
254475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(uint64_t Val, MVT VT) {
255cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
256cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
257475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(const APInt &Val, MVT VT) {
2586394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
2596394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
2604fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
2614fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
2624fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
263475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
264475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
2654fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
266475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(double Val, MVT VT) {
267c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
268c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
269475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
270f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
271f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
2724fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
2734fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
2744fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
275475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
2766520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman                           int64_t offset = 0, bool isTargetGA = false);
277475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
2786520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman                                 int64_t offset = 0) {
279cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getGlobalAddress(GV, VT, offset, true);
280cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
281475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetFrameIndex(int FI, MVT VT) {
283c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
284c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
285475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false);
286475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetJumpTable(int JTI, MVT VT) {
287c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getJumpTable(JTI, VT, true);
288c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
289475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(Constant *C, MVT VT,
290c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                            unsigned Align = 0, int Offs = 0, bool isT=false);
291475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(Constant *C, MVT VT,
292c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                                  unsigned Align = 0, int Offset = 0) {
293c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantPool(C, VT, Align, Offset, true);
294c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
295475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
296d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                            unsigned Align = 0, int Offs = 0, bool isT=false);
297475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
29883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                                  MVT VT, unsigned Align = 0,
299d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                                  int Offset = 0) {
300d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return getConstantPool(C, VT, Align, Offset, true);
301d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
302475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
303056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  SDValue getExternalSymbol(const char *Sym, MVT VT);
304056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
305475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getArgFlags(ISD::ArgFlagsTy Flags);
306475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getValueType(MVT);
307475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getRegister(unsigned Reg, MVT VT);
308475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
3097f460203b0c5350e9b2c592f438e40f7a7de6e45Dan Gohman                            const CompileUnitDesc *CU);
310475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
311c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
312475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
313d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyToReg, MVT::Other, Chain,
314d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner                   getRegister(Reg, N.getValueType()), N);
315cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
316cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
317e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
318e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
319e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
320475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N,
321475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
32283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
323475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
324ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
325e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
32666a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
327475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
328475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, SDValue Reg, SDValue N,
329475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
33083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
331475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, Reg, N, Flag };
332ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
33366a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  }
334e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
335475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT) {
33683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
337475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
3382fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyFromReg, VTs, 2, Ops, 2);
33918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  }
340e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
341e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
342e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
343e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
344475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT,
345475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Flag) {
34683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
347475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
348ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif    return getNode(ISD::CopyFromReg, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
349e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
35018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
351475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
352cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
35377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
35477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
35577cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  SDValue getConvertRndSat(MVT VT, SDValue Val, SDValue DTy, SDValue STy,
35677cdf30742284a173fe818417eb482224cdee8d4Mon P Wang                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
35777cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
3581ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
3591ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
360475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
3616a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner
3626a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
3636a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// a flag result (to ensure it's not CSE'd).
364475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
36583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
366475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
3672fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CALLSEQ_START, VTs, 2, Ops, 2);
3686a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
3691ccae666f596d5aeca5c9942995763600b622062Chris Lattner
3700f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
3710f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// flag result (to ensure it's not CSE'd).
372475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
373475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue InFlag) {
3740f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
375475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
3760f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
3770f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
3780f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
3790f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(InFlag);
3800f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    return getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0],
381ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif                   (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
3820f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
3830f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
384c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
385cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
386475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT);
387475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
388475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N1, SDValue N2);
389475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
390475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3);
391475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
392475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4);
393475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
394475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4,
395475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N5);
396475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
397475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
398475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
3996d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman                    const SDUse *Ops, unsigned NumOps);
400475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
401475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
402475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const MVT *VTs, unsigned NumVTs,
403475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
404475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs);
405475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N);
406475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N1, SDValue N2);
407475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
40801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3);
409475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
41001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
411475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
41201f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
41301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  SDValue N5);
414475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
41501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                  const SDValue *Ops, unsigned NumOps);
416475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
417475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemcpy(SDValue Chain, SDValue Dst, SDValue Src,
41801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Size, unsigned Align, bool AlwaysInline,
41901f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff,
42001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *SrcSV, uint64_t SrcSVOff);
4215c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
422475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemmove(SDValue Chain, SDValue Dst, SDValue Src,
42301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     SDValue Size, unsigned Align,
42401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *DstSV, uint64_t DstOSVff,
42501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *SrcSV, uint64_t SrcSVOff);
4265c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
427475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemset(SDValue Chain, SDValue Dst, SDValue Src,
42801f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Size, unsigned Align,
42901f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff);
4305c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
4317cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
432475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
4337cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
434475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS,
43501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                   ISD::CondCode Cond) {
4367cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond));
437b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
438b43e9c196542acc80c9e4643809661065710848fNate Begeman
439b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
440475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
441b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
442475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS,
44301f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    ISD::CondCode Cond) {
444b43e9c196542acc80c9e4643809661065710848fNate Begeman    return getNode(ISD::VSETCC, VT, LHS, RHS, getCondCode(Cond));
4457cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
4469373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
4479373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
448475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
4499373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
450475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSelectCC(SDValue LHS, SDValue RHS,
45101f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                      SDValue True, SDValue False, ISD::CondCode Cond) {
4522fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::SELECT_CC, True.getValueType(), LHS, RHS, True, False,
4532fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner                   getCondCode(Cond));
4549373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
4557cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
456acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
457acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
458475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVAArg(MVT VT, SDValue Chain, SDValue Ptr,
45901f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                   SDValue SV);
4607cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
461c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
462c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
463475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getAtomic(unsigned Opcode, SDValue Chain, SDValue Ptr,
46401f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Cmp, SDValue Swp, const Value* PtrVal,
46501f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    unsigned Alignment=0);
466ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
467c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
468c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 2 operands.
469475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getAtomic(unsigned Opcode, SDValue Chain, SDValue Ptr,
47001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    SDValue Val, const Value* PtrVal,
47101f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    unsigned Alignment = 0);
472ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
473c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
474c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// result and takes a list of operands.
475c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  SDValue getMemIntrinsicNode(unsigned Opcode,
476c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const MVT *VTs, unsigned NumVTs,
477c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const SDValue *Ops, unsigned NumOps,
478c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              MVT MemVT, const Value *srcValue, int SVOff,
479c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              unsigned Align = 0, bool Vol = false,
480c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              bool ReadMem = true, bool WriteMem = true);
481c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
482c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  SDValue getMemIntrinsicNode(unsigned Opcode, SDVTList VTList,
483c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              const SDValue *Ops, unsigned NumOps,
484c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              MVT MemVT, const Value *srcValue, int SVOff,
485c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              unsigned Align = 0, bool Vol = false,
486c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang                              bool ReadMem = true, bool WriteMem = true);
487c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
4884bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
489aaffa05d0a652dd3eae76a941d02d6b0469fa821Duncan Sands  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps);
490f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
491095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  /// getCall - Create a CALL node from the given information.
492095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  ///
493095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  SDValue getCall(unsigned CallingConv, bool IsVarArgs, bool IsTailCall,
49486098bd6a63d2cdf0c9be9ef3151bd2728281fd7Dale Johannesen                  bool isInreg, SDVTList VTs, const SDValue *Operands,
49586098bd6a63d2cdf0c9be9ef3151bd2728281fd7Dale Johannesen                  unsigned NumOperands);
496095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman
497c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
498c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
499cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
500475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(MVT VT, SDValue Chain, SDValue Ptr,
50195c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    const Value *SV, int SVOffset, bool isVolatile=false,
50295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    unsigned Alignment=0);
503475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getExtLoad(ISD::LoadExtType ExtType, MVT VT,
504475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Chain, SDValue Ptr, const Value *SV,
50583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       int SVOffset, MVT EVT, bool isVolatile=false,
50695c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                       unsigned Alignment=0);
507475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedLoad(SDValue OrigLoad, SDValue Base,
508475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
509475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
510475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    MVT VT, SDValue Chain,
511475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue Ptr, SDValue Offset,
51283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                    const Value *SV, int SVOffset, MVT EVT,
513e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands                    bool isVolatile=false, unsigned Alignment=0);
5142d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
515ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
516ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
517475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getStore(SDValue Chain, SDValue Val, SDValue Ptr,
51895c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     const Value *SV, int SVOffset, bool isVolatile=false,
51995c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     unsigned Alignment=0);
520475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTruncStore(SDValue Chain, SDValue Val, SDValue Ptr,
52183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                          const Value *SV, int SVOffset, MVT TVT,
52295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                          bool isVolatile=false, unsigned Alignment=0);
523475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
524475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
525ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
52669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // getSrcValue - Construct a node to track a Value* through the backend.
527475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
52869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
52969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // getMemOperand - Construct a node to track a memory reference
53069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // through the backend.
531475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemOperand(const MachineMemOperand &MO);
532cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
533b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
534b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
535b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
536b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
537b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
538b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
539475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op);
540475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
541475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
542475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
543475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
544475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
545475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
546475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
547475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N,
548475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
5491b95095857b78e12138c22e76c7936611c51355bChris Lattner
5501b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
5511b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
5521b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
553e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
55483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
555475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
55683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
557475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
55883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
559475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
56083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
561475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
562cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
563cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
564475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, const SDValue *Ops, unsigned NumOps);
565cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
566475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
567cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
568475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1);
56983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
570475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2);
57183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
572475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
573cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
574475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
575694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
576e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// MorphNodeTo - These *mutate* the specified node to have the specified
577e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
578e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
579475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
580e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
581475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2);
582e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
583475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2, SDValue Op3);
584e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
585475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
586e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
587e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
588475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, const SDValue *Ops, unsigned NumOps);
589e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
590475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
591e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
592475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1);
593e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
594475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2);
595e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
596475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
597e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
598475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
599753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
6006ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// getTargetNode - These are used for target selectors to create a new node
6016ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// with specified return type(s), target opcode, and operands.
6026ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
6036ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// Note that getTargetNode returns the resultant node.  If there is already a
6046ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// node of the specified opcode and operands, it returns that node instead of
6056ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// the current one.
60683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT);
607475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1);
608475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1, SDValue Op2);
60983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
610475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
61183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
612475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
61383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2);
614475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, SDValue Op1);
61583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
616475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2);
61783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
618475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
61983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2,
620475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
62183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
622475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2);
62383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
624475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
62583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
626475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
62783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3, MVT VT4,
628475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
629f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  SDNode *getTargetNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
630475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
63108b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
63208b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
63308b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
63408b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
635475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
6366542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
637f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
638f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
639f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
640f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
641f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
642f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
643edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
644edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
645edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
646edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
647edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
648edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
649f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
650f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
651f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
652f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
653f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
654f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
655f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
656f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
6570fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
6580fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
6590fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
6600fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
6610fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
6626542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
66326005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
66426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
66526005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// if you have two nodes with identical results, use the third otherwise.
6666542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
667f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// These methods all take an optional UpdateListener, which (if not null) is
668f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
669f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
670fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
671475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
672f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
673fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
674f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
675475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
676f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
677fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
67880274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
679f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
680475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
681f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
68280274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
683e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
684e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
685e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
686475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
687e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
688e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
689e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
690f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
691f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
692f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
693f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
694e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
6958be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
6968be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
6978be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
6988be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
6998be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
7008be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
7018be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
7021efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
7031efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
7041efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
7054ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
7064ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
7071efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
7081efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
7091efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
7101efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
7111efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
712b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
713b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
7141efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
7151efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
7161efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
7171efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
7181efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
7191efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDC:
7201efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
7211efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
7221efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
7231efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
7241efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
725cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
726d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
72737ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
728364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
729364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
730475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
731364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang
732f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  /// FoldConstantArithmetic -
733f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  SDValue FoldConstantArithmetic(unsigned Opcode,
734f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 MVT VT,
735f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst1,
736f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst2);
737f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
73851dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
739475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue FoldSetCC(MVT VT, SDValue N1,
740f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                    SDValue N2, ISD::CondCode Cond);
74151dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner
7422e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
7432e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
744475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
7452e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
746ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
747ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
748ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
749475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
750ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
751ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
752ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
753ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
754ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
755ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
756ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
757475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
758fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
759fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
760ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
761ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
762ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
763ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
764ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
765ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
766ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
767475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
768a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
769475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
770a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng  /// been verified as a debug information descriptor.
771475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool isVerifiedDebugInfoDesc(SDValue Op) const;
77277f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng
77377f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// getShuffleScalarElt - Returns the scalar element that will make up the ith
77477f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// element of the result of the vector shuffle.
775475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
776ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
777d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
778095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
7796542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
780475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
781475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
782a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
783475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
784a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
785b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
786fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
7879c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
7889c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman  unsigned getMVTAlignment(MVT MemoryVT) const;
789f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
790f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
7917cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
792109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  // List of non-single value types.
793e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
794109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
7951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  // Maps to auto-CSE operations.
7967cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
7971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
79815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
7998e4eb09b1e3571965f49edcdfb56b1375b1b7551Duncan Sands  std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
800056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
801056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> TargetExternalSymbols;
802cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
803cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
8041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
8051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
8061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
8071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
8081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
8091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
8101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
8111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
8121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
8131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
814b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
815cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
816cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
817