SelectionDAG.h revision 22a54c1cd711afccd4558374918d12a939e1cca5
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// This file declares the SelectionDAG class, and transitively defines the
11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// SDNode class and subclasses.
12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner//===----------------------------------------------------------------------===//
14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAG_H
16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#define LLVM_CODEGEN_SELECTIONDAG_H
17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
18fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h"
19c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene#include "llvm/ADT/DenseSet.h"
204b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h"
21583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h"
22c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman#include "llvm/Support/RecyclingAllocator.h"
2398a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h"
24acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
255892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector>
26322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
27eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis;
32b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineConstantPoolValue;
33b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineFunction;
3431441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Chengclass MDNode;
35b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass SDNodeOrdering;
36bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgValue;
37b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass TargetLowering;
38ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohmanclass TargetSelectionDAGInfo;
39fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
408e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
418e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate:
427309be6735666143bd9835b275dc8501617a2591Gabor Greif  mutable ilist_half_node<SDNode> Sentinel;
43fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic:
44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  SDNode *createSentinel() const {
45c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif    return static_cast<SDNode*>(&Sentinel);
46fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void destroySentinel(SDNode *) {}
48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
49c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *provideInitialHead() const { return createSentinel(); }
50c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *ensureHead(SDNode*) const { return createSentinel(); }
51f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif  static void noteHead(SDNode*, SDNode*) {}
52c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif
53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void deleteNode(SDNode *) {
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
57fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void createNode(const SDNode &);
58fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman};
59c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
60bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// SDDbgInfo - Keeps track of dbg_value information through SDISel.  We do
61bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// not build SDNodes for these so as not to perturb the generated code;
62bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// instead the info is kept off to the side in this structure. Each SDNode may
63bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// have one or more associated dbg_value entries. This information is kept in
64bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// DbgValMap.
65fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// Byval parameters are handled separately because they don't use alloca's,
66fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// which busts the normal mechanism.  There is good reason for handling all
67fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// parameters separately:  they may not have code generated for them, they
68fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// should always go at the beginning of the function regardless of other code
69fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// motion, and debug info for them is potentially useful even if the parameter
70fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// is unused.  Right now only byval parameters are handled separately.
71bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgInfo {
72bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SmallVector<SDDbgValue*, 32> DbgValues;
73fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  SmallVector<SDDbgValue*, 32> ByvalParmDbgValues;
74d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel  DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> > DbgValMap;
75bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
76bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void operator=(const SDDbgInfo&);   // Do not implement.
77bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo(const SDDbgInfo&);   // Do not implement.
78bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenpublic:
79bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo() {}
80bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
81fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  void add(SDDbgValue *V, const SDNode *Node, bool isParameter) {
82fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    if (isParameter) {
83fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen      ByvalParmDbgValues.push_back(V);
84fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    } else     DbgValues.push_back(V);
85bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    if (Node)
86d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel      DbgValMap[Node].push_back(V);
87bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
88bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
89bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void clear() {
90d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel    DbgValMap.clear();
91bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    DbgValues.clear();
92fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    ByvalParmDbgValues.clear();
93bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  }
94bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
95bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool empty() const {
96fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    return DbgValues.empty() && ByvalParmDbgValues.empty();
97bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
98bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
9922a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer  ArrayRef<SDDbgValue*> getSDDbgValues(const SDNode *Node) {
10022a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer    DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> >::iterator I =
10122a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer      DbgValMap.find(Node);
10222a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer    if (I != DbgValMap.end())
10322a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer      return I->second;
10422a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer    return ArrayRef<SDDbgValue*>();
105bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
106bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
107bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  typedef SmallVector<SDDbgValue*,32>::iterator DbgIterator;
108bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  DbgIterator DbgBegin() { return DbgValues.begin(); }
109bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  DbgIterator DbgEnd()   { return DbgValues.end(); }
110fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  DbgIterator ByvalParmDbgBegin() { return ByvalParmDbgValues.begin(); }
111fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  DbgIterator ByvalParmDbgEnd()   { return ByvalParmDbgValues.end(); }
112bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen};
113bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
11425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel {
11525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  Unrestricted,   // Combine may create illegal operations and illegal types.
11625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalTypes, // Combine may create illegal operations but no illegal types.
11725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalOperations // Combine may only create legal operations and types.
11825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands};
11925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
120cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greeneclass SelectionDAG;
121cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SDNode *N);
122cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SelectionDAG *DAG);
123cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene
124c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
125c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
126c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
127c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
128c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
129c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
130c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
131c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
132c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
133c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
134cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
135cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
13650d2b1ac029d63500ea9b9347561b1454fa6ed6aDan Gohman  const TargetMachine &TM;
137d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman  const TargetLowering &TLI;
138ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  const TargetSelectionDAGInfo &TSI;
1397c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
140512063dd0f91a76b9dd904dfff72a52b4d09e89fChris Lattner  LLVMContext *Context;
141cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
142f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
143f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
144f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
145f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
146f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
147cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
148213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
149fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
150fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
151f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
152f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
153f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
154f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
155f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
156f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
157f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
158f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
159691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
160213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
161d23b33435ae722ff5aa5ab97135a4f31041959e2Bob Wilson  /// CSE with existing nodes when a duplicate is requested.
162583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
163213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
164f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
165f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
166f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
167e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
168e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
169e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
170e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
171b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// SDNodeOrdering - The ordering of the SDNodes. It roughly corresponds to
172b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// the ordering of the original LLVM instructions.
173b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  SDNodeOrdering *Ordering;
174819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar
175bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// DbgInfo - Tracks dbg_value information through SDISel.
176bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo *DbgInfo;
177bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
178c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
179c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
180c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
181c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  bool setSubgraphColorHelper(SDNode *N, const char *Color,
182c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif                              DenseSet<SDNode *> &visited,
183c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
184c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
185819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar  void operator=(const SelectionDAG&); // Do not implement.
186819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar  SelectionDAG(const SelectionDAG&);   // Do not implement.
187819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar
188cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
1897451d3e09d26115195280ba36f686a0a90815089Dan Gohman  explicit SelectionDAG(const TargetMachine &TM);
190cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
191cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1927c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
1937c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
1947c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
195de6e783b2490447866b592cd39855e6f4d25efffChris Lattner  void init(MachineFunction &mf);
1967c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman
1977c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// clear - Clear state and free memory necessary to make this
198f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// SelectionDAG ready to process a new block.
199f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  ///
2007c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void clear();
201f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
2027c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction &getMachineFunction() const { return *MF; }
20350d2b1ac029d63500ea9b9347561b1454fa6ed6aDan Gohman  const TargetMachine &getTarget() const { return TM; }
204d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman  const TargetLowering &getTargetLoweringInfo() const { return TLI; }
205ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  const TargetSelectionDAGInfo &getSelectionDAGInfo() const { return TSI; }
206d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext *getContext() const {return Context; }
207cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
208ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
2091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
210462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
2110b12aef49087b57d276ed760a83525d1e2602144Dan Gohman  void viewGraph();
212fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
213ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
214ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
215ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
2161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
217ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
218ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
219ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
220fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
221ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
222ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
223ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
224fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
225ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
226ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
227ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
228fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
229ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
230ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
231ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
2321080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
233c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColor - Convenience for setting subgraph color attribute.
234c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
235c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  void setSubgraphColor(SDNode *N, const char *Color);
236c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
237fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
238b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
239b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
240fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::iterator allnodes_iterator;
241b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
242b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
243fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode>::size_type allnodes_size() const {
2440e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
2450e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
246fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
247c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
248cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
249475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
250cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
251c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
252c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
253f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue getEntryNode() const {
254f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    return SDValue(const_cast<SDNode *>(&EntryNode), 0);
255f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  }
256cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
257c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
258cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
259475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
260825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    assert((!N.getNode() || N.getValueType() == MVT::Other) &&
261acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
262cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
263cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(N.getNode());
264cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    Root = N;
265cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
266cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(this);
267cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    return Root;
268acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
269cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2701d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
27125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
27225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
27325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
27498a366d547772010e94609e4584489b3e5ce0043Bill Wendling  void Combine(CombineLevel Level, AliasAnalysis &AA,
27598a366d547772010e94609e4584489b3e5ce0043Bill Wendling               CodeGenOpt::Level OptLevel);
27625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
27701d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
27825cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
27925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
28001d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
28101d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
28201d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
28325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
28425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
285c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
286c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
287c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
288cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
289c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
290c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
291975716af1b9a09274df6c2d92683449015bd8564Dan Gohman  void Legalize();
292c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
2935c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG
2945c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// that only uses vector math operations supported by the target.  This is
2955c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// necessary as a separate step from Legalize because unrolling a vector
2965c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// operation can introduce illegal types, which requires running
2975c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeTypes again.
2985c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
2995c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// This returns true if it made any changes; in that case, LegalizeTypes
3005c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// is called again before Legalize.
3015c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
3025c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// Note that this is an involved process that may invalidate pointers into
3035c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// the graph.
3045c22c8074404797f1313b1334757254fb5c6487aEli Friedman  bool LegalizeVectors();
3055c22c8074404797f1313b1334757254fb5c6487aEli Friedman
306d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
307190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
308190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
309130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
310130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
311130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
312130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
313130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
31470046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
31570046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
316e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT);
317e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2);
318e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3);
319e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4);
320e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(const EVT *VTs, unsigned NumVTs);
321fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
3221b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
32370046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
32470046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
325e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(uint64_t Val, EVT VT, bool isTarget = false);
326e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const APInt &Val, EVT VT, bool isTarget = false);
327e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const ConstantInt &Val, EVT VT, bool isTarget = false);
328475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
329e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(uint64_t Val, EVT VT) {
330cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
331cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
332e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const APInt &Val, EVT VT) {
3336394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
3346394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
335e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const ConstantInt &Val, EVT VT) {
3364fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
3374fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
3380a406ae0d940d92c51ee145b48ff7a483a366849Dale Johannesen  // The forms below that take a double should only be used for simple
3390a406ae0d940d92c51ee145b48ff7a483a366849Dale Johannesen  // constants that can be exactly represented in VT.  No checks are made.
340e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(double Val, EVT VT, bool isTarget = false);
341e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const APFloat& Val, EVT VT, bool isTarget = false);
342e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const ConstantFP &CF, EVT VT, bool isTarget = false);
343e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(double Val, EVT VT) {
344c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
345c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
346e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const APFloat& Val, EVT VT) {
347f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
348f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
349e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const ConstantFP &Val, EVT VT) {
3504fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
3514fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
3520d881dabc1a4e1aefad6dd38de166d8358285638Devang Patel  SDValue getGlobalAddress(const GlobalValue *GV, DebugLoc DL, EVT VT,
3532a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           int64_t offset = 0, bool isTargetGA = false,
3542a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           unsigned char TargetFlags = 0);
3550d881dabc1a4e1aefad6dd38de166d8358285638Devang Patel  SDValue getTargetGlobalAddress(const GlobalValue *GV, DebugLoc DL, EVT VT,
3562a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 int64_t offset = 0,
3572a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 unsigned char TargetFlags = 0) {
3580d881dabc1a4e1aefad6dd38de166d8358285638Devang Patel    return getGlobalAddress(GV, DL, VT, offset, true, TargetFlags);
359cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
360e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getFrameIndex(int FI, EVT VT, bool isTarget = false);
361e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetFrameIndex(int FI, EVT VT) {
362c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
363c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
364e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getJumpTable(int JTI, EVT VT, bool isTarget = false,
365f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                       unsigned char TargetFlags = 0);
366e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetJumpTable(int JTI, EVT VT, unsigned char TargetFlags = 0) {
367f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getJumpTable(JTI, VT, true, TargetFlags);
368c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
36946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getConstantPool(const Constant *C, EVT VT,
370f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
371f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
37246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getTargetConstantPool(const Constant *C, EVT VT,
373f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned Align = 0, int Offset = 0,
374f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned char TargetFlags = 0) {
375f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
376c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
377e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantPool(MachineConstantPoolValue *C, EVT VT,
378f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
379f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
380475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
381e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                  EVT VT, unsigned Align = 0,
382f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                  int Offset = 0, unsigned char TargetFlags=0) {
383f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
384d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
3858ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // When generating a branch to a BB, we don't in general know enough
3868ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // to provide debug info for the BB at that time, so keep this one around.
387475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
388e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
389e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExternalSymbol(const char *Sym, EVT VT);
390e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExternalSymbol(const char *Sym, DebugLoc dl, EVT VT);
391e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
3921af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner                                  unsigned char TargetFlags = 0);
393e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getValueType(EVT);
394e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getRegister(unsigned Reg, EVT VT);
3957561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner  SDValue getEHLabel(DebugLoc dl, SDValue Root, MCSymbol *Label);
39646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getBlockAddress(const BlockAddress *BA, EVT VT,
39729cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman                          bool isTarget = false, unsigned char TargetFlags = 0);
398c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
3990f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
400825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
4010f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   getRegister(Reg, N.getValueType()), N);
4020f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
403cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
404e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
40529d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // indicates that there is potentially an incoming glue value (if Glue is not
40629d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // null) and that there should be a glue result.
4070f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
40829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                       SDValue Glue) {
409f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
41029d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Glue };
41129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
4120f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
41366a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
414475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
4150f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
41629d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                         SDValue Glue) {
417f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
41829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, Reg, N, Glue };
41929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
4200f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
421fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
422e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT) {
423825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(VT, MVT::Other);
4240f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
425fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
4260f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
427fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
428e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
42929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // indicates that there is potentially an incoming glue value (if Glue is not
43029d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // null) and that there should be a glue result.
431e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT,
43229d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                           SDValue Glue) {
433f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(VT, MVT::Other, MVT::Glue);
43429d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, getRegister(Reg, VT), Glue };
43529d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyFromReg, dl, VTs, Ops, Glue.getNode() ? 3 : 2);
4360f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
43718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
438475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
439cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
44077cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
44177cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
442e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConvertRndSat(EVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
4430f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue STy,
4440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
4456154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
4469008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node.  The number of
4479008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// elements in VT, which must be a vector type, must match the number of
4485a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  /// mask elements NumElts.  A integer mask element equal to -1 is treated as
4499008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// undefined.
4506154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
4519008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                           const int *MaskElts);
45277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
4533a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getSExtOrTrunc - Convert Op, which must be of integer type, to the
4543a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either sign-extending or truncating it.
4553a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  SDValue getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
4563a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
4573a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getZExtOrTrunc - Convert Op, which must be of integer type, to the
4583a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either zero-extending or truncating it.
4593a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  SDValue getZExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
4603a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
4611ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
4621ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
463e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, EVT SrcTy);
464fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
4654c2454623841f05c6c665659b34c214950d12d7eBob Wilson  /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
466e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNOT(DebugLoc DL, SDValue Val, EVT VT);
4674c2454623841f05c6c665659b34c214950d12d7eBob Wilson
4686a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
46929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// a glue result (to ensure it's not CSE'd).  CALLSEQ_START does not have a
470e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// useful DebugLoc.
471475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
472f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
473475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
474b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    return getNode(ISD::CALLSEQ_START, DebugLoc(), VTs, Ops, 2);
4756a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
4761ccae666f596d5aeca5c9942995763600b622062Chris Lattner
4770f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
47829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// glue result (to ensure it's not CSE'd).  CALLSEQ_END does not have
479e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// a useful DebugLoc.
480475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
48129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                           SDValue InGlue) {
482f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList NodeTys = getVTList(MVT::Other, MVT::Glue);
483475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
4840f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
4850f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
4860f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
48729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    Ops.push_back(InGlue);
488b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    return getNode(ISD::CALLSEQ_END, DebugLoc(), NodeTys, &Ops[0],
48929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                   (unsigned)Ops.size() - (InGlue.getNode() == 0 ? 1 : 0));
4900f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
4910f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
492e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// getUNDEF - Return an UNDEF node.  UNDEF does not have a useful DebugLoc.
493e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getUNDEF(EVT VT) {
494b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    return getNode(ISD::UNDEF, DebugLoc(), VT);
495e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  }
496e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen
497b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node.  This does
498b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// not have a useful DebugLoc.
499e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getGLOBAL_OFFSET_TABLE(EVT VT) {
500b494ccf02ce17318d3f2a7b2d674bec60781fc73Chris Lattner    return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc(), VT);
501b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  }
502b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen
503c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
504cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
505e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT);
506e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N);
507e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N1, SDValue N2);
508e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5097ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
510e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5117ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
512e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5137ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5147ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
515e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5167ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
517e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5187ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5197ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL,
520e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                  const std::vector<EVT> &ResultTys,
5217ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
522e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, const EVT *VTs, unsigned NumVTs,
5237ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5247ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5257ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5267ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
5277ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
5287ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5297ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2);
5307ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5317ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
5327ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5337ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
5347ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5357ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5367ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
537475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
53898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// getStackArgumentTokenFactor - Compute a TokenFactor to force all
53998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// the incoming stack arguments to be loaded from the stack. This is
54098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// used in tail call lowering to protect stack arguments from being
54198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// clobbered.
54298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  SDValue getStackArgumentTokenFactor(SDValue Chain);
54398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
5440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
54520adc9dc4650313f017b27d9818eb2176238113dMon P Wang                    SDValue Size, unsigned Align, bool isVol, bool AlwaysInline,
546e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo DstPtrInfo,
547e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo SrcPtrInfo);
5485c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5490f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
55020adc9dc4650313f017b27d9818eb2176238113dMon P Wang                     SDValue Size, unsigned Align, bool isVol,
551e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     MachinePointerInfo DstPtrInfo,
552e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     MachinePointerInfo SrcPtrInfo);
5535c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5540f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
55520adc9dc4650313f017b27d9818eb2176238113dMon P Wang                    SDValue Size, unsigned Align, bool isVol,
556e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo DstPtrInfo);
5575c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5587cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
559475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
5607cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
561e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS,
562d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   ISD::CondCode Cond) {
563d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
564b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
565b43e9c196542acc80c9e4643809661065710848fNate Begeman
566b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
567475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
568b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
569e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getVSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS,
570d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                    ISD::CondCode Cond) {
571d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
5727cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
5739373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
5749373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
575475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
5769373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
577d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
578d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                      SDValue True, SDValue False, ISD::CondCode Cond) {
579d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DL, True.getValueType(),
580d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
5819373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
582fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
583acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
584acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
585e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getVAArg(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
586cbeeae23c31d32b833c9c7c3e8984e4cbcf22f45Rafael Espindola                   SDValue SV, unsigned Align);
5877cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
588fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// getAtomic - Gets a node for an atomic op, produces result and chain and
589c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
590e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
59160bddc8bcd787be645d2f3b64117fee884270e6aChris Lattner                    SDValue Ptr, SDValue Cmp, SDValue Swp,
59260bddc8bcd787be645d2f3b64117fee884270e6aChris Lattner                    MachinePointerInfo PtrInfo, unsigned Alignment=0);
593c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
594c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    SDValue Ptr, SDValue Cmp, SDValue Swp,
595c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    MachineMemOperand *MMO);
596ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
597c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
598c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 2 operands.
599e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
600e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Val, const Value* PtrVal,
601e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment = 0);
602c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
603c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    SDValue Ptr, SDValue Val,
604c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    MachineMemOperand *MMO);
605ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
606c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
607c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// result and takes a list of operands. Opcode may be INTRINSIC_VOID,
608c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// INTRINSIC_W_CHAIN, or a target-specific opcode with a value not
609c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// less than FIRST_TARGET_MEMORY_OPCODE.
610e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
611e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                              const EVT *VTs, unsigned NumVTs,
612e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
613e9ba5dd236f48708a00bd3bb0519148f943cc897Chris Lattner                              EVT MemVT, MachinePointerInfo PtrInfo,
614e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
615e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
616c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
617e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
618e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
619e9ba5dd236f48708a00bd3bb0519148f943cc897Chris Lattner                              EVT MemVT, MachinePointerInfo PtrInfo,
620e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
621e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
622c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
623c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
624c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              const SDValue *Ops, unsigned NumOps,
625c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              EVT MemVT, MachineMemOperand *MMO);
626c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
6274bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
62854c94525f420cab274af60e98a77f081f96e59c2Dale Johannesen  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
629f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
630c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
631c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
632cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
633e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
634e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                  MachinePointerInfo PtrInfo, bool isVolatile,
635f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                  bool isNonTemporal, unsigned Alignment,
636f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                  const MDNode *TBAAInfo = 0);
637a901129169194881a78b7fd8953e09f55b846d10Stuart Hastings  SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT,
638e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
639e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     EVT MemVT, bool isVolatile,
640f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                     bool isNonTemporal, unsigned Alignment,
641f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                     const MDNode *TBAAInfo = 0);
642e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
643bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng                         SDValue Offset, ISD::MemIndexedMode AM);
644bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
645bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng                  EVT VT, DebugLoc dl,
646bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng                  SDValue Chain, SDValue Ptr, SDValue Offset,
6475c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                  MachinePointerInfo PtrInfo, EVT MemVT,
648f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                  bool isVolatile, bool isNonTemporal, unsigned Alignment,
649f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                  const MDNode *TBAAInfo = 0);
6505c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
6515c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                  EVT VT, DebugLoc dl,
6525c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                  SDValue Chain, SDValue Ptr, SDValue Offset,
653c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                  EVT MemVT, MachineMemOperand *MMO);
6542d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
655ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
656ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
657e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
6585c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                   MachinePointerInfo PtrInfo, bool isVolatile,
659f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                   bool isNonTemporal, unsigned Alignment,
660f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                   const MDNode *TBAAInfo = 0);
6615c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
662c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                   MachineMemOperand *MMO);
6635c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
6645c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                        MachinePointerInfo PtrInfo, EVT TVT,
6655c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                        bool isNonTemporal, bool isVolatile,
666f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                        unsigned Alignment,
667f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                        const MDNode *TBAAInfo = 0);
668e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
669c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                        EVT TVT, MachineMemOperand *MMO);
670e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
671e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
672ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
673101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getSrcValue - Construct a node to track a Value* through the backend.
674475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
67569de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
676decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  /// getMDNode - Return an MDNodeSDNode which holds an MDNode.
677decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  SDValue getMDNode(const MDNode *MD);
6786154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
67992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// getShiftAmountOperand - Return the specified value casted to
68092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// the target's desired shift amount type.
6816154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
68292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands
683b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
684b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
685b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
686b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
687b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
688b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
689027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op);
690027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2);
691027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
692475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
693027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
694475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
695027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
696475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
697027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N,
698475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
699fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
7001b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
7011b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
7021b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
703e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
704e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT);
705e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, SDValue Op1);
706e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
707475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
708e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
709475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
710e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
711475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
712e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, EVT VT2);
713e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
714e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, const SDValue *Ops, unsigned NumOps);
715e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
716e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, const SDValue *Ops, unsigned NumOps);
717e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT1,
718e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, EVT VT4, const SDValue *Ops,
71913d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       unsigned NumOps);
720e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
721e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1);
722e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
723e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2);
724e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
725e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
726e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
727e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
728cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
729475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
730694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
731df51247725143acb781c224faffd848cc7cf95d8Chris Lattner  /// MorphNodeTo - This *mutates* the specified node to have the specified
732e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
733e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
734475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
735753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
736602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// getMachineNode - These are used for target selectors to create a new node
737602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// with specified return type(s), MachineInstr opcode, and operands.
7386ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
739602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// Note that getMachineNode returns the resultant node.  If there is already
740602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// a node of the specified opcode and operands, it returns that node instead
741602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// of the current one.
742c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT);
743c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
744c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1);
745c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
746c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1, SDValue Op2);
747c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
748602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         SDValue Op1, SDValue Op2, SDValue Op3);
749c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
750602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         const SDValue *Ops, unsigned NumOps);
751c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2);
752c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
753602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         SDValue Op1);
754c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1,
755602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT2, SDValue Op1, SDValue Op2);
756c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1,
757602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
758c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
759602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         const SDValue *Ops, unsigned NumOps);
760c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
761602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, SDValue Op1, SDValue Op2);
762c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
763602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
764c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
765602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, const SDValue *Ops, unsigned NumOps);
766c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
767602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, EVT VT4, const SDValue *Ops, unsigned NumOps);
768c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl,
769c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         const std::vector<EVT> &ResultTys, const SDValue *Ops,
770c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         unsigned NumOps);
771c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, SDVTList VTs,
772c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         const SDValue *Ops, unsigned NumOps);
77308b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
7746a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// getTargetExtractSubreg - A convenience function for creating
7756a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// TargetInstrInfo::EXTRACT_SUBREG nodes.
7766a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  SDValue getTargetExtractSubreg(int SRIdx, DebugLoc DL, EVT VT,
7776a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman                                 SDValue Operand);
7786a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman
7795fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// getTargetInsertSubreg - A convenience function for creating
7805fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// TargetInstrInfo::INSERT_SUBREG nodes.
7815fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  SDValue getTargetInsertSubreg(int SRIdx, DebugLoc DL, EVT VT,
7825fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson                                SDValue Operand, SDValue Subreg);
7835fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson
78408b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
78508b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
78608b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
787475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
788fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
78931441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  /// getDbgValue - Creates a SDDbgValue node.
79031441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  ///
79131441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  SDDbgValue *getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R, uint64_t Off,
79231441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
79346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDDbgValue *getDbgValue(MDNode *MDPtr, const Value *C, uint64_t Off,
79431441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
79531441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  SDDbgValue *getDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off,
79631441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
79731441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng
798f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
799f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
800f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
801f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
802f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
803f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
804edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
805edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
806edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
807edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
808edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
809edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
810f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
811f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
812fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
813f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
814f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
815f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
816f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
817fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
8180fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
8190fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
8200fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
8210fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
8220fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
8236542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
82426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
82526005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
826c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// if you have two nodes with identical results (or if 'To' has a superset
827c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// of the results of 'From'), use the third otherwise.
8286542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
829fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// These methods all take an optional UpdateListener, which (if not null) is
830f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
831f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
832fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
8339ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// These functions only replace all existing uses. It's possible that as
8349ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// these replacements are being performed, CSE may cause the From node
8359ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// to be given new uses. These new uses of From are left in place, and
8367a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner  /// not automatically transferred to To.
8379ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  ///
838475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
839f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
840fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
841f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
842475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
843f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
844fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
84580274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
846f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
847475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
848f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
84980274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
850e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
851e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
852e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
853475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
854e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
855e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
856e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
857f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
858f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
859f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
860f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
861e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
8628be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
8638be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
8648be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
8658be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
8668be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
8678be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
8688be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
8691efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
8701efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
8711efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
8724ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
8734ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
8741efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
8751efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
8761efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
8771efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
8781efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
879b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
880b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
8811efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
8821efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
8831efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
8841efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
8851efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
88656e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::SADDO:
88756e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::UADDO:
888fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    case ISD::ADDC:
8891efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
8901efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
8911efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
8921efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
8931efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
894b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// AssignOrdering - Assign an order to the SDNode.
8954533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  void AssignOrdering(const SDNode *SD, unsigned Order);
896b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling
8970777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling  /// GetOrdering - Get the order for the SDNode.
8980777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling  unsigned GetOrdering(const SDNode *SD) const;
8990777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling
900bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
901bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// value is produced by SD.
902fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  void AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter);
903bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
904bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// GetDbgValues - Get the debug values which reference the given SDNode.
90522a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer  ArrayRef<SDDbgValue*> GetDbgValues(const SDNode* SD) {
906bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    return DbgInfo->getSDDbgValues(SD);
907bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  }
9086154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
909a2e868d34ccfed46310e98338ded6a74b2b01308Devang Patel  /// TransferDbgValues - Transfer SDDbgValues.
910a2e868d34ccfed46310e98338ded6a74b2b01308Devang Patel  void TransferDbgValues(SDValue From, SDValue To);
911bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
912bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// hasDebugValues - Return true if there are any SDDbgValue nodes associated
913bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// with this SelectionDAG.
914bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool hasDebugValues() const { return !DbgInfo->empty(); }
915bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
916bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); }
917bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SDDbgInfo::DbgIterator DbgEnd()   { return DbgInfo->DbgEnd(); }
9186154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
9196154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson    return DbgInfo->ByvalParmDbgBegin();
920fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  }
9216154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDDbgInfo::DbgIterator ByvalParmDbgEnd()   {
9226154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson    return DbgInfo->ByvalParmDbgEnd();
923fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  }
924bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
925cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
926d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
92737ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
928364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
929364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
930e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT, unsigned minAlign = 1);
93147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
93247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// CreateStackTemporary - Create a stack temporary suitable for holding
93347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// either of the specified value types.
934e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT1, EVT VT2);
93547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
936fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// FoldConstantArithmetic -
937f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  SDValue FoldConstantArithmetic(unsigned Opcode,
938e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                 EVT VT,
939f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst1,
940f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst2);
941f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
94251dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
943e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue FoldSetCC(EVT VT, SDValue N1,
944ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                    SDValue N2, ISD::CondCode Cond, DebugLoc dl);
945fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
9462e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
9472e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
948475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
9492e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
950ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
951ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
952ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
953475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
954ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
955fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
956ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
957ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
958ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
959fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
960ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
961475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
962fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
963fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
964ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
965ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
966ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
967ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
968ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
969ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
970ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
971475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
972a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
973a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// isBaseWithConstantOffset - Return true if the specified operand is an
974a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// ISD::ADD with a ConstantSDNode on the right-hand side, or if it is an
975a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// ISD::OR with a ConstantSDNode that is guaranteed to have the same
976a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// semantics as an ADD.  This handles the equivalence:
977463b3c2a9974acf7586d1e6a4416aa7cc004ff0eChris Lattner  ///     X|Cst == X+Cst iff X&Cst = 0.
978a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  bool isBaseWithConstantOffset(SDValue Op) const;
9796154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
9808d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  /// isKnownNeverNan - Test whether the given SDValue is known to never be NaN.
9818d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  bool isKnownNeverNaN(SDValue Op) const;
9828d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman
983e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isKnownNeverZero - Test whether the given SDValue is known to never be
984e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// positive or negative Zero.
985e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isKnownNeverZero(SDValue Op) const;
986e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
987e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isEqualTo - Test whether two SDValues are known to compare equal. This
988e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// is true if they are the same value, or if one is negative zero and the
989e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// other positive zero.
990e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isEqualTo(SDValue A, SDValue B) const;
991e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
992cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// UnrollVectorOp - Utility function used by legalize and lowering to
993cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// "unroll" a vector operation by splitting out the scalars and operating
994cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// on each element individually.  If the ResNE is 0, fully unroll the vector
995cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// op. If ResNE is less than the width of the vector op, unroll up to ResNE.
996cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// If the  ResNE is greater than the width of the vector op, unroll the
997cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// vector op and fill the end of the resulting vector with UNDEFS.
998cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0);
999cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang
10006154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
10016154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  /// location that is 'Dist' units away from the location that the 'Base' load
100264fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  /// is loading from.
100364fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  bool isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base,
100464fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng                         unsigned Bytes, int Dist) const;
100564fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng
1006f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if
1007f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// it cannot be inferred.
10087ced2e0b304e76ab746c7d9a54ad8d4930445a38Evan Cheng  unsigned InferPtrAlignment(SDValue Ptr) const;
1009f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng
1010d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
1011095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
1012399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman  void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
1013475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
1014475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
1015a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
1016475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
1017a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
1018b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
1019fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
1020c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman  void DeallocateNode(SDNode *N);
10219c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
1022e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  unsigned getEVTAlignment(EVT MemoryVT) const;
1023f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
1024f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
1025fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1026101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// VTList - List of non-single value types.
1027e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
1028fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1029101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// CondCodeNodes - Maps to auto-CSE operations.
10307cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
10311cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
103215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
1033e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  std::map<EVT, SDNode*, EVT::compareRawBits> ExtendedValueTypeNodes;
1034056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
10356154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
10361af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
1037cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
1038cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
10391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
10401080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
10411080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
10421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
10431080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
10441080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
10451080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
10461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
10471080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
10481080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
1049b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
1050cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1051cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
1052