SelectionDAG.h revision 322812e603705e1c2037313633e72f689524b163
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under
66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source 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
18c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "llvm/CodeGen/SelectionDAGNodes.h"
19b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner#include "llvm/ADT/ilist"
20b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
21109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner#include <list>
22322812e603705e1c2037313633e72f689524b163Evan Cheng#include <map>
23322812e603705e1c2037313633e72f689524b163Evan Cheng#include <set>
24eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
27c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetLowering;
28c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetMachine;
29b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  class MachineDebugInfo;
30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class MachineFunction;
31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
32c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
34c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
35c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
38c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
41c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
42cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
43cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
44063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
45c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &MF;
46b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  MachineDebugInfo *DI;
47cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
48c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  // Root - The root of the entire DAG.  EntryNode - The starting token.
49c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand Root, EntryNode;
50cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
51b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  // AllNodes - A linked list of nodes in the current DAG.
52b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  ilist<SDNode> AllNodes;
53691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
54691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  // ValueNodes - track SrcValue nodes
55691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  std::map<std::pair<const Value*, int>, SDNode*> ValueNodes;
56691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
57cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
58b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  SelectionDAG(TargetLowering &tli, MachineFunction &mf, MachineDebugInfo *di)
59b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  : TLI(tli), MF(mf), DI(di) {
60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    EntryNode = Root = getNode(ISD::EntryToken, MVT::Other);
61c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  }
62cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
63cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
64c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &getMachineFunction() const { return MF; }
65063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
66063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
67b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  MachineDebugInfo *getMachineDebugInfo() const { return DI; }
68cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
691080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
701080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
711080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  void viewGraph();
721080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
731080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
74b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
75b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
76b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
77b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  typedef ilist<SDNode>::iterator allnodes_iterator;
78b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
79b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
80b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
81c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
82cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
83c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &getRoot() const { return Root; }
84cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
85c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
86c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
87c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &getEntryNode() const { return EntryNode; }
88cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
89c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
90cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
91c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &setRoot(SDOperand N) { return Root = N; }
92cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
931d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
941d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// certain types of nodes together, or eliminating superfluous nodes.  When
951d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// the AfterLegalize argument is set to 'true', Combine takes care not to
961d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// generate any nodes that will be illegal on the target.
971d4d41411190dd9e62764e56713753d4155764ddNate Begeman  void Combine(bool AfterLegalize);
981d4d41411190dd9e62764e56713753d4155764ddNate Begeman
99c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
100c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
101c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
102cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
103c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
104c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
105063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  void Legalize();
106c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
107d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
108d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// SelectionDAG, including nodes (like loads) that have uses of their token
109d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// chain but no other uses and no side effect.  If a node is passed in as an
110d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// argument, it is used as the seed for node deletion.
111d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  void RemoveDeadNodes(SDNode *N = 0);
112d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
11347725d059b259f8a0c145478300c9e9caa006b59Chris Lattner  SDOperand getString(const std::string &Val);
114c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getConstant(uint64_t Val, MVT::ValueType VT);
115056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
116c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getConstantFP(double Val, MVT::ValueType VT);
117ac0d7238258defe72b1aad53d7f48201b91df795Chris Lattner  SDOperand getTargetConstantFP(double Val, MVT::ValueType VT);
11814229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
11914229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng                             int offset = 0);
12061ca74bc3a29b2af2be7e4bd612289da8aae85b5Evan Cheng  SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
12114229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng                                   int offset = 0);
122c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getFrameIndex(int FI, MVT::ValueType VT);
123afb2dd43de61f4585e75d1f3ab93a9ac4b3b7592Chris Lattner  SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
12437efe6764568a3829fee26aba532283131d1a104Nate Begeman  SDOperand getJumpTable(int JTI, MVT::ValueType VT);
12537efe6764568a3829fee26aba532283131d1a104Nate Begeman  SDOperand getTargetJumpTable(int JTI, MVT::ValueType VT);
126b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  SDOperand getConstantPool(Constant *C, MVT::ValueType VT,
127404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                           unsigned Alignment=0,  int offset = 0);
128b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT,
129404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                                  unsigned Alignment=0, int offset = 0);
130c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getBasicBlock(MachineBasicBlock *MBB);
131c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
1322a2de66db2093a5bc1fd620d1b6ae7992a552b24Andrew Lenharth  SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
13315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  SDOperand getValueType(MVT::ValueType);
134d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getRegister(unsigned Reg, MVT::ValueType VT);
135c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
136d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N) {
137d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyToReg, MVT::Other, Chain,
138d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner                   getRegister(Reg, N.getValueType()), N);
139cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
140cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
141e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
142e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
143e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
144e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N,
145e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner                         SDOperand Flag) {
146e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<MVT::ValueType> VTs;
147e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    VTs.push_back(MVT::Other);
148e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    VTs.push_back(MVT::Flag);
149e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<SDOperand> Ops;
150e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(Chain);
151e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(getRegister(Reg, N.getValueType()));
152e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(N);
153e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    if (Flag.Val) Ops.push_back(Flag);
154e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    return getNode(ISD::CopyToReg, VTs, Ops);
155e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
15666a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng
15766a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  // Similar to last getCopyToReg() except parameter Reg is a SDOperand
15866a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  SDOperand getCopyToReg(SDOperand Chain, SDOperand Reg, SDOperand N,
15966a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng                         SDOperand Flag) {
16066a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    std::vector<MVT::ValueType> VTs;
16166a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    VTs.push_back(MVT::Other);
16266a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    VTs.push_back(MVT::Flag);
16366a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    std::vector<SDOperand> Ops;
16466a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    Ops.push_back(Chain);
16566a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    Ops.push_back(Reg);
16666a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    Ops.push_back(N);
16766a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    if (Flag.Val) Ops.push_back(Flag);
16866a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    return getNode(ISD::CopyToReg, VTs, Ops);
16966a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng  }
170e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
171d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT) {
172d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    std::vector<MVT::ValueType> ResultTys;
173d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    ResultTys.push_back(VT);
174d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    ResultTys.push_back(MVT::Other);
175d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    std::vector<SDOperand> Ops;
176d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    Ops.push_back(Chain);
177d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    Ops.push_back(getRegister(Reg, VT));
178d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyFromReg, ResultTys, Ops);
17918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  }
180e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
181e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
182e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
183e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
184e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT,
185e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner                           SDOperand Flag) {
186e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<MVT::ValueType> ResultTys;
187e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(VT);
188e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(MVT::Other);
189e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(MVT::Flag);
190e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<SDOperand> Ops;
191e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(Chain);
192e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(getRegister(Reg, VT));
193e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    if (Flag.Val) Ops.push_back(Flag);
194e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    return getNode(ISD::CopyFromReg, ResultTys, Ops);
195e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
19618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
1977cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  SDOperand getCondCode(ISD::CondCode Cond);
198cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
1991ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
2001ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
2011ccae666f596d5aeca5c9942995763600b622062Chris Lattner  SDOperand getZeroExtendInReg(SDOperand Op, MVT::ValueType SrcTy);
2026a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner
2036a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
2046a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  /// a flag result (to ensure it's not CSE'd).
2056a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  SDOperand getCALLSEQ_START(SDOperand Chain, SDOperand Op) {
2066a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    std::vector<MVT::ValueType> ResultTys;
2076a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    ResultTys.push_back(MVT::Other);
2086a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    ResultTys.push_back(MVT::Flag);
2096a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    std::vector<SDOperand> Ops;
2106a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    Ops.push_back(Chain);
2116a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    Ops.push_back(Op);
2126a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    return getNode(ISD::CALLSEQ_START, ResultTys, Ops);
2136a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner  }
2141ccae666f596d5aeca5c9942995763600b622062Chris Lattner
215c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
216cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
217c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT);
218c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT, SDOperand N);
219c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
220c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    SDOperand N1, SDOperand N2);
221c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
222c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    SDOperand N1, SDOperand N2, SDOperand N3);
223c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
2242d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4);
2252d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
226f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
227f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner                    SDOperand N5);
228f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
229c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    std::vector<SDOperand> &Children);
2304211e73c4905af413db7524f24414c16a7f69102Chris Lattner  SDOperand getNode(unsigned Opcode, std::vector<MVT::ValueType> &ResultTys,
2314211e73c4905af413db7524f24414c16a7f69102Chris Lattner                    std::vector<SDOperand> &Ops);
232c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
2337cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
2347cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// have an ISD::CondCode instead of an SDOperand.
2357cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
2367cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  SDOperand getSetCC(MVT::ValueType VT, SDOperand LHS, SDOperand RHS,
2377cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner                     ISD::CondCode Cond) {
2387cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond));
2397cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
2409373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
2419373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
2429373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// just have an ISD::CondCode instead of an SDOperand.
2439373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
2449373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  SDOperand getSelectCC(SDOperand LHS, SDOperand RHS,
2459373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman                        SDOperand True, SDOperand False, ISD::CondCode Cond) {
2469373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman    MVT::ValueType VT = True.getValueType();
2479373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman    return getNode(ISD::SELECT_CC, VT, LHS, RHS, True, False,getCondCode(Cond));
2489373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
2497cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
250acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
251acc398c195a697795bff3245943d104eb19192b9Nate Begeman  /// and a source value as input.
252acc398c195a697795bff3245943d104eb19192b9Nate Begeman  SDOperand getVAArg(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
253acc398c195a697795bff3245943d104eb19192b9Nate Begeman                     SDOperand SV);
2547cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
255c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
256c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
257cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
25821074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner  SDOperand getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
25921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner                    SDOperand SV);
2605fbb5d2459a5410590f285250faa604576308a93Nate Begeman  SDOperand getVecLoad(unsigned Count, MVT::ValueType VT, SDOperand Chain,
2615fbb5d2459a5410590f285250faa604576308a93Nate Begeman                       SDOperand Ptr, SDOperand SV);
2625f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner  SDOperand getExtLoad(unsigned Opcode, MVT::ValueType VT, SDOperand Chain,
2635f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                       SDOperand Ptr, SDOperand SV, MVT::ValueType EVT);
2642d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
2652d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  // getSrcValue - construct a node to track a Value* through the backend
266691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  SDOperand getSrcValue(const Value* I, int offset = 0);
267cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
268b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
269b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// specified operands.  If the resultant node already exists in the DAG,
270b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// this does not modify the specified node, instead it returns the node that
271b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// already exists.  If the resultant node does not exist in the DAG, the
272b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input node is returned.  As a degenerate case, if you specify the same
273b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  /// input operands as the node already has, the input node is returned.
274b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op);
275b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2);
276b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
277b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner                               SDOperand Op3);
278b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
279b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner                               SDOperand Op3, SDOperand Op4);
2809b88361befd2a94202dc60ccfb3e31756916a9caChris Lattner  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
2819b88361befd2a94202dc60ccfb3e31756916a9caChris Lattner                               SDOperand Op3, SDOperand Op4, SDOperand Op5);
282b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDOperand UpdateNodeOperands(SDOperand N, const std::vector<SDOperand> &Op);
2831b95095857b78e12138c22e76c7936611c51355bChris Lattner
2841b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
2851b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
2861b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
287eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.  The 0th value
288eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  /// of the resultant node is returned.
289eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT);
290eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
291eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1);
292eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
293eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2);
294eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
295eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3);
296eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
297eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
298eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4);
299eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
300eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
301eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4, SDOperand Op5);
302eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
303eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
304eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4, SDOperand Op5, SDOperand Op6);
3058c6f1ee5aa376118f1cb7b16b62994fc255eac56Andrew Lenharth  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
3068c6f1ee5aa376118f1cb7b16b62994fc255eac56Andrew Lenharth                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
3078c6f1ee5aa376118f1cb7b16b62994fc255eac56Andrew Lenharth                         SDOperand Op4, SDOperand Op5, SDOperand Op6,
3088c6f1ee5aa376118f1cb7b16b62994fc255eac56Andrew Lenharth			 SDOperand Op7);
3097cf11b4ab248d6ab7fb0d9df0b72baf158201abeAndrew Lenharth  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
3107cf11b4ab248d6ab7fb0d9df0b72baf158201abeAndrew Lenharth                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
3117cf11b4ab248d6ab7fb0d9df0b72baf158201abeAndrew Lenharth                         SDOperand Op4, SDOperand Op5, SDOperand Op6,
3127cf11b4ab248d6ab7fb0d9df0b72baf158201abeAndrew Lenharth			 SDOperand Op7, SDOperand Op8);
313eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
314eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
315eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
316eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
317eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3);
318eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
319eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
320eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3, SDOperand Op4);
321eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
322eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
323eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3, SDOperand Op4, SDOperand Op5);
324753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
3256ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// getTargetNode - These are used for target selectors to create a new node
3266ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// with specified return type(s), target opcode, and operands.
3276ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  ///
3286ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// Note that getTargetNode returns the resultant node.  If there is already a
3296ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// node of the specified opcode and operands, it returns that node instead of
3306ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  /// the current one.
3316ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT);
3326ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3336ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1);
3346ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3356ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2);
3366ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3376ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3);
3386ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3396ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
3406ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op4);
3416ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3426ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
3436ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op4, SDOperand Op5);
3446ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3456ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
3466ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op4, SDOperand Op5, SDOperand Op6);
3476ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3486ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
3496ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op4, SDOperand Op5, SDOperand Op6,
3506ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op7);
3516ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3526ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
3536ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op4, SDOperand Op5, SDOperand Op6,
3546ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op7, SDOperand Op8);
3556ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
3566ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        std::vector<SDOperand> &Ops);
3576ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3586ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1);
3596ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3606ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
3616ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3626ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
3636ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3);
3646ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3656ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
3666ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4);
3676ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3686ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
3696ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5);
3706ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3716ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
3726ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
3736ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op6);
3746ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3756ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
3766ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
3776ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op6, SDOperand Op7);
3786ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3796ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, MVT::ValueType VT3,
3806ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2);
3816ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3826ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, MVT::ValueType VT3,
3836ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2,
3846ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5);
3856ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3866ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, MVT::ValueType VT3,
3876ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2,
3886ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
3896ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op6);
3906ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3916ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, MVT::ValueType VT3,
3926ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op1, SDOperand Op2,
3936ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
3946ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        SDOperand Op6, SDOperand Op7);
3956ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3966ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng                        MVT::ValueType VT2, std::vector<SDOperand> &Ops);
3976542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
3986542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
39926005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
40026005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
40126005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// if you have two nodes with identical results, use the third otherwise.
4026542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
403fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// These methods all take an optional vector, which (if not null) is
404fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// populated with any nodes that are deleted from the SelectionDAG, due to
405fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// new equivalences that are discovered.
406fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
407fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDOperand From, SDOperand Op,
408fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
409fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
410fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
411fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, const std::vector<SDOperand> &To,
412fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
413fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
41480274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
41580274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// uses of other values produced by From.Val alone.  The Deleted vector is
41680274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// handled the same was as for ReplaceAllUsesWith, but it is required for
41780274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  /// this method.
41880274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner  void ReplaceAllUsesOfValueWith(SDOperand From, SDOperand To,
41980274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner                                 std::vector<SDNode*> &Deleted);
42080274268b99e5a066825c8cc5aba58dbc5ad0a52Chris Lattner
421ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  /// DeleteNode - Remove the specified node from the system.  This node must
422ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  /// have no referrers.
423ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  void DeleteNode(SDNode *N);
424ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner
425cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
426d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
427fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng  /// InsertISelMapEntry - A helper function to insert a key / element pair
428fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng  /// into a SDOperand to SDOperand map. This is added to avoid the map
429fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng  /// insertion operator from being inlined.
430fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng  static void InsertISelMapEntry(std::map<SDOperand, SDOperand> &Map,
431fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng                                 SDNode *Key, unsigned KeyResNo,
432fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng                                 SDNode *Element, unsigned ElementResNo);
433322812e603705e1c2037313633e72f689524b163Evan Cheng
434322812e603705e1c2037313633e72f689524b163Evan Cheng  /// InsertInFlightSetEntry - A helper function to insert a SDNode* to a
435322812e603705e1c2037313633e72f689524b163Evan Cheng  /// SDNode* set. This is added to avoid the set insertion operator from being
436322812e603705e1c2037313633e72f689524b163Evan Cheng  /// inlined.
437322812e603705e1c2037313633e72f689524b163Evan Cheng  static void InsertInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N);
438322812e603705e1c2037313633e72f689524b163Evan Cheng
439322812e603705e1c2037313633e72f689524b163Evan Cheng  /// RemoveInFlightSetEntry - A helper function to remove a SDNode* from a
440322812e603705e1c2037313633e72f689524b163Evan Cheng  /// SDNode* set. This is added to avoid the set removal operator from being
441322812e603705e1c2037313633e72f689524b163Evan Cheng  /// inlined.
442322812e603705e1c2037313633e72f689524b163Evan Cheng  static void RemoveInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N);
443fae9f1cb34d6d2c4dbd007f2d748a70b67776a82Evan Cheng
444d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
4451b95095857b78e12138c22e76c7936611c51355bChris Lattner  void RemoveNodeFromCSEMaps(SDNode *N);
4466542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
447b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDNode **FindModifiedNodeSlot(SDNode *N, SDOperand Op);
448b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDNode **FindModifiedNodeSlot(SDNode *N, SDOperand Op1, SDOperand Op2);
449b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner  SDNode **FindModifiedNodeSlot(SDNode *N, const std::vector<SDOperand> &Ops);
450b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
451f0e80cf909b69b5f31b8d027de6ee4b963205f66Chris Lattner  void DestroyDeadNode(SDNode *N);
452fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
453109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  void setNodeValueTypes(SDNode *N, std::vector<MVT::ValueType> &RetVals);
454109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  void setNodeValueTypes(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2);
455109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
4567cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
45732c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman  /// SimplifySetCC - Try to simplify a setcc built with the specified operands
45832c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman  /// and cc.  If unable to simplify it, return a null SDOperand.
4594cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner  SDOperand SimplifySetCC(MVT::ValueType VT, SDOperand N1,
4604cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner                          SDOperand N2, ISD::CondCode Cond);
461109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
462109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  // List of non-single value types.
463109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  std::list<std::vector<MVT::ValueType> > VTList;
464109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
4651cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  // Maps to auto-CSE operations.
466ab2eb66f07689dc1698ace2182e77395254ad83dChris Lattner  std::map<std::pair<unsigned, MVT::ValueType>, SDNode *> NullaryOps;
4671cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<unsigned, std::pair<SDOperand, MVT::ValueType> >,
4681cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> UnaryOps;
4691cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<unsigned, std::pair<SDOperand, SDOperand> >,
4701cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> BinaryOps;
4711cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
472d6a80778e5a5fab339036b2f462d3039efe28a08Chris Lattner  std::map<std::pair<unsigned, MVT::ValueType>, RegisterSDNode*> RegNodes;
4737cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
4741cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
4751cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<SDOperand, std::pair<SDOperand, MVT::ValueType> >,
4761cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> Loads;
4771cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
47814229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  std::map<std::pair<const GlobalValue*, int>, SDNode*> GlobalValues;
47914229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  std::map<std::pair<const GlobalValue*, int>, SDNode*> TargetGlobalValues;
4801cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
481056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants;
482b29cb29364d3e22f062c695d2d5740dda42d8e8eChris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
483ac0d7238258defe72b1aad53d7f48201b91df795Chris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs;
48437efe6764568a3829fee26aba532283131d1a104Nate Begeman  std::map<int, SDNode*> FrameIndices, TargetFrameIndices, JumpTableIndices,
48537efe6764568a3829fee26aba532283131d1a104Nate Begeman    TargetJumpTableIndices;
486404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng  std::map<std::pair<Constant *,
487404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                     std::pair<int, unsigned> >, SDNode*> ConstantPoolIndices;
488404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng  std::map<std::pair<Constant *,
489404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                 std::pair<int, unsigned> >, SDNode*> TargetConstantPoolIndices;
4901cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<MachineBasicBlock *, SDNode*> BBNodes;
49115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
4925f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner  std::map<std::string, SDNode*> ExternalSymbols;
4932a2de66db2093a5bc1fd620d1b6ae7992a552b24Andrew Lenharth  std::map<std::string, SDNode*> TargetExternalSymbols;
49447725d059b259f8a0c145478300c9e9caa006b59Chris Lattner  std::map<std::string, StringSDNode*> StringNodes;
4954211e73c4905af413db7524f24414c16a7f69102Chris Lattner  std::map<std::pair<unsigned,
4966765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner                     std::pair<MVT::ValueType, std::vector<SDOperand> > >,
4976765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner           SDNode*> OneResultNodes;
4986765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner  std::map<std::pair<unsigned,
4994211e73c4905af413db7524f24414c16a7f69102Chris Lattner                     std::pair<std::vector<MVT::ValueType>,
5004211e73c4905af413db7524f24414c16a7f69102Chris Lattner                               std::vector<SDOperand> > >,
5014211e73c4905af413db7524f24414c16a7f69102Chris Lattner           SDNode*> ArbitraryNodes;
502cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
503cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
5041080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
5051080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
5061080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
5071080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
5081080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
5091080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
5101080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
5111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
5121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
5131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
514b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
515cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
516cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
517