SelectionDAG.h revision 475871a144eb604ddaf37503397ba0941442e5fb
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
18583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/ADT/FoldingSet.h"
194b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman#include "llvm/ADT/StringMap.h"
20583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey#include "llvm/CodeGen/SelectionDAGNodes.h"
21b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
22acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman#include <cassert>
23109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner#include <list>
245892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattner#include <vector>
25322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
26eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
29c7c3f110eda0ff8040e4bd99e38d3112b910810fJim Laskey  class AliasAnalysis;
30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetLowering;
31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetMachine;
3244c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  class MachineModuleInfo;
33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class MachineFunction;
34d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  class MachineConstantPoolValue;
35ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  class FunctionLoweringInfo;
36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
38c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
41c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
42c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
43c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
44c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
45c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
46c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
47cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
48cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
49063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
50c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &MF;
51ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &FLI;
5244c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI;
53cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
54213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// Root - The root of the entire DAG.  EntryNode - The starting token.
55475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Root, EntryNode;
56cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
57213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// AllNodes - A linked list of nodes in the current DAG.
580e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  alist<SDNode, LargestSDNode> &AllNodes;
59691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
60213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSEMap - This structure is used to memoize nodes, automatically performing
61213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner  /// CSE with existing nodes with a duplicate is requested.
62583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey  FoldingSet<SDNode> CSEMap;
63213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
64e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// Allocator - Pool allocation for misc. objects that are created once per
65e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// SelectionDAG.
66e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  BumpPtrAllocator Allocator;
67e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
68d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  /// VerifyNode - Sanity check the given node.  Aborts if it is invalid.
69d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands  void VerifyNode(SDNode *N);
70d038e04188047eca4749d025ef1f05f7ae660bcaDuncan Sands
71cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
72ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  SelectionDAG(TargetLowering &tli, MachineFunction &mf,
730e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman               FunctionLoweringInfo &fli, MachineModuleInfo *mmi,
740e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman               alist<SDNode, LargestSDNode> &NodePool)
750e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  : TLI(tli), MF(mf), FLI(fli), MMI(mmi), AllNodes(NodePool) {
76c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    EntryNode = Root = getNode(ISD::EntryToken, MVT::Other);
77c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  }
78cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
79cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
80c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &getMachineFunction() const { return MF; }
81063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
82063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
83ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner  FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
8444c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
85cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
86ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
871080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
88462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph(const std::string &Title);
89462dc7f4960e5074ddf4769ec8b2ef1ba7a4d2c8Dan Gohman  void viewGraph() { return viewGraph(""); }
90ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
91ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#ifndef NDEBUG
92ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  std::map<const SDNode *, std::string> NodeGraphAttrs;
93ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey#endif
941080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
95ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// clearGraphAttrs - Clear all previously defined node graph attributes.
96ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Intended to be used from a debugging tool (eg. gdb).
97ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void clearGraphAttrs();
98ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
99ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
100ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
101ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphAttrs(const SDNode *N, const char *Attrs);
102ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
103ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
104ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// Used from getNodeAttributes.
105ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  const std::string getGraphAttrs(const SDNode *N) const;
106ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
107ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  /// setGraphColor - Convenience for setting node color attribute.
108ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  ///
109ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey  void setGraphColor(const SDNode *N, const char *Color);
1101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
1110e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  typedef alist<SDNode, LargestSDNode>::const_iterator allnodes_const_iterator;
112b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
113b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
1140e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  typedef alist<SDNode, LargestSDNode>::iterator allnodes_iterator;
115b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
116b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
1170e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  alist<SDNode, LargestSDNode>::size_type allnodes_size() const {
1180e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman    return AllNodes.size();
1190e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  }
120b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
121c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
122cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
123475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getRoot() const { return Root; }
124cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
125c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
126c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
127475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &getEntryNode() const { return EntryNode; }
128cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
129c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
130cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
131475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  const SDValue &setRoot(SDValue N) {
132acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman    assert((!N.Val || N.getValueType() == MVT::Other) &&
133acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman           "DAG root value is not a chain!");
134acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman    return Root = N;
135acaf09dbe4a6781163857db1321bbd5795e7d410Dan Gohman  }
136cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1371d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
1381d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// certain types of nodes together, or eliminating superfluous nodes.  When
1391d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// the AfterLegalize argument is set to 'true', Combine takes care not to
1401d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// generate any nodes that will be illegal on the target.
141c7c3f110eda0ff8040e4bd99e38d3112b910810fJim Laskey  void Combine(bool AfterLegalize, AliasAnalysis &AA);
1421d4d41411190dd9e62764e56713753d4155764ddNate Begeman
14301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
14401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// only uses types natively supported by the target.
14501d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  ///
14601d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
14701d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  /// the graph.
14801d029b82cb08367d81aa10cdc94d05360466649Chris Lattner  void LegalizeTypes();
14901d029b82cb08367d81aa10cdc94d05360466649Chris Lattner
150c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
151c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
152c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
153cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
154c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
155c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
156063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  void Legalize();
157c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
158d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
159190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  /// SelectionDAG.
160190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner  void RemoveDeadNodes();
161130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
162130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// DeleteNode - Remove the specified node from the system.  This node must
163130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  /// have no referrers.
164130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng  void DeleteNode(SDNode *N);
165130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
16670046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getVTList - Return an SDVTList that represents the list of values
16770046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// specified.
16883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT);
16983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2);
17083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
17183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
17270046e920fa37989a041af663ada2b2b646e258fChris Lattner
17370046e920fa37989a041af663ada2b2b646e258fChris Lattner  /// getNodeValueTypes - These are obsolete, use getVTList instead.
17483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT) {
17570046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT).VTs;
17670046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
17783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2) {
17870046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2).VTs;
17970046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
18083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) {
18170046e920fa37989a041af663ada2b2b646e258fChris Lattner    return getVTList(VT1, VT2, VT3).VTs;
18270046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
183f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) {
18413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling    return getVTList(&vtList[0], (unsigned)vtList.size()).VTs;
18570046e920fa37989a041af663ada2b2b646e258fChris Lattner  }
18670046e920fa37989a041af663ada2b2b646e258fChris Lattner
18770046e920fa37989a041af663ada2b2b646e258fChris Lattner
1881b1a49714ef26225a42199cf2930529f31868322Chris Lattner  //===--------------------------------------------------------------------===//
18970046e920fa37989a041af663ada2b2b646e258fChris Lattner  // Node creation methods.
19070046e920fa37989a041af663ada2b2b646e258fChris Lattner  //
191475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
192475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
193475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
194475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(uint64_t Val, MVT VT) {
195cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getConstant(Val, VT, true);
196cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
197475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstant(const APInt &Val, MVT VT) {
1986394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman    return getConstant(Val, VT, true);
1996394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman  }
200475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
201475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
202475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(double Val, MVT VT) {
203c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantFP(Val, VT, true);
204c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
205475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
206f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    return getConstantFP(Val, VT, true);
207f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen  }
208475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
209cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner                             int offset = 0, bool isTargetGA = false);
210475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
211cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner                                   int offset = 0) {
212cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    return getGlobalAddress(GV, VT, offset, true);
213cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner  }
214475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
215475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetFrameIndex(int FI, MVT VT) {
216c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getFrameIndex(FI, VT, true);
217c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
218475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false);
219475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetJumpTable(int JTI, MVT VT) {
220c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getJumpTable(JTI, VT, true);
221c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
222475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(Constant *C, MVT VT,
223c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                            unsigned Align = 0, int Offs = 0, bool isT=false);
224475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(Constant *C, MVT VT,
225c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                                  unsigned Align = 0, int Offset = 0) {
226c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    return getConstantPool(C, VT, Align, Offset, true);
227c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner  }
228475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
229d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                            unsigned Align = 0, int Offs = 0, bool isT=false);
230475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetConstantPool(MachineConstantPoolValue *C,
23183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                                  MVT VT, unsigned Align = 0,
232d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                                  int Offset = 0) {
233d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return getConstantPool(C, VT, Align, Offset, true);
234d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  }
235475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getBasicBlock(MachineBasicBlock *MBB);
236475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getExternalSymbol(const char *Sym, MVT VT);
237475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
238475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getArgFlags(ISD::ArgFlagsTy Flags);
239475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getValueType(MVT);
240475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getRegister(unsigned Reg, MVT VT);
241475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
2427f460203b0c5350e9b2c592f438e40f7a7de6e45Dan Gohman                            const CompileUnitDesc *CU);
243475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
244c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
245475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
246d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyToReg, MVT::Other, Chain,
247d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner                   getRegister(Reg, N.getValueType()), N);
248cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
249cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
250e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
251e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
252e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
253475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N,
254475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
25583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
256475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
2572fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.Val ? 4 : 3);
258e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
25966a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
260475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  // Similar to last getCopyToReg() except parameter Reg is a SDValue
261475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyToReg(SDValue Chain, SDValue Reg, SDValue N,
262475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                         SDValue Flag) {
26383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
264475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, Reg, N, Flag };
2652fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.Val ? 4 : 3);
26666a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  }
267e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
268475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT) {
26983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
270475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT) };
2712fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyFromReg, VTs, 2, Ops, 2);
27218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  }
273e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
274e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
275e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
276e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
277475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT,
278475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Flag) {
27983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
280475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
2812fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CopyFromReg, VTs, 3, Ops, Flag.Val ? 3 : 2);
282e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
28318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
284475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCondCode(ISD::CondCode Cond);
285cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2861ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
2871ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
288475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
2896a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner
2906a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
2916a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// a flag result (to ensure it's not CSE'd).
292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
29383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
294475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { Chain,  Op };
2952fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::CALLSEQ_START, VTs, 2, Ops, 2);
2966a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
2971ccae666f596d5aeca5c9942995763600b622062Chris Lattner
2980f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
2990f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  /// flag result (to ensure it's not CSE'd).
300475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
301475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue InFlag) {
3020f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
303475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SmallVector<SDValue, 4> Ops;
3040f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Chain);
3050f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op1);
3060f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(Op2);
3070f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    Ops.push_back(InFlag);
3080f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    return getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0],
30934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng                   (unsigned)Ops.size() - (InFlag.Val == 0 ? 1 : 0));
3100f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling  }
3110f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
312c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
313cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
314475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT);
315475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
316475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT, SDValue N1, SDValue N2);
317475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
318475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3);
319475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
320475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4);
321475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
322475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4,
323475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N5);
324475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
325475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
326475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, MVT VT,
3276d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman                    const SDUse *Ops, unsigned NumOps);
328475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
329475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
330475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, const MVT *VTs, unsigned NumVTs,
331475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
332475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs);
333475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N);
334475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N1, SDValue N2);
335475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
336475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3);
337475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
338475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4);
339475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
340475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N1, SDValue N2, SDValue N3, SDValue N4,
341475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue N5);
342475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getNode(unsigned Opcode, SDVTList VTs,
343475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    const SDValue *Ops, unsigned NumOps);
344475871a144eb604ddaf37503397ba0941442e5fbDan Gohman
345475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemcpy(SDValue Chain, SDValue Dst, SDValue Src,
346475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Size, unsigned Align,
347707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman                      bool AlwaysInline,
3481f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman                      const Value *DstSV, uint64_t DstSVOff,
3491f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman                      const Value *SrcSV, uint64_t SrcSVOff);
3505c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
351475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemmove(SDValue Chain, SDValue Dst, SDValue Src,
352475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Size, unsigned Align,
3531f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman                       const Value *DstSV, uint64_t DstOSVff,
3541f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman                       const Value *SrcSV, uint64_t SrcSVOff);
3555c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
356475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemset(SDValue Chain, SDValue Dst, SDValue Src,
357475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Size, unsigned Align,
3581f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman                      const Value *DstSV, uint64_t DstSVOff);
3595c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
3607cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
361475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// have an ISD::CondCode instead of an SDValue.
3627cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
363475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS,
3647cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner                     ISD::CondCode Cond) {
3657cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond));
366b43e9c196542acc80c9e4643809661065710848fNate Begeman  }
367b43e9c196542acc80c9e4643809661065710848fNate Begeman
368b43e9c196542acc80c9e4643809661065710848fNate Begeman  /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
369475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// if you just have an ISD::CondCode instead of an SDValue.
370b43e9c196542acc80c9e4643809661065710848fNate Begeman  ///
371475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS,
372b43e9c196542acc80c9e4643809661065710848fNate Begeman                      ISD::CondCode Cond) {
373b43e9c196542acc80c9e4643809661065710848fNate Begeman    return getNode(ISD::VSETCC, VT, LHS, RHS, getCondCode(Cond));
3747cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
3759373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
3769373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
377475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// just have an ISD::CondCode instead of an SDValue.
3789373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
379475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSelectCC(SDValue LHS, SDValue RHS,
380475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue True, SDValue False, ISD::CondCode Cond) {
3812fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    return getNode(ISD::SELECT_CC, True.getValueType(), LHS, RHS, True, False,
3822fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner                   getCondCode(Cond));
3839373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
3847cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
385acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
386acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
387475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getVAArg(MVT VT, SDValue Chain, SDValue Ptr,
388475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                     SDValue SV);
3897cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
390ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth  /// getAtomic - Gets a node for an atomic op, produces result and chain, takes
39128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// 3 operands
392475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getAtomic(unsigned Opcode, SDValue Chain, SDValue Ptr,
393475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Cmp, SDValue Swp, const Value* PtrVal,
39428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang                      unsigned Alignment=0);
395ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
396ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth  /// getAtomic - Gets a node for an atomic op, produces result and chain, takes
39728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  /// 2 operands
398475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getAtomic(unsigned Opcode, SDValue Chain, SDValue Ptr,
399475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Val, const Value* PtrVal,
40028873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang                      unsigned Alignment = 0);
401ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth
4024bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given operands.
4034bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// Allowed to return something different (and simpler) if Simplify is true.
404475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMergeValues(const SDValue *Ops, unsigned NumOps,
4054bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands                           bool Simplify = true);
4064bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands
407f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands  /// getMergeValues - Create a MERGE_VALUES node from the given types and ops.
408f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands  /// Allowed to return something different (and simpler) if Simplify is true.
4094bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands  /// May be faster than the above version if VTs is known and NumOps is large.
410475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMergeValues(SDVTList VTs, const SDValue *Ops, unsigned NumOps,
411f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands                           bool Simplify = true) {
412f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands    if (Simplify && NumOps == 1)
413f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands      return Ops[0];
414f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands    return getNode(ISD::MERGE_VALUES, VTs, Ops, NumOps);
415f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands  }
416f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
417c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
418c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
419cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
420475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(MVT VT, SDValue Chain, SDValue Ptr,
42195c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    const Value *SV, int SVOffset, bool isVolatile=false,
42295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                    unsigned Alignment=0);
423475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getExtLoad(ISD::LoadExtType ExtType, MVT VT,
424475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Chain, SDValue Ptr, const Value *SV,
42583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       int SVOffset, MVT EVT, bool isVolatile=false,
42695c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                       unsigned Alignment=0);
427475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedLoad(SDValue OrigLoad, SDValue Base,
428475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
429475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
430475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    MVT VT, SDValue Chain,
431475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                    SDValue Ptr, SDValue Offset,
43283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                    const Value *SV, int SVOffset, MVT EVT,
433e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands                    bool isVolatile=false, unsigned Alignment=0);
4342d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
435ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  /// getStore - Helper function to build ISD::STORE nodes.
436ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng  ///
437475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getStore(SDValue Chain, SDValue Val, SDValue Ptr,
43895c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     const Value *SV, int SVOffset, bool isVolatile=false,
43995c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                     unsigned Alignment=0);
440475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getTruncStore(SDValue Chain, SDValue Val, SDValue Ptr,
44183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                          const Value *SV, int SVOffset, MVT TVT,
44295c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb                          bool isVolatile=false, unsigned Alignment=0);
443475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
444475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                           SDValue Offset, ISD::MemIndexedMode AM);
445ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
44669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // getSrcValue - Construct a node to track a Value* through the backend.
447475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getSrcValue(const Value *v);
44869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
44969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // getMemOperand - Construct a node to track a memory reference
45069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  // through the backend.
451475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getMemOperand(const MachineMemOperand &MO);
452cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
453b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
454b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
455b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
456b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
457b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
458b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
459475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op);
460475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
461475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
462475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3);
463475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
464475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4);
465475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
466475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               SDValue Op3, SDValue Op4, SDValue Op5);
467475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue UpdateNodeOperands(SDValue N,
468475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                               const SDValue *Ops, unsigned NumOps);
4691b95095857b78e12138c22e76c7936611c51355bChris Lattner
4701b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
4711b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
4721b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
473e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ~TargetOpcode in the node opcode field.  The resultant node is returned.
47483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
475475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
47683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
477475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2);
47883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
479475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       SDValue Op1, SDValue Op2, SDValue Op3);
48083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
481475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
482cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
483cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
484475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, const SDValue *Ops, unsigned NumOps);
485cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
486475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
487cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
488475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1);
48983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
490475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2);
49183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
492475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
493cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman  SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
494475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                       const SDValue *Ops, unsigned NumOps);
495694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng
496e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// MorphNodeTo - These *mutate* the specified node to have the specified
497e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// return type, opcode, and operands.
498e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
499475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
500e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
501475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2);
502e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
503475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue Op1, SDValue Op2, SDValue Op3);
504e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
505475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
506e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
507e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
508475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, const SDValue *Ops, unsigned NumOps);
509e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
510475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
511e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
512475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1);
513e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
514475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2);
515e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
516475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
517e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
518475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      const SDValue *Ops, unsigned NumOps);
519753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
5206ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// getTargetNode - These are used for target selectors to create a new node
5216ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// with specified return type(s), target opcode, and operands.
5226ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
5236ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// Note that getTargetNode returns the resultant node.  If there is already a
5246ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// node of the specified opcode and operands, it returns that node instead of
5256ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// the current one.
52683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT);
527475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1);
528475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1, SDValue Op2);
52983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
530475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
53183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT,
532475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
53383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2);
534475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, SDValue Op1);
53583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
536475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2);
53783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1,
538475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
53983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2,
540475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
54183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
542475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2);
54383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
544475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        SDValue Op1, SDValue Op2, SDValue Op3);
54583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
546475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
54783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3, MVT VT4,
548475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
549f877b735ad4987f26cafcbaf22aa4c2199458b5dDan Gohman  SDNode *getTargetNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
550475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                        const SDValue *Ops, unsigned NumOps);
55108b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng
55208b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// getNodeIfExists - Get the specified node if it's already available, or
55308b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  /// else return NULL.
55408b1173971a51eb89d7d6ee0992c39170c86994aEvan Cheng  SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
555475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                          const SDValue *Ops, unsigned NumOps);
5566542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
557f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// DAGUpdateListener - Clients of various APIs that cause global effects on
558f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// the DAG can optionally implement this interface.  This allows the clients
559f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// to handle the various sorts of updates that happen.
560f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  class DAGUpdateListener {
561f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  public:
562f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual ~DAGUpdateListener();
563edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
564edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeDeleted - The node N that was deleted and, if E is not null, an
565edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// equivalent node E that replaced it.
566edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
567edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands
568edfcf598faab9ce294712551ecf67093acd1c66eDuncan Sands    /// NodeUpdated - The node N that was updated.
569f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner    virtual void NodeUpdated(SDNode *N) = 0;
570f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  };
571f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
572f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// RemoveDeadNode - Remove the specified node from the system. If any of its
573f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// operands then becomes dead, remove them as well. Inform UpdateListener
574f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// for each node deleted.
575f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
576f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner
5770fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// RemoveDeadNodes - This method deletes the unreachable nodes in the
5780fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  /// given list, and any nodes that become unreachable as a result.
5790fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman  void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
5800fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman                       DAGUpdateListener *UpdateListener = 0);
5810fe9c6e7babb3c0731d9cb864ec498ec4184760fDan Gohman
5826542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
58326005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
58426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
58526005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// if you have two nodes with identical results, use the third otherwise.
5866542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
587f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// These methods all take an optional UpdateListener, which (if not null) is
588f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// informed about nodes that are deleted and modified due to recursive
589f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// changes in the dag.
590fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
591475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDValue From, SDValue Op,
592f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
593fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
594f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
595475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
596f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                          DAGUpdateListener *UpdateListener = 0);
597fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
59880274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
599f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner  /// uses of other values produced by From.Val alone.
600475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
601f8dc0617baceeba8ccd67c8881eb88eb1be2902cChris Lattner                                 DAGUpdateListener *UpdateListener = 0);
60280274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
603e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
604e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// for multiple values at once. This correctly handles the case where
605e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  /// there is an overlap between the From values and the To values.
606475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
607e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  unsigned Num,
608e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman                                  DAGUpdateListener *UpdateListener = 0);
609e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman
610e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng  /// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
61109fd736058ec3f69b856ae3ad65177bc31904a8cEvan Cheng  /// based on their topological order. It returns the maximum id and a vector
61209fd736058ec3f69b856ae3ad65177bc31904a8cEvan Cheng  /// of the SDNodes* in assigned order by reference.
61309fd736058ec3f69b856ae3ad65177bc31904a8cEvan Cheng  unsigned AssignTopologicalOrder(std::vector<SDNode*> &TopOrder);
614e6f35d8a5cc92d776cf460200e2b815e8c301b14Evan Cheng
6151efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
6161efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  /// operation.
6171efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  static bool isCommutativeBinOp(unsigned Opcode) {
6184ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // FIXME: This should get its info from the td file, so that we can include
6194ae9e0c5301126d7f2d4b2975eb86ed21f7b574dChris Lattner    // target info.
6201efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    switch (Opcode) {
6211efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADD:
6221efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MUL:
6231efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHU:
6241efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::MULHS:
625b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::SMUL_LOHI:
626b6c7437568f0472548ede2710458f52cfad4532eDan Gohman    case ISD::UMUL_LOHI:
6271efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FADD:
6281efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::FMUL:
6291efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::AND:
6301efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::OR:
6311efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::XOR:
6321efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDC:
6331efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    case ISD::ADDE: return true;
6341efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    default: return false;
6351efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng    }
6361efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng  }
6371efba0ecb4d0b3807c48e6e0f74e3ce5c9fad809Evan Cheng
638cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
639d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
64037ce9df0da6cddc3b8bfef9b63d33d058a0f2f15Chris Lattner  /// CreateStackTemporary - Create a stack temporary, suitable for holding the
641364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// specified value type.  If minAlign is specified, the slot size will have
642364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang  /// at least that alignment.
643475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
644364d73ddab43b699ab90240f11b7a2eb5cf69bd8Mon P Wang
64551dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner  /// FoldSetCC - Constant fold a setcc to true or false.
646475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue FoldSetCC(MVT VT, SDValue N1,
647475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                      SDValue N2, ISD::CondCode Cond);
64851dabfb28375be7bc5848806ae31cd068b6133f8Chris Lattner
6492e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// SignBitIsZero - Return true if the sign bit of Op is known to be zero.  We
6502e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman  /// use this predicate to simplify operations downstream.
651475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
6522e68b6f52d0979575b2f02ed29717d907ba0684cDan Gohman
653ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero.  We
654ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// use this predicate to simplify operations downstream.  Op and Mask are
655ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be the same type.
656475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
657ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman    const;
658ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
659ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeMaskedBits - Determine which of the bits specified in Mask are
660ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// known to be either zero or one and return them in the KnownZero/KnownOne
661ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// bitsets.  This code only analyzes bits in Mask, in order to short-circuit
662ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// processing.  Targets can implement the computeMaskedBitsForTargetNode
663ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// method in the TargetLowering class to allow target nodes to be understood.
664475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
665fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                         APInt &KnownOne, unsigned Depth = 0) const;
666fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman
667ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// ComputeNumSignBits - Return the number of times the sign bit of the
668ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// register is replicated into the other bits.  We know that at least 1 bit
669ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// is always equal to the sign bit (itself), but other cases can give us
670ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// information.  For example, immediately after an "SRA X, 2", we know that
671ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// the top 3 bits are all equal to each other, so we return 3.  Targets can
672ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
673ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman  /// class to allow target nodes to be understood.
674475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
675a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng
676475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
677a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng  /// been verified as a debug information descriptor.
678475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  bool isVerifiedDebugInfoDesc(SDValue Op) const;
67977f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng
68077f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// getShuffleScalarElt - Returns the scalar element that will make up the ith
68177f0b7a50a08614b5ffd58f1864b68a9a30d0cb0Evan Cheng  /// element of the result of the vector shuffle.
682475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
683ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman
684d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
6850e5f1306b059b62d7725f324e087efbc8e7a782dDan Gohman  inline alist_traits<SDNode, LargestSDNode>::AllocatorType &getAllocator();
6861b95095857b78e12138c22e76c7936611c51355bChris Lattner  void RemoveNodeFromCSEMaps(SDNode *N);
6876542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
688475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
689475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
690a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
691475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
692a5682853b9921bbb0dd2ee175c9bd44142d4819eChris Lattner                               void *&InsertPos);
693b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
694fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
6959c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman
6969c6e70eca9a49c146b26621cbcbb9464ceeac024Dan Gohman  unsigned getMVTAlignment(MVT MemoryVT) const;
6977cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
698109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  // List of non-single value types.
699e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  std::vector<SDVTList> VTList;
700109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
7011cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  // Maps to auto-CSE operations.
7027cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
7031cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
70415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
7058e4eb09b1e3571965f49edcdfb56b1375b1b7551Duncan Sands  std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
7064b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman  StringMap<SDNode*> ExternalSymbols;
7074b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohman  StringMap<SDNode*> TargetExternalSymbols;
708cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
709cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
7101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
7111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
7121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
7131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
7141080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
7151080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
7161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
7171080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
7181080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
7191080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
720b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
721cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
722cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
723