SelectionDAG.h revision f22fd3f7b557a967b1edc1fa9ae770006a39e97c
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
18c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene#include "llvm/ADT/DenseSet.h"
194b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h"
20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/ilist.h"
21444b4bf5c84c80833ff283244de0885124091a13Nadav Rotem#include "llvm/CodeGen/DAGCombine.h"
22583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h"
23c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman#include "llvm/Support/RecyclingAllocator.h"
2498a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h"
25acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
26322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
27eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
28255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <vector>
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
32fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis;
33b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineConstantPoolValue;
34b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineFunction;
3531441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Chengclass MDNode;
36bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgValue;
37b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass TargetLowering;
38ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohmanclass TargetSelectionDAGInfo;
39e4b4edd72ae596ac8d1fdbc6e77f61e331f6775dChandler Carruthclass TargetTransformInfo;
40fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
418e4018e2de52c534405d7155c7009d0b35afb861Cedric Venettemplate<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
428e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetprivate:
437309be6735666143bd9835b275dc8501617a2591Gabor Greif  mutable ilist_half_node<SDNode> Sentinel;
44fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanpublic:
45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  SDNode *createSentinel() const {
46c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif    return static_cast<SDNode*>(&Sentinel);
47fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
48fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void destroySentinel(SDNode *) {}
49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
50c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *provideInitialHead() const { return createSentinel(); }
51c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  SDNode *ensureHead(SDNode*) const { return createSentinel(); }
52f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif  static void noteHead(SDNode*, SDNode*) {}
53c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void deleteNode(SDNode *) {
5550bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("ilist_traits<SDNode> shouldn't see a deleteNode call!");
56fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  }
57fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
58fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  static void createNode(const SDNode &);
59fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman};
60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
61bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// SDDbgInfo - Keeps track of dbg_value information through SDISel.  We do
62bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// not build SDNodes for these so as not to perturb the generated code;
63bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// instead the info is kept off to the side in this structure. Each SDNode may
64bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// have one or more associated dbg_value entries. This information is kept in
65bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng/// DbgValMap.
66fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// Byval parameters are handled separately because they don't use alloca's,
67fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// which busts the normal mechanism.  There is good reason for handling all
68fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// parameters separately:  they may not have code generated for them, they
69fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// should always go at the beginning of the function regardless of other code
70fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// motion, and debug info for them is potentially useful even if the parameter
71fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen/// is unused.  Right now only byval parameters are handled separately.
72bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgInfo {
73bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SmallVector<SDDbgValue*, 32> DbgValues;
74fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  SmallVector<SDDbgValue*, 32> ByvalParmDbgValues;
75f22fd3f7b557a967b1edc1fa9ae770006a39e97cCraig Topper  typedef DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> > DbgValMapType;
76f22fd3f7b557a967b1edc1fa9ae770006a39e97cCraig Topper  DbgValMapType DbgValMap;
77bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
78001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper  void operator=(const SDDbgInfo&) LLVM_DELETED_FUNCTION;
79001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper  SDDbgInfo(const SDDbgInfo&) LLVM_DELETED_FUNCTION;
80bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenpublic:
81bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo() {}
82bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
83fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  void add(SDDbgValue *V, const SDNode *Node, bool isParameter) {
84fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    if (isParameter) {
85fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen      ByvalParmDbgValues.push_back(V);
86fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    } else     DbgValues.push_back(V);
87bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    if (Node)
88d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel      DbgValMap[Node].push_back(V);
89bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
90bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
91bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void clear() {
92d4c6c3a7c3140ce487a805138b6f53f82ff6b783Devang Patel    DbgValMap.clear();
93bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    DbgValues.clear();
94fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    ByvalParmDbgValues.clear();
95bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  }
96bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
97bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool empty() const {
98fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen    return DbgValues.empty() && ByvalParmDbgValues.empty();
99bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
100bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
10122a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer  ArrayRef<SDDbgValue*> getSDDbgValues(const SDNode *Node) {
102f22fd3f7b557a967b1edc1fa9ae770006a39e97cCraig Topper    DbgValMapType::iterator I = DbgValMap.find(Node);
10322a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer    if (I != DbgValMap.end())
10422a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer      return I->second;
10522a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer    return ArrayRef<SDDbgValue*>();
106bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
107bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
108f22fd3f7b557a967b1edc1fa9ae770006a39e97cCraig Topper  typedef SmallVectorImpl<SDDbgValue*>::iterator DbgIterator;
109bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  DbgIterator DbgBegin() { return DbgValues.begin(); }
110bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  DbgIterator DbgEnd()   { return DbgValues.end(); }
111fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  DbgIterator ByvalParmDbgBegin() { return ByvalParmDbgValues.begin(); }
112fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  DbgIterator ByvalParmDbgEnd()   { return ByvalParmDbgValues.end(); }
113bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen};
114bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
115cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greeneclass SelectionDAG;
116cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SDNode *N);
117cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SelectionDAG *DAG);
118cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene
119c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
120c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
121c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
122c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
123c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
124c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
125c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
126c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
127c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
128c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
129cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
130cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
13150d2b1ac029d63500ea9b9347561b1454fa6ed6aDan Gohman  const TargetMachine &TM;
132ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  const TargetSelectionDAGInfo &TSI;
133e4b4edd72ae596ac8d1fdbc6e77f61e331f6775dChandler Carruth  const TargetTransformInfo *TTI;
1347c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
135512063dd0f91a76b9dd904dfff72a52b4d09e89fChris Lattner  LLVMContext *Context;
1360508d047fefef36d4f943ee13c82c18cf3a943abDevang Patel  CodeGenOpt::Level OptLevel;
137cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
138f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
139f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
140f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
141f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
142f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
143cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
144213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
145fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
146fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
147f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
148f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
149f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
150f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
151f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
152f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
153f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
154f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
155691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
156213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
157d23b33435ae722ff5aa5ab97135a4f31041959e2Bob Wilson  /// CSE with existing nodes when a duplicate is requested.
158583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
159213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
160f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
161f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
162f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
163e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
164e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
165e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
166e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
167bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// DbgInfo - Tracks dbg_value information through SDISel.
168bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo *DbgInfo;
169bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
170bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesenpublic:
171bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// DAGUpdateListener - Clients of various APIs that cause global effects on
172bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// the DAG can optionally implement this interface.  This allows the clients
173bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// to handle the various sorts of updates that happen.
174bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  ///
175bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// A DAGUpdateListener automatically registers itself with DAG when it is
176bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// constructed, and removes itself when destroyed in RAII fashion.
177bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  struct DAGUpdateListener {
178bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    DAGUpdateListener *const Next;
179bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    SelectionDAG &DAG;
180bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
181bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    explicit DAGUpdateListener(SelectionDAG &D)
182bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen      : Next(D.UpdateListeners), DAG(D) {
183bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen      DAG.UpdateListeners = this;
184bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    }
185bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
186bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    virtual ~DAGUpdateListener() {
187bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen      assert(DAG.UpdateListeners == this &&
188bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen             "DAGUpdateListeners must be destroyed in LIFO order");
189bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen      DAG.UpdateListeners = Next;
190bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    }
191bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
192bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    /// NodeDeleted - The node N that was deleted and, if E is not null, an
193bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    /// equivalent node E that replaced it.
194bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    virtual void NodeDeleted(SDNode *N, SDNode *E);
195bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
196bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    /// NodeUpdated - The node N that was updated.
197bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen    virtual void NodeUpdated(SDNode *N);
198bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  };
199bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
200bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesenprivate:
201bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// DAGUpdateListener is a friend so it can manipulate the listener stack.
202bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  friend struct DAGUpdateListener;
203bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
204bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// UpdateListeners - Linked list of registered DAGUpdateListener instances.
205bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  /// This stack is maintained by DAGUpdateListener RAII.
206bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  DAGUpdateListener *UpdateListeners;
207bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen
208c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
209c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
210c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
211c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  bool setSubgraphColorHelper(SDNode *N, const char *Color,
212c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif                              DenseSet<SDNode *> &visited,
213c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
214c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
215001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper  void operator=(const SelectionDAG&) LLVM_DELETED_FUNCTION;
216001d3dc976d7cda8a3dd8c7fd4020b0b96033f4eCraig Topper  SelectionDAG(const SelectionDAG&) LLVM_DELETED_FUNCTION;
217819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar
218cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
2190508d047fefef36d4f943ee13c82c18cf3a943abDevang Patel  explicit SelectionDAG(const TargetMachine &TM, llvm::CodeGenOpt::Level);
220cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
221cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2227c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
2237c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
2247c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
225e4b4edd72ae596ac8d1fdbc6e77f61e331f6775dChandler Carruth  void init(MachineFunction &mf, const TargetTransformInfo *TTI);
2267c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman
2277c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// clear - Clear state and free memory necessary to make this
228f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// SelectionDAG ready to process a new block.
229f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  ///
2307c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void clear();
231f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
2327c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction &getMachineFunction() const { return *MF; }
23350d2b1ac029d63500ea9b9347561b1454fa6ed6aDan Gohman  const TargetMachine &getTarget() const { return TM; }
234ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling  const TargetLowering &getTargetLoweringInfo() const {
235ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling    return *TM.getTargetLowering();
236ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling  }
237ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  const TargetSelectionDAGInfo &getSelectionDAGInfo() const { return TSI; }
238e4b4edd72ae596ac8d1fdbc6e77f61e331f6775dChandler Carruth  const TargetTransformInfo *getTargetTransformInfo() const { return TTI; }
239d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext *getContext() const {return Context; }
240cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
241ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
2421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
243462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
2440b12aef49087b57d276ed760a83525d1e2602144Dan Gohman  void viewGraph();
245fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
246ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
247ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
248ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
2491080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
250ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
251ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
252ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
253fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
254ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
255ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
256ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
257fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
258ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
259ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
260ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
261fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
262ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
263ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
264ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
2651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
266c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColor - Convenience for setting subgraph color attribute.
267c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
268c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  void setSubgraphColor(SDNode *N, const char *Color);
269c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
270fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
271b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
272b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
273fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::iterator allnodes_iterator;
274b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
275b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
276fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode>::size_type allnodes_size() const {
2770e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
2780e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
279fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
280c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
281cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
283cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
284c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
285c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
286f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue getEntryNode() const {
287f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    return SDValue(const_cast<SDNode *>(&EntryNode), 0);
288f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  }
289cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
290c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
291cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
293825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    assert((!N.getNode() || N.getValueType() == MVT::Other) &&
294acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
295cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
296cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(N.getNode());
297cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    Root = N;
298cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
299cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(this);
300cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    return Root;
301acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
302cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
3031d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
30425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
30525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
30625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
30798a366d547772010e94609e4584489b3e5ce0043Bill Wendling  void Combine(CombineLevel Level, AliasAnalysis &AA,
30898a366d547772010e94609e4584489b3e5ce0043Bill Wendling               CodeGenOpt::Level OptLevel);
30925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
31001d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
31125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
31225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
31301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
31401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
31501d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
31625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
31725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
318c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
319c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
320c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
321cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
322c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
323c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
324975716af1b9a09274df6c2d92683449015bd8564Dan Gohman  void Legalize();
325c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
3265c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG
3275c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// that only uses vector math operations supported by the target.  This is
3285c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// necessary as a separate step from Legalize because unrolling a vector
3295c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// operation can introduce illegal types, which requires running
3305c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeTypes again.
3315c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
3325c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// This returns true if it made any changes; in that case, LegalizeTypes
3335c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// is called again before Legalize.
3345c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
3355c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// Note that this is an involved process that may invalidate pointers into
3365c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// the graph.
3375c22c8074404797f1313b1334757254fb5c6487aEli Friedman  bool LegalizeVectors();
3385c22c8074404797f1313b1334757254fb5c6487aEli Friedman
339d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
340190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
341190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
342130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
343130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
344130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
345130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
346130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
34770046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
34870046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
349e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT);
350e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2);
351e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3);
352e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4);
353e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(const EVT *VTs, unsigned NumVTs);
354fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
3551b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
35670046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
35770046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
358e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(uint64_t Val, EVT VT, bool isTarget = false);
359e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const APInt &Val, EVT VT, bool isTarget = false);
360e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const ConstantInt &Val, EVT VT, bool isTarget = false);
361475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
362e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(uint64_t Val, EVT VT) {
363cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
364cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
365e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const APInt &Val, EVT VT) {
3666394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
3676394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
368e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const ConstantInt &Val, EVT VT) {
3694fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
3704fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
3710a406ae0d940d92c51ee145b48ff7a483a366849Dale Johannesen  // The forms below that take a double should only be used for simple
3720a406ae0d940d92c51ee145b48ff7a483a366849Dale Johannesen  // constants that can be exactly represented in VT.  No checks are made.
373e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(double Val, EVT VT, bool isTarget = false);
374e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const APFloat& Val, EVT VT, bool isTarget = false);
375e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const ConstantFP &CF, EVT VT, bool isTarget = false);
376e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(double Val, EVT VT) {
377c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
378c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
379e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const APFloat& Val, EVT VT) {
380f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
381f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
382e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const ConstantFP &Val, EVT VT) {
3834fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
3844fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
385ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getGlobalAddress(const GlobalValue *GV, SDLoc DL, EVT VT,
3862a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           int64_t offset = 0, bool isTargetGA = false,
3872a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           unsigned char TargetFlags = 0);
388ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getTargetGlobalAddress(const GlobalValue *GV, SDLoc DL, EVT VT,
3892a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 int64_t offset = 0,
3902a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 unsigned char TargetFlags = 0) {
3910d881dabc1a4e1aefad6dd38de166d8358285638Devang Patel    return getGlobalAddress(GV, DL, VT, offset, true, TargetFlags);
392cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
393e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getFrameIndex(int FI, EVT VT, bool isTarget = false);
394e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetFrameIndex(int FI, EVT VT) {
395c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
396c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
397e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getJumpTable(int JTI, EVT VT, bool isTarget = false,
398f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                       unsigned char TargetFlags = 0);
399e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetJumpTable(int JTI, EVT VT, unsigned char TargetFlags = 0) {
400f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getJumpTable(JTI, VT, true, TargetFlags);
401c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
40246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getConstantPool(const Constant *C, EVT VT,
403f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
404f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
40546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getTargetConstantPool(const Constant *C, EVT VT,
406f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned Align = 0, int Offset = 0,
407f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned char TargetFlags = 0) {
408f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
409c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
410e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantPool(MachineConstantPoolValue *C, EVT VT,
411f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
412f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
413475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
414e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                  EVT VT, unsigned Align = 0,
415f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                  int Offset = 0, unsigned char TargetFlags=0) {
416f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
417d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
41874500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen  SDValue getTargetIndex(int Index, EVT VT, int64_t Offset = 0,
41974500bdba3eae36a1a8a17d8bad0b971b9c212ecJakob Stoklund Olesen                         unsigned char TargetFlags = 0);
4208ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // When generating a branch to a BB, we don't in general know enough
4218ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // to provide debug info for the BB at that time, so keep this one around.
422475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
423ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getBasicBlock(MachineBasicBlock *MBB, SDLoc dl);
424e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExternalSymbol(const char *Sym, EVT VT);
425ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getExternalSymbol(const char *Sym, SDLoc dl, EVT VT);
426e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
4271af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner                                  unsigned char TargetFlags = 0);
428e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getValueType(EVT);
429e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getRegister(unsigned Reg, EVT VT);
4309cf37e8b48732fccd4c301ed51aafed7074bd84eJakob Stoklund Olesen  SDValue getRegisterMask(const uint32_t *RegMask);
431ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getEHLabel(SDLoc dl, SDValue Root, MCSymbol *Label);
43246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDValue getBlockAddress(const BlockAddress *BA, EVT VT,
4336c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao                          int64_t Offset = 0, bool isTarget = false,
4346c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao                          unsigned char TargetFlags = 0);
4356c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao  SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT,
4366c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao                                int64_t Offset = 0,
4376c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao                                unsigned char TargetFlags = 0) {
4386c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao    return getBlockAddress(BA, VT, Offset, true, TargetFlags);
4396c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao  }
440c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
441ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getCopyToReg(SDValue Chain, SDLoc dl, unsigned Reg, SDValue N) {
442825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
4430f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   getRegister(Reg, N.getValueType()), N);
4440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
445cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
446e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
44729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // indicates that there is potentially an incoming glue value (if Glue is not
44829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // null) and that there should be a glue result.
449ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getCopyToReg(SDValue Chain, SDLoc dl, unsigned Reg, SDValue N,
45029d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                       SDValue Glue) {
451f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
45229d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Glue };
45329d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
4540f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
45566a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
456475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
457ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getCopyToReg(SDValue Chain, SDLoc dl, SDValue Reg, SDValue N,
45829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                         SDValue Glue) {
459f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
46029d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, Reg, N, Glue };
46129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyToReg, dl, VTs, Ops, Glue.getNode() ? 4 : 3);
4620f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
463fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
464ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getCopyFromReg(SDValue Chain, SDLoc dl, unsigned Reg, EVT VT) {
465825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(VT, MVT::Other);
4660f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
467fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
4680f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
469fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
470e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
47129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // indicates that there is potentially an incoming glue value (if Glue is not
47229d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  // null) and that there should be a glue result.
473ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getCopyFromReg(SDValue Chain, SDLoc dl, unsigned Reg, EVT VT,
47429d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                           SDValue Glue) {
475f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(VT, MVT::Other, MVT::Glue);
47629d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    SDValue Ops[] = { Chain, getRegister(Reg, VT), Glue };
47729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    return getNode(ISD::CopyFromReg, dl, VTs, Ops, Glue.getNode() ? 3 : 2);
4780f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
47918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
480475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
481cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
48277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
48377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
484ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getConvertRndSat(EVT VT, SDLoc dl, SDValue Val, SDValue DTy,
4850f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue STy,
4860f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
4876154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
4889008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node.  The number of
4899008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// elements in VT, which must be a vector type, must match the number of
4905a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  /// mask elements NumElts.  A integer mask element equal to -1 is treated as
4919008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// undefined.
492ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getVectorShuffle(EVT VT, SDLoc dl, SDValue N1, SDValue N2,
4939008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                           const int *MaskElts);
49477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
495a3c42f3d4e5d14c8f4fb9bb123e7759c425d041bNadav Rotem  /// getAnyExtOrTrunc - Convert Op, which must be of integer type, to the
496a3c42f3d4e5d14c8f4fb9bb123e7759c425d041bNadav Rotem  /// integer type VT, by either any-extending or truncating it.
497ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAnyExtOrTrunc(SDValue Op, SDLoc DL, EVT VT);
498a3c42f3d4e5d14c8f4fb9bb123e7759c425d041bNadav Rotem
4993a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getSExtOrTrunc - Convert Op, which must be of integer type, to the
5003a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either sign-extending or truncating it.
501ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getSExtOrTrunc(SDValue Op, SDLoc DL, EVT VT);
5023a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
5033a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getZExtOrTrunc - Convert Op, which must be of integer type, to the
5043a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either zero-extending or truncating it.
505ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getZExtOrTrunc(SDValue Op, SDLoc DL, EVT VT);
5063a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
5071ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
5081ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
509ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getZeroExtendInReg(SDValue Op, SDLoc DL, EVT SrcTy);
510fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
5114c2454623841f05c6c665659b34c214950d12d7eBob Wilson  /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
512ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNOT(SDLoc DL, SDValue Val, EVT VT);
5134c2454623841f05c6c665659b34c214950d12d7eBob Wilson
5146a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
51529d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// a glue result (to ensure it's not CSE'd).  CALLSEQ_START does not have a
516ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  /// useful SDLoc.
5176e0b2a0cb0d398f175a5294bf0ad5488c714e8c2Andrew Trick  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op, SDLoc DL) {
518f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList VTs = getVTList(MVT::Other, MVT::Glue);
519475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
5206e0b2a0cb0d398f175a5294bf0ad5488c714e8c2Andrew Trick    return getNode(ISD::CALLSEQ_START, DL, VTs, Ops, 2);
5216a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
5221ccae666f596d5aeca5c9942995763600b622062Chris Lattner
5230f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
52429d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  /// glue result (to ensure it's not CSE'd).  CALLSEQ_END does not have
525ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  /// a useful SDLoc.
526475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
5276e0b2a0cb0d398f175a5294bf0ad5488c714e8c2Andrew Trick                           SDValue InGlue, SDLoc DL) {
528f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDVTList NodeTys = getVTList(MVT::Other, MVT::Glue);
529475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
5300f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
5310f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
5320f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
53329d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    Ops.push_back(InGlue);
5346e0b2a0cb0d398f175a5294bf0ad5488c714e8c2Andrew Trick    return getNode(ISD::CALLSEQ_END, DL, NodeTys, &Ops[0],
53529d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner                   (unsigned)Ops.size() - (InGlue.getNode() == 0 ? 1 : 0));
5360f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
5370f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
538ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  /// getUNDEF - Return an UNDEF node.  UNDEF does not have a useful SDLoc.
539e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getUNDEF(EVT VT) {
540ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    return getNode(ISD::UNDEF, SDLoc(), VT);
541e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  }
542e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen
543b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node.  This does
544ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  /// not have a useful SDLoc.
545e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getGLOBAL_OFFSET_TABLE(EVT VT) {
546ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    return getNode(ISD::GLOBAL_OFFSET_TABLE, SDLoc(), VT);
547b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  }
548b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen
549c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
550cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
551ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT);
552ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N);
553ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2);
554ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT,
5557ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
556ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT,
5577ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
558ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT,
5597ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5607ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
561ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT,
5627ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
563ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT,
5647ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
565ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL,
5663853f74aba301ef08b699bac2fa8e53230714a58Benjamin Kramer                  ArrayRef<EVT> ResultTys,
5677ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
568ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, const EVT *VTs, unsigned NumVTs,
5697ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
570ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
5717ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
572ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs);
573ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs, SDValue N);
574ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
5757ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2);
576ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
5777ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
578ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
5797ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
580ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
5817ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5827ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
583475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
58498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// getStackArgumentTokenFactor - Compute a TokenFactor to force all
58598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// the incoming stack arguments to be loaded from the stack. This is
58698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// used in tail call lowering to protect stack arguments from being
58798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// clobbered.
58898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  SDValue getStackArgumentTokenFactor(SDValue Chain);
58998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
590ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemcpy(SDValue Chain, SDLoc dl, SDValue Dst, SDValue Src,
59120adc9dc4650313f017b27d9818eb2176238113dMon P Wang                    SDValue Size, unsigned Align, bool isVol, bool AlwaysInline,
592e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo DstPtrInfo,
593e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo SrcPtrInfo);
5945c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
595ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemmove(SDValue Chain, SDLoc dl, SDValue Dst, SDValue Src,
59620adc9dc4650313f017b27d9818eb2176238113dMon P Wang                     SDValue Size, unsigned Align, bool isVol,
597e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     MachinePointerInfo DstPtrInfo,
598e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     MachinePointerInfo SrcPtrInfo);
5995c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
600ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemset(SDValue Chain, SDLoc dl, SDValue Dst, SDValue Src,
60120adc9dc4650313f017b27d9818eb2176238113dMon P Wang                    SDValue Size, unsigned Align, bool isVol,
602e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                    MachinePointerInfo DstPtrInfo);
6035c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
6047cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
605475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
6067cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
607ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getSetCC(SDLoc DL, EVT VT, SDValue LHS, SDValue RHS,
608d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   ISD::CondCode Cond) {
60928b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands    assert(LHS.getValueType().isVector() == RHS.getValueType().isVector() &&
61028b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands      "Cannot compare scalars to vectors");
61128b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands    assert(LHS.getValueType().isVector() == VT.isVector() &&
61228b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands      "Cannot compare scalars to vectors");
61385cc4d840256841ac231858c3c916e91fe469269Matt Arsenault    assert(Cond != ISD::SETCC_INVALID &&
61485cc4d840256841ac231858c3c916e91fe469269Matt Arsenault        "Cannot create a setCC of an invalid node.");
615d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
6167cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
6179373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
61885cc4d840256841ac231858c3c916e91fe469269Matt Arsenault  // getSelect - Helper function to make it easier to build Select's if you just
61985cc4d840256841ac231858c3c916e91fe469269Matt Arsenault  // have operands and don't want to check for vector.
62085cc4d840256841ac231858c3c916e91fe469269Matt Arsenault  SDValue getSelect(SDLoc DL, EVT VT, SDValue Cond,
62185cc4d840256841ac231858c3c916e91fe469269Matt Arsenault                    SDValue LHS, SDValue RHS) {
62285cc4d840256841ac231858c3c916e91fe469269Matt Arsenault    assert(LHS.getValueType() == RHS.getValueType() &&
62385cc4d840256841ac231858c3c916e91fe469269Matt Arsenault           "Cannot use select on differing types");
62485cc4d840256841ac231858c3c916e91fe469269Matt Arsenault    assert(VT.isVector() == LHS.getValueType().isVector() &&
62585cc4d840256841ac231858c3c916e91fe469269Matt Arsenault           "Cannot mix vectors and scalars");
62685cc4d840256841ac231858c3c916e91fe469269Matt Arsenault    return getNode(Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT, DL, VT,
62785cc4d840256841ac231858c3c916e91fe469269Matt Arsenault                   Cond, LHS, RHS);
62885cc4d840256841ac231858c3c916e91fe469269Matt Arsenault  }
62985cc4d840256841ac231858c3c916e91fe469269Matt Arsenault
6309373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
631475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
6329373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
633ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getSelectCC(SDLoc DL, SDValue LHS, SDValue RHS,
634d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                      SDValue True, SDValue False, ISD::CondCode Cond) {
635d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DL, True.getValueType(),
636d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
6379373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
638fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
639acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
640acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
641ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getVAArg(EVT VT, SDLoc dl, SDValue Chain, SDValue Ptr,
642cbeeae23c31d32b833c9c7c3e8984e4cbcf22f45Rafael Espindola                   SDValue SV, unsigned Align);
6437cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
644fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// getAtomic - Gets a node for an atomic op, produces result and chain and
645c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
646ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, SDValue Chain,
64760bddc8bcd787be645d2f3b64117fee884270e6aChris Lattner                    SDValue Ptr, SDValue Cmp, SDValue Swp,
64855ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    MachinePointerInfo PtrInfo, unsigned Alignment,
64955ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    AtomicOrdering Ordering,
65055ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    SynchronizationScope SynchScope);
651ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, SDValue Chain,
652c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    SDValue Ptr, SDValue Cmp, SDValue Swp,
65355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    MachineMemOperand *MMO,
65455ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    AtomicOrdering Ordering,
65555ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    SynchronizationScope SynchScope);
656ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
657327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  /// getAtomic - Gets a node for an atomic op, produces result (if relevant)
658327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  /// and chain and takes 2 operands.
659ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, SDValue Chain,
660e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Val, const Value* PtrVal,
661327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    unsigned Alignment, AtomicOrdering Ordering,
662327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    SynchronizationScope SynchScope);
663ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, SDValue Chain,
664327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    SDValue Ptr, SDValue Val, MachineMemOperand *MMO,
665327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    AtomicOrdering Ordering,
666327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    SynchronizationScope SynchScope);
667327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman
668327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  /// getAtomic - Gets a node for an atomic op, produces result and chain and
669327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman  /// takes 1 operand.
670ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, EVT VT,
671327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    SDValue Chain, SDValue Ptr, const Value* PtrVal,
67255ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    unsigned Alignment,
67355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    AtomicOrdering Ordering,
67455ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    SynchronizationScope SynchScope);
675ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, EVT VT,
676327236cd6c211e54fc6288b0ac2b413901cc0611Eli Friedman                    SDValue Chain, SDValue Ptr, MachineMemOperand *MMO,
67755ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    AtomicOrdering Ordering,
67855ba816883842e793cdeb32fcb805c4e011b527fEli Friedman                    SynchronizationScope SynchScope);
679ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
680c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
681c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// result and takes a list of operands. Opcode may be INTRINSIC_VOID,
682c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// INTRINSIC_W_CHAIN, or a target-specific opcode with a value not
683c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// less than FIRST_TARGET_MEMORY_OPCODE.
684ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemIntrinsicNode(unsigned Opcode, SDLoc dl,
685e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                              const EVT *VTs, unsigned NumVTs,
686e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
687e9ba5dd236f48708a00bd3bb0519148f943cc897Chris Lattner                              EVT MemVT, MachinePointerInfo PtrInfo,
688e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
689e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
690c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
691ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList,
692e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
693e9ba5dd236f48708a00bd3bb0519148f943cc897Chris Lattner                              EVT MemVT, MachinePointerInfo PtrInfo,
694e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
695e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
696c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
697ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList,
698c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              const SDValue *Ops, unsigned NumOps,
699c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              EVT MemVT, MachineMemOperand *MMO);
700c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
7014bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
702ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, SDLoc dl);
703f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
704c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
705c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
706cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
707ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getLoad(EVT VT, SDLoc dl, SDValue Chain, SDValue Ptr,
708e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                  MachinePointerInfo PtrInfo, bool isVolatile,
709d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper                  bool isNonTemporal, bool isInvariant, unsigned Alignment,
71095d594cac3737ae1594a391276942a443cac426bRafael Espindola                  const MDNode *TBAAInfo = 0, const MDNode *Ranges = 0);
711ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT,
712e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
713e72f2027e9116c55a5b39ac72732df8d6c45d37cChris Lattner                     EVT MemVT, bool isVolatile,
714f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                     bool isNonTemporal, unsigned Alignment,
715f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                     const MDNode *TBAAInfo = 0);
716ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getIndexedLoad(SDValue OrigLoad, SDLoc dl, SDValue Base,
717bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng                         SDValue Offset, ISD::MemIndexedMode AM);
718bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
719ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                  EVT VT, SDLoc dl,
720bcc8017c738e92d9c1af221b11c4916cb524184eEvan Cheng                  SDValue Chain, SDValue Ptr, SDValue Offset,
7215c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                  MachinePointerInfo PtrInfo, EVT MemVT,
722d752e0f7e64585839cb3a458ef52456eaebbea3cPete Cooper                  bool isVolatile, bool isNonTemporal, bool isInvariant,
72395d594cac3737ae1594a391276942a443cac426bRafael Espindola                  unsigned Alignment, const MDNode *TBAAInfo = 0,
72495d594cac3737ae1594a391276942a443cac426bRafael Espindola                  const MDNode *Ranges = 0);
7255c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
726ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                  EVT VT, SDLoc dl,
7275c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                  SDValue Chain, SDValue Ptr, SDValue Offset,
728c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                  EVT MemVT, MachineMemOperand *MMO);
7292d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
730ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
731ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
732ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
7335c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                   MachinePointerInfo PtrInfo, bool isVolatile,
734f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                   bool isNonTemporal, unsigned Alignment,
735f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                   const MDNode *TBAAInfo = 0);
736ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
737c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                   MachineMemOperand *MMO);
738ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
7395c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                        MachinePointerInfo PtrInfo, EVT TVT,
7405c5cb2a1717f8e30b1849d7ec1cf269bc5d66877Chris Lattner                        bool isNonTemporal, bool isVolatile,
741f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                        unsigned Alignment,
742f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                        const MDNode *TBAAInfo = 0);
743ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
744c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                        EVT TVT, MachineMemOperand *MMO);
745ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getIndexedStore(SDValue OrigStoe, SDLoc dl, SDValue Base,
746e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
747ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
748101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getSrcValue - Construct a node to track a Value* through the backend.
749475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
75069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
751decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  /// getMDNode - Return an MDNodeSDNode which holds an MDNode.
752decc2671516e6c52ee2f29f7746f8d02753845eaChris Lattner  SDValue getMDNode(const MDNode *MD);
7536154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
75492abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// getShiftAmountOperand - Return the specified value casted to
75592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// the target's desired shift amount type.
7566154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
75792abc62399881ba9c525be80362c134ad836e2d9Duncan Sands
758b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
759b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
760b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
761b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
762b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
763b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
764027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op);
765027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2);
766027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
767475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
768027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
769475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
770027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
771475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
772027657db7cf60bcbf40403496d7e4a170f9ce1ecDan Gohman  SDNode *UpdateNodeOperands(SDNode *N,
773475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
774fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
7751b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
7761b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
7771b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
778e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
779e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT);
780e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, SDValue Op1);
781e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
782475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
783e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
784475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
785e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
786475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
787e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, EVT VT2);
788e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
789e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, const SDValue *Ops, unsigned NumOps);
790e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
791e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, const SDValue *Ops, unsigned NumOps);
792e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT1,
793e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, EVT VT4, const SDValue *Ops,
79413d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       unsigned NumOps);
795e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
796e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1);
797e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
798e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2);
799e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
800e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
801e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
802e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
803cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
804475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
805694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
806df51247725143acb781c224faffd848cc7cf95d8Chris Lattner  /// MorphNodeTo - This *mutates* the specified node to have the specified
807e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
808e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
809475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
810753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
811602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// getMachineNode - These are used for target selectors to create a new node
812602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// with specified return type(s), MachineInstr opcode, and operands.
8136ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
814602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// Note that getMachineNode returns the resultant node.  If there is already
815602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// a node of the specified opcode and operands, it returns that node instead
816602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// of the current one.
817ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT);
818ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT,
819c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1);
820ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT,
821c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1, SDValue Op2);
822ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT,
8232a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                SDValue Op1, SDValue Op2, SDValue Op3);
824ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT,
8252a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                ArrayRef<SDValue> Ops);
826ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2);
827ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8282a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                SDValue Op1);
829ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8302a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                SDValue Op1, SDValue Op2);
831ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8322a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                SDValue Op1, SDValue Op2, SDValue Op3);
833ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8342a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                ArrayRef<SDValue> Ops);
835ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8362a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                EVT VT3, SDValue Op1, SDValue Op2);
837ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8382a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                EVT VT3, SDValue Op1, SDValue Op2,
8392a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                SDValue Op3);
840ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8412a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                EVT VT3, ArrayRef<SDValue> Ops);
842ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2,
8432a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                EVT VT3, EVT VT4, ArrayRef<SDValue> Ops);
844ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl,
8452a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                ArrayRef<EVT> ResultTys,
8462a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                ArrayRef<SDValue> Ops);
847ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  MachineSDNode *getMachineNode(unsigned Opcode, SDLoc dl, SDVTList VTs,
8482a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao                                ArrayRef<SDValue> Ops);
84908b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
8506a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// getTargetExtractSubreg - A convenience function for creating
8516a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// TargetInstrInfo::EXTRACT_SUBREG nodes.
852ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getTargetExtractSubreg(int SRIdx, SDLoc DL, EVT VT,
8536a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman                                 SDValue Operand);
8546a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman
8555fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// getTargetInsertSubreg - A convenience function for creating
8565fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// TargetInstrInfo::INSERT_SUBREG nodes.
857ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDValue getTargetInsertSubreg(int SRIdx, SDLoc DL, EVT VT,
8585fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson                                SDValue Operand, SDValue Subreg);
8595fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson
86008b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
86108b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
86208b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
863475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
864fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
86531441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  /// getDbgValue - Creates a SDDbgValue node.
86631441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  ///
86731441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  SDDbgValue *getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R, uint64_t Off,
86831441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
86946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDDbgValue *getDbgValue(MDNode *MDPtr, const Value *C, uint64_t Off,
87031441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
87131441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng  SDDbgValue *getDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off,
87231441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng                          DebugLoc DL, unsigned O);
87331441b7e95e0840e1ae144e5db6f791d6a36bc60Evan Cheng
874f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
875f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
876f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
877bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void RemoveDeadNode(SDNode *N);
878fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
8790fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
8800fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
881bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes);
8820fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
8836542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
88426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
88526005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
886c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// if you have two nodes with identical results (or if 'To' has a superset
887c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// of the results of 'From'), use the third otherwise.
8886542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
889fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// These methods all take an optional UpdateListener, which (if not null) is
890f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
891f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
892fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
8939ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// These functions only replace all existing uses. It's possible that as
8949ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// these replacements are being performed, CSE may cause the From node
8959ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// to be given new uses. These new uses of From are left in place, and
8967a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner  /// not automatically transferred to To.
8979ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  ///
898bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void ReplaceAllUsesWith(SDValue From, SDValue Op);
899bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void ReplaceAllUsesWith(SDNode *From, SDNode *To);
900bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void ReplaceAllUsesWith(SDNode *From, const SDValue *To);
901fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
90280274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
903f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
904bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To);
90580274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
906e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
907e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
908e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
909475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
910bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen                                  unsigned Num);
911e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
912f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
913f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
914f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
915f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
916e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
9178be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
9188be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
9198be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
9208be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
9218be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
9228be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
9238be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
9241efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
9251efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
9261efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
9274ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
9284ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
9291efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
9301efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
9311efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
9321efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
9331efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
934b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
935b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
9361efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
9371efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
9381efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
9391efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
9401efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
94156e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::SADDO:
94256e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::UADDO:
943fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    case ISD::ADDC:
9441efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
9451efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
9461efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
9471efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
9481efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
9490a29cb045444c13160e90fe7942a9d7c720185edTim Northover  /// Returns an APFloat semantics tag appropriate for the given type. If VT is
9500a29cb045444c13160e90fe7942a9d7c720185edTim Northover  /// a vector type, the element semantics are returned.
9510a29cb045444c13160e90fe7942a9d7c720185edTim Northover  static const fltSemantics &EVTToAPFloatSemantics(EVT VT) {
9520a29cb045444c13160e90fe7942a9d7c720185edTim Northover    switch (VT.getScalarType().getSimpleVT().SimpleTy) {
9530a29cb045444c13160e90fe7942a9d7c720185edTim Northover    default: llvm_unreachable("Unknown FP format");
9540a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::f16:     return APFloat::IEEEhalf;
9550a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::f32:     return APFloat::IEEEsingle;
9560a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::f64:     return APFloat::IEEEdouble;
9570a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::f80:     return APFloat::x87DoubleExtended;
9580a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::f128:    return APFloat::IEEEquad;
9590a29cb045444c13160e90fe7942a9d7c720185edTim Northover    case MVT::ppcf128: return APFloat::PPCDoubleDouble;
9600a29cb045444c13160e90fe7942a9d7c720185edTim Northover    }
9610a29cb045444c13160e90fe7942a9d7c720185edTim Northover  }
9620a29cb045444c13160e90fe7942a9d7c720185edTim Northover
963bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
964bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// value is produced by SD.
965fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  void AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter);
966bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
967bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// GetDbgValues - Get the debug values which reference the given SDNode.
96822a54c1cd711afccd4558374918d12a939e1cca5Benjamin Kramer  ArrayRef<SDDbgValue*> GetDbgValues(const SDNode* SD) {
969bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng    return DbgInfo->getSDDbgValues(SD);
970bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  }
9716154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
972a2e868d34ccfed46310e98338ded6a74b2b01308Devang Patel  /// TransferDbgValues - Transfer SDDbgValues.
973a2e868d34ccfed46310e98338ded6a74b2b01308Devang Patel  void TransferDbgValues(SDValue From, SDValue To);
974bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
975bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// hasDebugValues - Return true if there are any SDDbgValue nodes associated
976bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  /// with this SelectionDAG.
977bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool hasDebugValues() const { return !DbgInfo->empty(); }
978bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
979bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); }
980bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  SDDbgInfo::DbgIterator DbgEnd()   { return DbgInfo->DbgEnd(); }
9816154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
9826154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson    return DbgInfo->ByvalParmDbgBegin();
983fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  }
9846154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  SDDbgInfo::DbgIterator ByvalParmDbgEnd()   {
9856154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson    return DbgInfo->ByvalParmDbgEnd();
986fdb42fa5fe794cc2c89e2ed7f57a89ed24d9952aDale Johannesen  }
987bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
988cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
989d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
99037ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
991364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
992364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
993e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT, unsigned minAlign = 1);
99447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
99547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// CreateStackTemporary - Create a stack temporary suitable for holding
99647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// either of the specified value types.
997e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT1, EVT VT2);
99847d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
999fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// FoldConstantArithmetic -
10004969310052f45b1e2e5d21735e38641a20be0e21Benjamin Kramer  SDValue FoldConstantArithmetic(unsigned Opcode, EVT VT,
10014969310052f45b1e2e5d21735e38641a20be0e21Benjamin Kramer                                 SDNode *Cst1, SDNode *Cst2);
1002f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
100351dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
1004e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue FoldSetCC(EVT VT, SDValue N1,
1005ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                    SDValue N2, ISD::CondCode Cond, SDLoc dl);
1006fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
10072e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
10082e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
1009475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
10102e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
1011ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
1012ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
1013ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
1014475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
1015ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
1016fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1017ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
1018ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
1019ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
1020fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
1021ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
102226c8dcc692fb2addd475446cfff24d6a4e958bcaRafael Espindola  void ComputeMaskedBits(SDValue Op, APInt &KnownZero, APInt &KnownOne,
102326c8dcc692fb2addd475446cfff24d6a4e958bcaRafael Espindola                         unsigned Depth = 0) const;
1024fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
1025ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
1026ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
1027ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
1028ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
1029ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
1030ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
1031ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
1032475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
1033a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
1034a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// isBaseWithConstantOffset - Return true if the specified operand is an
1035a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// ISD::ADD with a ConstantSDNode on the right-hand side, or if it is an
1036a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// ISD::OR with a ConstantSDNode that is guaranteed to have the same
1037a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  /// semantics as an ADD.  This handles the equivalence:
103894c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru  ///     X|Cst == X+Cst iff X&Cst = 0.
1039a18da59d4028a2e3f5751294e5f487281649299cChris Lattner  bool isBaseWithConstantOffset(SDValue Op) const;
10406154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
10418d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  /// isKnownNeverNan - Test whether the given SDValue is known to never be NaN.
10428d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  bool isKnownNeverNaN(SDValue Op) const;
10438d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman
1044e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isKnownNeverZero - Test whether the given SDValue is known to never be
1045e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// positive or negative Zero.
1046e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isKnownNeverZero(SDValue Op) const;
1047e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
1048e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isEqualTo - Test whether two SDValues are known to compare equal. This
1049e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// is true if they are the same value, or if one is negative zero and the
1050e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// other positive zero.
1051e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isEqualTo(SDValue A, SDValue B) const;
1052e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
1053cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// UnrollVectorOp - Utility function used by legalize and lowering to
1054cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// "unroll" a vector operation by splitting out the scalars and operating
1055cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// on each element individually.  If the ResNE is 0, fully unroll the vector
1056cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// op. If ResNE is less than the width of the vector op, unroll up to ResNE.
1057cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// If the  ResNE is greater than the width of the vector op, unroll the
1058cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// vector op and fill the end of the resulting vector with UNDEFS.
1059cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0);
1060cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang
10616154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
10626154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson  /// location that is 'Dist' units away from the location that the 'Base' load
106364fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  /// is loading from.
106464fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  bool isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base,
106564fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng                         unsigned Bytes, int Dist) const;
106664fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng
1067f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if
1068f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// it cannot be inferred.
10697ced2e0b304e76ab746c7d9a54ad8d4930445a38Evan Cheng  unsigned InferPtrAlignment(SDValue Ptr) const;
1070f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng
1071d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
1072095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
1073bc7d448f242b1bbc1031fb87cd69c285ff9aaffaJakob Stoklund Olesen  void AddModifiedNodeToCSEMaps(SDNode *N);
1074475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
1075475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
1076a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
1077475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
1078a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
1079ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDNode *UpdadeSDLocOnMergedSDNode(SDNode *N, SDLoc loc);
1080b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
1081fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
1082c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman  void DeallocateNode(SDNode *N);
10839c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
1084e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  unsigned getEVTAlignment(EVT MemoryVT) const;
1085f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
1086f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
1087fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1088101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// VTList - List of non-single value types.
1089e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
1090fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
1091101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// CondCodeNodes - Maps to auto-CSE operations.
10927cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
10931cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
109415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
1095e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  std::map<EVT, SDNode*, EVT::compareRawBits> ExtendedValueTypeNodes;
1096056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
10976154f6c9292179fab6346ae8336f2ad790b52028Owen Anderson
10981af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
1099cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
1100cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
11011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
11021080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
11031080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
11041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
11051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
11061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
11071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
11081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
11091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
11101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
1111b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
1112cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1113cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
1114