SelectionDAG.h revision bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// This file declares the SelectionDAG class, and transitively defines the
11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner// SDNode class and subclasses.
12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner//===----------------------------------------------------------------------===//
14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAG_H
16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#define LLVM_CODEGEN_SELECTIONDAG_H
17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
18fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h"
19c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene#include "llvm/ADT/DenseSet.h"
204b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h"
21583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h"
22c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman#include "llvm/Support/RecyclingAllocator.h"
2398a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h"
24acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
255892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector>
26322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
27eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass AliasAnalysis;
326e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patelclass DwarfWriter;
33fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass FunctionLoweringInfo;
34b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineConstantPoolValue;
35b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineFunction;
36b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass MachineModuleInfo;
37b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass SDNodeOrdering;
38bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgValue;
39b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendlingclass TargetLowering;
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 *) {
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    assert(0 && "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;
63bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// instead the info is kept off to the side in this structure.  SDNodes may
64bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// have an associated dbg_value entry in DbgValMap.  Debug info that is not
65bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// associated with any SDNode is held in DbgConstMap.  It is possible for
66bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// optimizations to change a variable to a constant, in which case the
67bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// corresponding debug info is moved from the variable to the constant table
68bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen/// (NYI).
69bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenclass SDDbgInfo {
70bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  DenseMap<const SDNode*, SDDbgValue*> DbgVblMap;
71bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SmallVector<SDDbgValue*, 4> DbgConstMap;
72bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
73bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void operator=(const SDDbgInfo&);   // Do not implement.
74bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo(const SDDbgInfo&);   // Do not implement.
75bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenpublic:
76bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo() {}
77bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
78bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void add(const SDNode *Node, SDDbgValue *V) {
79bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    DbgVblMap[Node] = V;
80bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
81bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void add(SDDbgValue *V) { DbgConstMap.push_back(V); }
82bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void remove(const SDNode *Node) {
83bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    DenseMap<const SDNode*, SDDbgValue*>::iterator Itr =
84bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen                      DbgVblMap.find(Node);
85bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    if (Itr != DbgVblMap.end())
86bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen      DbgVblMap.erase(Itr);
87bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
88bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // No need to remove a constant.
89bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void clear() {
90bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    DbgVblMap.clear();
91bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    DbgConstMap.clear();
92bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
93bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgValue *getSDDbgValue(const SDNode *Node) {
94bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    return DbgVblMap[Node];
95bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
96bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  typedef SmallVector<SDDbgValue*, 4>::iterator ConstDbgIterator;
97bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  ConstDbgIterator DbgConstBegin() { return DbgConstMap.begin(); }
98bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  ConstDbgIterator DbgConstEnd() { return DbgConstMap.end(); }
99bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen};
100bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
10125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sandsenum CombineLevel {
10225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  Unrestricted,   // Combine may create illegal operations and illegal types.
10325cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalTypes, // Combine may create illegal operations but no illegal types.
10425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  NoIllegalOperations // Combine may only create legal operations and types.
10525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands};
10625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
107cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greeneclass SelectionDAG;
108cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SDNode *N);
109cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greenevoid checkForCycles(const SelectionDAG *DAG);
110cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene
111c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
112c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
113c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
114c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
115c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
116c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
117c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
118c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
119c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
120c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
121cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
122cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
123063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
1247c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction *MF;
125ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &FLI;
12644c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI;
1276e7a1617ac4a34792d9097b8d3644b72f57a45f7Devang Patel  DwarfWriter *DW;
128d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext* Context;
129cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
130f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// EntryNode - The starting token.
131f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDNode EntryNode;
132f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
133f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// Root - The root of the entire DAG.
134f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue Root;
135cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
136213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
137fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode> AllNodes;
138fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
139f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
140f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// pool allocation with recycling.
141f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
142f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman                             AlignOf<MostAlignedSDNode>::Alignment>
143f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    NodeAllocatorType;
144f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
145f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// NodeAllocator - Pool allocation for nodes.
146f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  NodeAllocatorType NodeAllocator;
147691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
148213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
149d23b33435ae722ff5aa5ab97135a4f31041959e2Bob Wilson  /// CSE with existing nodes when a duplicate is requested.
150583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
151213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
152f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
153f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  BumpPtrAllocator OperandAllocator;
154f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
155e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
156e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
157e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
158e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
159b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// SDNodeOrdering - The ordering of the SDNodes. It roughly corresponds to
160b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// the ordering of the original LLVM instructions.
161b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  SDNodeOrdering *Ordering;
162819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar
163bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// DbgInfo - Tracks dbg_value information through SDISel.
164bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo *DbgInfo;
165bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
166d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  /// VerifyNode - Sanity check the given node.  Aborts if it is invalid.
167d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  void VerifyNode(SDNode *N);
168d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands
169c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColorHelper - Implementation of setSubgraphColor.
170c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// Return whether we had to truncate the search.
171c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
172c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  bool setSubgraphColorHelper(SDNode *N, const char *Color,
173c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif                              DenseSet<SDNode *> &visited,
174c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene                              int level, bool &printed);
175c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
176819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar  void operator=(const SelectionDAG&); // Do not implement.
177819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar  SelectionDAG(const SelectionDAG&);   // Do not implement.
178819309efec6f11ba752bd7cbfe186495745f020bDaniel Dunbar
179cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
1807c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
181cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
182cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1837c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// init - Prepare this SelectionDAG to process code in the given
1847c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// MachineFunction.
1857c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  ///
1865dcaceb0a6a7fcf508d9898547e10d374b0e4cd1Owen Anderson  void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
1877c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman
1887c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  /// clear - Clear state and free memory necessary to make this
189f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  /// SelectionDAG ready to process a new block.
190f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  ///
1917c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  void clear();
192f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
1937c3234c6be0dc0bdf4b5d6f848cd728a77f349d7Dan Gohman  MachineFunction &getMachineFunction() const { return *MF; }
194063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
195063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
196ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
19744c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
19883489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel  DwarfWriter *getDwarfWriter() const { return DW; }
199d1474d09cbe5fdeec8ba0d6c6b52f316f3422532Owen Anderson  LLVMContext *getContext() const {return Context; }
200cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
201ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
2021080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
203462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
2040b12aef49087b57d276ed760a83525d1e2602144Dan Gohman  void viewGraph();
205fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
206ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
207ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
208ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
2091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
210ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
211ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
212ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
213fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
214ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
215ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
216ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
217fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
218ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
219ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
220ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
221fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
222ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
223ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
224ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
2251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
226c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  /// setGraphColor - Convenience for setting subgraph color attribute.
227c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  ///
228c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene  void setSubgraphColor(SDNode *N, const char *Color);
229c5e7e8d87d4a3b10edd5ac93ba1f3cdb4d1b449aDavid Greene
230fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
231b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
232b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
233fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<SDNode>::iterator allnodes_iterator;
234b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
235b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
236fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  ilist<SDNode>::size_type allnodes_size() const {
2370e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
2380e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
239fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
240c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
241cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
242475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
243cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
244c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
245c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
246f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  SDValue getEntryNode() const {
247f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman    return SDValue(const_cast<SDNode *>(&EntryNode), 0);
248f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  }
249cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
250c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
251cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
252475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
253825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    assert((!N.getNode() || N.getValueType() == MVT::Other) &&
254acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
255cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
256cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(N.getNode());
257cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    Root = N;
258cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    if (N.getNode())
259cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene      checkForCycles(this);
260cf495bc2e505e52ad018da55bed11c7b8bc97db5David Greene    return Root;
261acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
262cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2631d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
26425cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// certain types of nodes together, or eliminating superfluous nodes.  The
26525cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// Level argument controls whether Combine is allowed to produce nodes and
26625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// types that are illegal on the target.
26798a366d547772010e94609e4584489b3e5ce0043Bill Wendling  void Combine(CombineLevel Level, AliasAnalysis &AA,
26898a366d547772010e94609e4584489b3e5ce0043Bill Wendling               CodeGenOpt::Level OptLevel);
26925cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
27001d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
27125cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// only uses types natively supported by the target.  Returns "true" if it
27225cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  /// made any changes.
27301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
27401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
27501d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
27625cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands  bool LegalizeTypes();
27725cf2275ff7de3de3bc0e508abaf457413d74725Duncan Sands
278c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
279c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
280c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
281cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
282c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
283c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
284714efc63d4319b771d89a95aa7a42d400f03d8c9Dan Gohman  void Legalize(CodeGenOpt::Level OptLevel);
285c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
2865c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG
2875c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// that only uses vector math operations supported by the target.  This is
2885c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// necessary as a separate step from Legalize because unrolling a vector
2895c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// operation can introduce illegal types, which requires running
2905c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// LegalizeTypes again.
2915c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
2925c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// This returns true if it made any changes; in that case, LegalizeTypes
2935c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// is called again before Legalize.
2945c22c8074404797f1313b1334757254fb5c6487aEli Friedman  ///
2955c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// Note that this is an involved process that may invalidate pointers into
2965c22c8074404797f1313b1334757254fb5c6487aEli Friedman  /// the graph.
2975c22c8074404797f1313b1334757254fb5c6487aEli Friedman  bool LegalizeVectors();
2985c22c8074404797f1313b1334757254fb5c6487aEli Friedman
299d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
300190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
301190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
302130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
303130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
304130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
305130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
306130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
30770046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
30870046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
309e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT);
310e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2);
311e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3);
312e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4);
313e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDVTList getVTList(const EVT *VTs, unsigned NumVTs);
314fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
3151b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
31670046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
31770046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
318e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(uint64_t Val, EVT VT, bool isTarget = false);
319e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const APInt &Val, EVT VT, bool isTarget = false);
320e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstant(const ConstantInt &Val, EVT VT, bool isTarget = false);
321475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
322e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(uint64_t Val, EVT VT) {
323cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
324cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
325e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const APInt &Val, EVT VT) {
3266394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
3276394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
328e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstant(const ConstantInt &Val, EVT VT) {
3294fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstant(Val, VT, true);
3304fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
331e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(double Val, EVT VT, bool isTarget = false);
332e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const APFloat& Val, EVT VT, bool isTarget = false);
333e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantFP(const ConstantFP &CF, EVT VT, bool isTarget = false);
334e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(double Val, EVT VT) {
335c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
336c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
337e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const APFloat& Val, EVT VT) {
338f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
339f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
340e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantFP(const ConstantFP &Val, EVT VT) {
3414fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman    return getConstantFP(Val, VT, true);
3424fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman  }
343e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getGlobalAddress(const GlobalValue *GV, EVT VT,
3442a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           int64_t offset = 0, bool isTargetGA = false,
3452a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                           unsigned char TargetFlags = 0);
346e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetGlobalAddress(const GlobalValue *GV, EVT VT,
3472a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 int64_t offset = 0,
3482a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner                                 unsigned char TargetFlags = 0) {
3492a4ed82ce2ba4a02f2a02eb4ed8ce5186f3f93daChris Lattner    return getGlobalAddress(GV, VT, offset, true, TargetFlags);
350cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
351e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getFrameIndex(int FI, EVT VT, bool isTarget = false);
352e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetFrameIndex(int FI, EVT VT) {
353c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
354c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
355e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getJumpTable(int JTI, EVT VT, bool isTarget = false,
356f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                       unsigned char TargetFlags = 0);
357e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetJumpTable(int JTI, EVT VT, unsigned char TargetFlags = 0) {
358f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getJumpTable(JTI, VT, true, TargetFlags);
359c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
360e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantPool(Constant *C, EVT VT,
361f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
362f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
363e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetConstantPool(Constant *C, EVT VT,
364f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned Align = 0, int Offset = 0,
365f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                unsigned char TargetFlags = 0) {
366f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
367c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
368e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConstantPool(MachineConstantPoolValue *C, EVT VT,
369f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned Align = 0, int Offs = 0, bool isT=false,
370f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                          unsigned char TargetFlags = 0);
371475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
372e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                  EVT VT, unsigned Align = 0,
373f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner                                  int Offset = 0, unsigned char TargetFlags=0) {
374f5a5546f435a261c93078defb41ed18d9cafd7d3Chris Lattner    return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
375d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
3768ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // When generating a branch to a BB, we don't in general know enough
3778ad9b43e690e8773cf836b30e8da26bc71e18844Dale Johannesen  // to provide debug info for the BB at that time, so keep this one around.
378475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
379e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
380e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExternalSymbol(const char *Sym, EVT VT);
381e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExternalSymbol(const char *Sym, DebugLoc dl, EVT VT);
382e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
3831af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner                                  unsigned char TargetFlags = 0);
384e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getValueType(EVT);
385e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getRegister(unsigned Reg, EVT VT);
386fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
387e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                   unsigned LabelID);
38829cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  SDValue getBlockAddress(BlockAddress *BA, EVT VT,
38929cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman                          bool isTarget = false, unsigned char TargetFlags = 0);
390c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
3910f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
392825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
3930f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   getRegister(Reg, N.getValueType()), N);
3940f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
395cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
396e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
397e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
398e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
3990f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
400be1be5ef0d5a2bb52746b6bd69d4b1e88513c81aEvan Cheng                       SDValue Flag) {
401825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
4020f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
403fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
4040f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
40566a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
406475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
4070f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
4080f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                         SDValue Flag) {
409825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
4100f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, Reg, N, Flag };
411fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
4120f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
413fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
414e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT) {
415825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(VT, MVT::Other);
4160f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
417fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
4180f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
419fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
420e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
421e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
422e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
423e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, EVT VT,
4240f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Flag) {
425825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(VT, MVT::Other, MVT::Flag);
4260f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen    SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
427fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2);
4280f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  }
42918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
430475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
431cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
43277cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// Returns the ConvertRndSat Note: Avoid using this node because it may
43377cdf30742284a173fe818417eb482224cdee8d4Mon P Wang  /// disappear in the future and most targets don't support it.
434e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getConvertRndSat(EVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
4350f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue STy,
4360f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                           SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
4379008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
4389008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node.  The number of
4399008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// elements in VT, which must be a vector type, must match the number of
4405a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  /// mask elements NumElts.  A integer mask element equal to -1 is treated as
4419008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman  /// undefined.
442e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
4439008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                           const int *MaskElts);
44477cdf30742284a173fe818417eb482224cdee8d4Mon P Wang
4453a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getSExtOrTrunc - Convert Op, which must be of integer type, to the
4463a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either sign-extending or truncating it.
4473a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  SDValue getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
4483a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
4493a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// getZExtOrTrunc - Convert Op, which must be of integer type, to the
4503a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  /// integer type VT, by either zero-extending or truncating it.
4513a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands  SDValue getZExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
4523a66a68b0cc81193abfc074b1d360a4950151d38Duncan Sands
4531ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
4541ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
455e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, EVT SrcTy);
456fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
4574c2454623841f05c6c665659b34c214950d12d7eBob Wilson  /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
458e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNOT(DebugLoc DL, SDValue Val, EVT VT);
4594c2454623841f05c6c665659b34c214950d12d7eBob Wilson
4606a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
461e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// a flag result (to ensure it's not CSE'd).  CALLSEQ_START does not have a
462e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// useful DebugLoc.
463475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
464825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
465475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
466fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
467fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman                   VTs, Ops, 2);
4686a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
4691ccae666f596d5aeca5c9942995763600b622062Chris Lattner
4700f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
471e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// flag result (to ensure it's not CSE'd).  CALLSEQ_END does not have
472e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// a useful DebugLoc.
473475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
474475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue InFlag) {
475825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
476475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
4770f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
4780f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
4790f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
4800f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(InFlag);
481e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
482fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel                   &Ops[0],
483ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif                   (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
4840f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
4850f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
486e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  /// getUNDEF - Return an UNDEF node.  UNDEF does not have a useful DebugLoc.
487e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getUNDEF(EVT VT) {
488e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
489e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  }
490e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen
491b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node.  This does
492b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  /// not have a useful DebugLoc.
493e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getGLOBAL_OFFSET_TABLE(EVT VT) {
494b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen    return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT);
495b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  }
496b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen
497c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
498cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
499e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT);
500e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N);
501e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT, SDValue N1, SDValue N2);
502e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5037ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
504e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5057ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
506e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5077ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5087ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
509e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5107ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDUse *Ops, unsigned NumOps);
511e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, EVT VT,
5127ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5137ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL,
514e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                  const std::vector<EVT> &ResultTys,
5157ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
516e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getNode(unsigned Opcode, DebugLoc DL, const EVT *VTs, unsigned NumVTs,
5177ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5187ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5197ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  const SDValue *Ops, unsigned NumOps);
5207ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
5217ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
5227ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5237ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2);
5247ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5257ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3);
5267ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5277ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4);
5287ade28cd62f5188951387e1056a46001388a21f9Bill Wendling  SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5297ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N1, SDValue N2, SDValue N3, SDValue N4,
5307ade28cd62f5188951387e1056a46001388a21f9Bill Wendling                  SDValue N5);
531475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
53298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// getStackArgumentTokenFactor - Compute a TokenFactor to force all
53398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// the incoming stack arguments to be loaded from the stack. This is
53498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// used in tail call lowering to protect stack arguments from being
53598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// clobbered.
53698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  SDValue getStackArgumentTokenFactor(SDValue Chain);
53798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
5380f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
5390f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    SDValue Size, unsigned Align, bool AlwaysInline,
5400f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    const Value *DstSV, uint64_t DstSVOff,
54101f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *SrcSV, uint64_t SrcSVOff);
5425c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5430f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
5440f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                     SDValue Size, unsigned Align,
5450f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                     const Value *DstSV, uint64_t DstOSVff,
54601f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                     const Value *SrcSV, uint64_t SrcSVOff);
5475c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5480f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen  SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
5490f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                    SDValue Size, unsigned Align,
55001f63cdb0433fd2e4b76538ee58ee89c26349564Evan Cheng                    const Value *DstSV, uint64_t DstSVOff);
5515c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
5527cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
553475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
5547cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
555e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS,
556d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   ISD::CondCode Cond) {
557d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
558b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
559b43e9c196542acc80c9e4643809661065710848fNate Begeman
560b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
561475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
562b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
563e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getVSetCC(DebugLoc DL, EVT VT, SDValue LHS, SDValue RHS,
564d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                    ISD::CondCode Cond) {
565d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
5667cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
5679373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
5689373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
569475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
5709373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
571d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling  SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
572d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                      SDValue True, SDValue False, ISD::CondCode Cond) {
573d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling    return getNode(ISD::SELECT_CC, DL, True.getValueType(),
574d69c3141ed6d237ad19fdfbfcef8901491b24c2eBill Wendling                   LHS, RHS, True, False, getCondCode(Cond));
5759373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
576fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
577acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
578acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
579e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getVAArg(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
5800f502f6f44f2756f5cb7b17d8f1d8eae000d51b4Dale Johannesen                   SDValue SV);
5817cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
582fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// getAtomic - Gets a node for an atomic op, produces result and chain and
583c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 3 operands
584e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
585e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
586e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment=0);
587c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
588c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    SDValue Ptr, SDValue Cmp, SDValue Swp,
589c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    MachineMemOperand *MMO);
590ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
591c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getAtomic - Gets a node for an atomic op, produces result and chain and
592c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// takes 2 operands.
593e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
594e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    SDValue Ptr, SDValue Val, const Value* PtrVal,
595e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                    unsigned Alignment = 0);
596c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT, SDValue Chain,
597c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    SDValue Ptr, SDValue Val,
598c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                    MachineMemOperand *MMO);
599ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
600c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang  /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
601c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// result and takes a list of operands. Opcode may be INTRINSIC_VOID,
602c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// INTRINSIC_W_CHAIN, or a target-specific opcode with a value not
603c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// less than FIRST_TARGET_MEMORY_OPCODE.
604e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
605e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                              const EVT *VTs, unsigned NumVTs,
606e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
607e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                              EVT MemVT, const Value *srcValue, int SVOff,
608e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
609e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
610c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
611e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
612e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              const SDValue *Ops, unsigned NumOps,
613e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                              EVT MemVT, const Value *srcValue, int SVOff,
614e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              unsigned Align = 0, bool Vol = false,
615e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                              bool ReadMem = true, bool WriteMem = true);
616c4d1021ead43cfa7da08a8f7ddc9a059a8ba14c5Mon P Wang
617c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
618c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              const SDValue *Ops, unsigned NumOps,
619c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                              EVT MemVT, MachineMemOperand *MMO);
620c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
6214bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
62254c94525f420cab274af60e98a77f081f96e59c2Dale Johannesen  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
623f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
624c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
625c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
626cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
627e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
6281e559443a17d1b335f697551c6263ba60d5dd827David Greene                  const Value *SV, int SVOffset, bool isVolatile,
6291e559443a17d1b335f697551c6263ba60d5dd827David Greene                  bool isNonTemporal, unsigned Alignment);
630e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT,
6311e559443a17d1b335f697551c6263ba60d5dd827David Greene                     SDValue Chain, SDValue Ptr, const Value *SV,
6321e559443a17d1b335f697551c6263ba60d5dd827David Greene                     int SVOffset, EVT MemVT, bool isVolatile,
6331e559443a17d1b335f697551c6263ba60d5dd827David Greene                     bool isNonTemporal, unsigned Alignment);
634e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
635e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
636e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
637e6798372ea38e5ea24c26282a0d69aa6e3829854Nate Begeman                  EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset,
6388a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman                  const Value *SV, int SVOffset, EVT MemVT,
6391e559443a17d1b335f697551c6263ba60d5dd827David Greene                  bool isVolatile, bool isNonTemporal, unsigned Alignment);
640c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
641c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                  EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset,
642c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                  EVT MemVT, MachineMemOperand *MMO);
6432d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
644ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
645ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
646e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
6471e559443a17d1b335f697551c6263ba60d5dd827David Greene                   const Value *SV, int SVOffset, bool isVolatile,
6481e559443a17d1b335f697551c6263ba60d5dd827David Greene                   bool isNonTemporal, unsigned Alignment);
649c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
650c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                   MachineMemOperand *MMO);
651e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
6521e559443a17d1b335f697551c6263ba60d5dd827David Greene                        const Value *SV, int SVOffset, EVT TVT,
6531e559443a17d1b335f697551c6263ba60d5dd827David Greene                        bool isNonTemporal, bool isVolatile,
6541e559443a17d1b335f697551c6263ba60d5dd827David Greene                        unsigned Alignment);
655c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
656c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                        EVT TVT, MachineMemOperand *MMO);
657e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen  SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
658e8c17335c53f0f37262ee342f46b0d00ac0c1493Dale Johannesen                           SDValue Offset, ISD::MemIndexedMode AM);
659ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
660101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// getSrcValue - Construct a node to track a Value* through the backend.
661475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
66269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
66392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// getShiftAmountOperand - Return the specified value casted to
66492abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  /// the target's desired shift amount type.
66592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  SDValue getShiftAmountOperand(SDValue Op);
66692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands
667b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
668b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
669b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
670b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
671b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
672b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
673475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op);
674475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
675475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
676475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
677475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
678475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
679475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
680475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
681475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N,
682475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
683fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
6841b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
6851b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
6861b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
687e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
688e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT);
689e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT, SDValue Op1);
690e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
691475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
692e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
693475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
694e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT,
695475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
696e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1, EVT VT2);
697e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
698e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, const SDValue *Ops, unsigned NumOps);
699e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
700e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, const SDValue *Ops, unsigned NumOps);
701e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT1,
702e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, EVT VT4, const SDValue *Ops,
70313d6d446f62f908e8cf74acb3a4df65ea5f497ceBill Wendling                       unsigned NumOps);
704e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
705e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1);
706e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
707e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2);
708e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
709e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
710e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, EVT VT1,
711e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       EVT VT2, EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
712cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
713475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
714694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
715df51247725143acb781c224faffd848cc7cf95d8Chris Lattner  /// MorphNodeTo - This *mutates* the specified node to have the specified
716e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
717e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
718475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
719753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
720602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// getMachineNode - These are used for target selectors to create a new node
721602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// with specified return type(s), MachineInstr opcode, and operands.
7226ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
723602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// Note that getMachineNode returns the resultant node.  If there is already
724602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// a node of the specified opcode and operands, it returns that node instead
725602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman  /// of the current one.
726c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT);
727c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
728c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1);
729c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
730c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman                                SDValue Op1, SDValue Op2);
731c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
732602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         SDValue Op1, SDValue Op2, SDValue Op3);
733c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
734602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         const SDValue *Ops, unsigned NumOps);
735c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2);
736c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
737602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         SDValue Op1);
738c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1,
739602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT2, SDValue Op1, SDValue Op2);
740c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1,
741602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
742c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
743602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         const SDValue *Ops, unsigned NumOps);
744c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
745602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, SDValue Op1, SDValue Op2);
746c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
747602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
748c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
749602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, const SDValue *Ops, unsigned NumOps);
750c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2,
751602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                         EVT VT3, EVT VT4, const SDValue *Ops, unsigned NumOps);
752c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl,
753c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         const std::vector<EVT> &ResultTys, const SDValue *Ops,
754c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         unsigned NumOps);
755c81b783e2777b70f4533a4750489d058b6b74ad9Dan Gohman  MachineSDNode *getMachineNode(unsigned Opcode, DebugLoc dl, SDVTList VTs,
756c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                         const SDValue *Ops, unsigned NumOps);
75708b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
7586a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// getTargetExtractSubreg - A convenience function for creating
7596a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  /// TargetInstrInfo::EXTRACT_SUBREG nodes.
7606a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman  SDValue getTargetExtractSubreg(int SRIdx, DebugLoc DL, EVT VT,
7616a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman                                 SDValue Operand);
7626a402dc952ccad3f8fd0d9e272dbdd261f50854eDan Gohman
7635fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// getTargetInsertSubreg - A convenience function for creating
7645fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  /// TargetInstrInfo::INSERT_SUBREG nodes.
7655fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson  SDValue getTargetInsertSubreg(int SRIdx, DebugLoc DL, EVT VT,
7665fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson                                SDValue Operand, SDValue Subreg);
7675fcbf0d26ecb99d54c182f542bf8db43ff048d6dBob Wilson
76808b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
76908b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
77008b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
771475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
772fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
773f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
774f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
775f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
776f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
777f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
778f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
779edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
780edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
781edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
782edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
783edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
784edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
785f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
786f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
787fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
788f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
789f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
790f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
791f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
792fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
7930fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
7940fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
7950fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
7960fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
7970fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
7986542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
79926005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
80026005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
801c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// if you have two nodes with identical results (or if 'To' has a superset
802c23e4968790395053f3f52aeb3342637fcaafdbfDan Gohman  /// of the results of 'From'), use the third otherwise.
8036542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
804fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// These methods all take an optional UpdateListener, which (if not null) is
805f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
806f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
807fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
8089ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// These functions only replace all existing uses. It's possible that as
8099ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// these replacements are being performed, CSE may cause the From node
8109ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// to be given new uses. These new uses of From are left in place, and
8119ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  /// not automatically transfered to To.
8129ad136c851e0a66eb471573aac9fec47d53a61baDan Gohman  ///
813475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
814f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
815fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
816f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
817475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
818f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
819fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
82080274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
821f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
822475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
823f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
82480274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
825e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
826e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
827e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
828475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
829e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
830e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
831e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
832f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
833f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// assign a unique node id for each node in the DAG based on their
834f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  /// topological order. Returns the number of nodes.
835f06c835f769aa1cf67801ed1f6bd366a447c18b1Dan Gohman  unsigned AssignTopologicalOrder();
836e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
8378be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// RepositionNode - Move node N in the AllNodes list to be immediately
8388be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// before the given iterator Position. This may be used to update the
8398be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  /// topological ordering when the list of nodes is modified.
8408be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  void RepositionNode(allnodes_iterator Position, SDNode *N) {
8418be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman    AllNodes.insert(Position, AllNodes.remove(N));
8428be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman  }
8438be6bbe5bfd50945ac6c5542e0f54a0924a5db8dDan Gohman
8441efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
8451efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
8461efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
8474ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
8484ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
8491efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
8501efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
8511efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
8521efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
8531efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
854b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
855b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
8561efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
8571efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
8581efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
8591efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
8601efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
86156e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::SADDO:
86256e04a80b3cbd348aaf8f1828ed28fb4a9de2312Dan Gohman    case ISD::UADDO:
863fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel    case ISD::ADDC:
8641efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
8651efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
8661efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
8671efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
8681efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
869b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// AssignOrdering - Assign an order to the SDNode.
8704533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  void AssignOrdering(const SDNode *SD, unsigned Order);
871b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling
8720777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling  /// GetOrdering - Get the order for the SDNode.
8730777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling  unsigned GetOrdering(const SDNode *SD) const;
8740777e927214c61c5d681e5b7dd5d00665c81133aBill Wendling
875bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// AssignDbgInfo - Assign debug info to the SDNode.
876bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void AssignDbgInfo(SDNode *SD, SDDbgValue *db);
877bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
878bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// RememberDbgInfo - Remember debug info with no associated SDNode.
879bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  void RememberDbgInfo(SDDbgValue *db);
880bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
881bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  /// GetDbgInfo - Get the debug info for the SDNode.
882bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgValue *GetDbgInfo(const SDNode* SD);
883bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
884bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo::ConstDbgIterator DbgConstBegin() {
885bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    return DbgInfo->DbgConstBegin();
886bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
887bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgInfo::ConstDbgIterator DbgConstEnd() { return DbgInfo->DbgConstEnd(); }
888bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
889cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
890d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
89137ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
892364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
893364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
894e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT, unsigned minAlign = 1);
89547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
89647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// CreateStackTemporary - Create a stack temporary suitable for holding
89747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  /// either of the specified value types.
898e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue CreateStackTemporary(EVT VT1, EVT VT2);
89947d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
900fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// FoldConstantArithmetic -
901f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling  SDValue FoldConstantArithmetic(unsigned Opcode,
902e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                 EVT VT,
903f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst1,
904f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling                                 ConstantSDNode *Cst2);
905f3cbca279db891403659208a99f8e1cceb8c9ea6Bill Wendling
90651dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
907e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  SDValue FoldSetCC(EVT VT, SDValue N1,
908ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                    SDValue N2, ISD::CondCode Cond, DebugLoc dl);
909fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
9102e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
9112e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
912475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
9132e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
914ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
915ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
916ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
917475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
918ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
919fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
920ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
921ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
922ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
923fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
924ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
925475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
926fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
927fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
928ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
929ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
930ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
931ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
932ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
933ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
934ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
935475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
936a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
9378d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  /// isKnownNeverNan - Test whether the given SDValue is known to never be NaN.
9388d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman  bool isKnownNeverNaN(SDValue Op) const;
9398d44b28bc6f615b9ad79b066987d53b1ea2a2942Dan Gohman
940e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isKnownNeverZero - Test whether the given SDValue is known to never be
941e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// positive or negative Zero.
942e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isKnownNeverZero(SDValue Op) const;
943e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
944e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// isEqualTo - Test whether two SDValues are known to compare equal. This
945e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// is true if they are the same value, or if one is negative zero and the
946e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  /// other positive zero.
947e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman  bool isEqualTo(SDValue A, SDValue B) const;
948e832693acbfc713bcaf44720efa8149e93a38027Dan Gohman
949475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
950a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng  /// been verified as a debug information descriptor.
951475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool isVerifiedDebugInfoDesc(SDValue Op) const;
95277f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng
95377f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// getShuffleScalarElt - Returns the scalar element that will make up the ith
95477f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// element of the result of the vector shuffle.
9555a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman  SDValue getShuffleScalarElt(const ShuffleVectorSDNode *N, unsigned Idx);
956fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
957cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// UnrollVectorOp - Utility function used by legalize and lowering to
958cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// "unroll" a vector operation by splitting out the scalars and operating
959cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// on each element individually.  If the ResNE is 0, fully unroll the vector
960cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// op. If ResNE is less than the width of the vector op, unroll up to ResNE.
961cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// If the  ResNE is greater than the width of the vector op, unroll the
962cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  /// vector op and fill the end of the resulting vector with UNDEFS.
963cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang  SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0);
964cd6e725f21852e2f8cdf5fd0e65eb42c224776f8Mon P Wang
96564fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
96664fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  /// location that is 'Dist' units away from the location that the 'Base' load
96764fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  /// is loading from.
96864fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng  bool isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base,
96964fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng                         unsigned Bytes, int Dist) const;
97064fa4a9584113f63eccc1a650e7e0cc4ddbab3f6Evan Cheng
971f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if
972f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng  /// it cannot be inferred.
9737ced2e0b304e76ab746c7d9a54ad8d4930445a38Evan Cheng  unsigned InferPtrAlignment(SDValue Ptr) const;
974f2dc5c785dea1816cbc064b58b4b6ea23c4fd7d4Evan Cheng
975d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
976095cc29f321382e1f7d295e262a28197f92c5491Dan Gohman  bool RemoveNodeFromCSEMaps(SDNode *N);
977399461095b033438d1f5863cd0d6f82a616f74dcDan Gohman  void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
978475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
979475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
980a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
981475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
982a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
983b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
984fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
985c53361294957b63a9c1e405256c6f0a81db1685cDan Gohman  void DeallocateNode(SDNode *N);
9869c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
987e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  unsigned getEVTAlignment(EVT MemoryVT) const;
988f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman
989f350b277f32d7d47f86c0e54f4aec4d470500618Dan Gohman  void allnodes_clear();
990fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
991101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// VTList - List of non-single value types.
992e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
993fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel
994101a90f3d3c3ad9159676ba744b59b3a9d0b4af5Dan Gohman  /// CondCodeNodes - Maps to auto-CSE operations.
9957cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
9961cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
99715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
998e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  std::map<EVT, SDNode*, EVT::compareRawBits> ExtendedValueTypeNodes;
999056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  StringMap<SDNode*> ExternalSymbols;
10001af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner
10011af2231da64a14d638406d133c7912bfc1c8a9ceChris Lattner  std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
1002cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
1003cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
10041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
10051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
10061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
10071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
10081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
10091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
10101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
10111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
10121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
10131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
1014b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
1015cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1016cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
1017