SelectionDAG.h revision eb19e40efbd3cae80c908a30cdf4d33450733c45
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
21cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include <map>
22109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner#include <list>
23eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner#include <string>
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
26c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetLowering;
27c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class TargetMachine;
28c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  class MachineFunction;
29c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// SelectionDAG class - This is used to represent a portion of an LLVM function
31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// in a low-level Data Dependence DAG representation suitable for instruction
32c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection.  This DAG is constructed as the first step of instruction
33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// selection in order to allow implementation of machine specific optimizations
34c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// and code simplifications.
35c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// The representation used by the SelectionDAG is a target-independent
37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// representation, which has some similarities to the GCC RTL representation,
38c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// but is significantly more simple, powerful, and is a graph form instead of a
39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// linear form.
40cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner///
41cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass SelectionDAG {
42063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &TLI;
43c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &MF;
44cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
45c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  // Root - The root of the entire DAG.  EntryNode - The starting token.
46c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand Root, EntryNode;
47cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
48b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  // AllNodes - A linked list of nodes in the current DAG.
49b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  ilist<SDNode> AllNodes;
50691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
51691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  // ValueNodes - track SrcValue nodes
52691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  std::map<std::pair<const Value*, int>, SDNode*> ValueNodes;
53691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
54cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic:
55063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  SelectionDAG(TargetLowering &tli, MachineFunction &mf) : TLI(tli), MF(mf) {
56c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    EntryNode = Root = getNode(ISD::EntryToken, MVT::Other);
57c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  }
58cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ~SelectionDAG();
59cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  MachineFunction &getMachineFunction() const { return MF; }
61063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  const TargetMachine &getTarget() const;
62063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  TargetLowering &getTargetLoweringInfo() const { return TLI; }
63cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
641080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
661080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  void viewGraph();
671080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
681080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
69b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
70b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
71b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
72b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  typedef ilist<SDNode>::iterator allnodes_iterator;
73b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
74b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  allnodes_iterator allnodes_end() { return AllNodes.end(); }
75b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
76c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getRoot - Return the root tag of the SelectionDAG.
77cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
78c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &getRoot() const { return Root; }
79cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
80c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getEntryNode - Return the token chain corresponding to the entry of the
81c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// function.
82c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &getEntryNode() const { return EntryNode; }
83cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
84c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// setRoot - Set the current root tag of the SelectionDAG.
85cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
86c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const SDOperand &setRoot(SDOperand N) { return Root = N; }
87cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
881d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// Combine - This iterates over the nodes in the SelectionDAG, folding
891d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// certain types of nodes together, or eliminating superfluous nodes.  When
901d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// the AfterLegalize argument is set to 'true', Combine takes care not to
911d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// generate any nodes that will be illegal on the target.
921d4d41411190dd9e62764e56713753d4155764ddNate Begeman  void Combine(bool AfterLegalize);
931d4d41411190dd9e62764e56713753d4155764ddNate Begeman
94c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
95c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// compatible with the target instruction selector, as indicated by the
96c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// TargetLowering object.
97cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
98c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// Note that this is an involved process that may invalidate pointers into
99c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// the graph.
100063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  void Legalize();
101c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
102d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
103d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// SelectionDAG, including nodes (like loads) that have uses of their token
104d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// chain but no other uses and no side effect.  If a node is passed in as an
105d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  /// argument, it is used as the seed for node deletion.
106d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner  void RemoveDeadNodes(SDNode *N = 0);
107d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
10847725d059b259f8a0c145478300c9e9caa006b59Chris Lattner  SDOperand getString(const std::string &Val);
109c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getConstant(uint64_t Val, MVT::ValueType VT);
110056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
111c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getConstantFP(double Val, MVT::ValueType VT);
11214229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
11314229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng                             int offset = 0);
11461ca74bc3a29b2af2be7e4bd612289da8aae85b5Evan Cheng  SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
11514229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng                                   int offset = 0);
116c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getFrameIndex(int FI, MVT::ValueType VT);
117afb2dd43de61f4585e75d1f3ab93a9ac4b3b7592Chris Lattner  SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
1185839bf2b3bd22689d9dd0e9de66c2dce71d130aeChris Lattner  SDOperand getConstantPool(Constant *C, MVT::ValueType VT);
1195839bf2b3bd22689d9dd0e9de66c2dce71d130aeChris Lattner  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT);
120c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getBasicBlock(MachineBasicBlock *MBB);
121c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
1222a2de66db2093a5bc1fd620d1b6ae7992a552b24Andrew Lenharth  SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
12315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  SDOperand getValueType(MVT::ValueType);
124d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getRegister(unsigned Reg, MVT::ValueType VT);
125c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
126d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N) {
127d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyToReg, MVT::Other, Chain,
128d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner                   getRegister(Reg, N.getValueType()), N);
129cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
130cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
131e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyToReg method takes an extra operand, which
132e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
133e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
134e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N,
135e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner                         SDOperand Flag) {
136e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<MVT::ValueType> VTs;
137e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    VTs.push_back(MVT::Other);
138e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    VTs.push_back(MVT::Flag);
139e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<SDOperand> Ops;
140e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(Chain);
141e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(getRegister(Reg, N.getValueType()));
142e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(N);
143e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    if (Flag.Val) Ops.push_back(Flag);
144e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    return getNode(ISD::CopyToReg, VTs, Ops);
145e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
146e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
147d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT) {
148d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    std::vector<MVT::ValueType> ResultTys;
149d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    ResultTys.push_back(VT);
150d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    ResultTys.push_back(MVT::Other);
151d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    std::vector<SDOperand> Ops;
152d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    Ops.push_back(Chain);
153d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    Ops.push_back(getRegister(Reg, VT));
154d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::CopyFromReg, ResultTys, Ops);
15518c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  }
156e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
157e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // This version of the getCopyFromReg method takes an extra operand, which
158e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // indicates that there is potentially an incoming flag value (if Flag is not
159e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  // null) and that there should be a flag result.
160e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT,
161e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner                           SDOperand Flag) {
162e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<MVT::ValueType> ResultTys;
163e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(VT);
164e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(MVT::Other);
165e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(MVT::Flag);
166e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<SDOperand> Ops;
167e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(Chain);
168e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    Ops.push_back(getRegister(Reg, VT));
169e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    if (Flag.Val) Ops.push_back(Flag);
170e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    return getNode(ISD::CopyFromReg, ResultTys, Ops);
171e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
17218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner
173d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner  SDOperand getImplicitDef(SDOperand Chain, unsigned Reg, MVT::ValueType VT) {
174d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner    return getNode(ISD::ImplicitDef, MVT::Other, Chain, getRegister(Reg, VT));
175cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
176cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
177c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getCall - Note that this destroys the vector of RetVals passed in.
178c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  ///
179c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
1804c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner                  SDOperand Callee, bool isTailCall = false) {
1814211e73c4905af413db7524f24414c16a7f69102Chris Lattner    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain,
1824211e73c4905af413db7524f24414c16a7f69102Chris Lattner                            Callee);
183109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner    setNodeValueTypes(NN, RetVals);
184c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    AllNodes.push_back(NN);
185c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    return NN;
186cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  }
187cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
18802b86f52ed19213ef4911da902145155c03fb136Chris Lattner  /// getCall - This is identical to the one above, and should be used for calls
18902b86f52ed19213ef4911da902145155c03fb136Chris Lattner  /// where arguments are passed in physical registers.  This destroys the
19002b86f52ed19213ef4911da902145155c03fb136Chris Lattner  /// RetVals and ArgsInRegs vectors.
19102b86f52ed19213ef4911da902145155c03fb136Chris Lattner  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
1924211e73c4905af413db7524f24414c16a7f69102Chris Lattner                  SDOperand Callee, std::vector<SDOperand> &ArgsInRegs,
1934211e73c4905af413db7524f24414c16a7f69102Chris Lattner                  bool isTailCall = false) {
19402b86f52ed19213ef4911da902145155c03fb136Chris Lattner    ArgsInRegs.insert(ArgsInRegs.begin(), Callee);
19502b86f52ed19213ef4911da902145155c03fb136Chris Lattner    ArgsInRegs.insert(ArgsInRegs.begin(), Chain);
1964c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, ArgsInRegs);
197109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner    setNodeValueTypes(NN, RetVals);
19802b86f52ed19213ef4911da902145155c03fb136Chris Lattner    AllNodes.push_back(NN);
19902b86f52ed19213ef4911da902145155c03fb136Chris Lattner    return NN;
20002b86f52ed19213ef4911da902145155c03fb136Chris Lattner  }
20102b86f52ed19213ef4911da902145155c03fb136Chris Lattner
2027cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  SDOperand getCondCode(ISD::CondCode Cond);
203cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2041ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// getZeroExtendInReg - Return the expression required to zero extend the Op
2051ccae666f596d5aeca5c9942995763600b622062Chris Lattner  /// value assuming it was the smaller SrcTy value.
2061ccae666f596d5aeca5c9942995763600b622062Chris Lattner  SDOperand getZeroExtendInReg(SDOperand Op, MVT::ValueType SrcTy);
2071ccae666f596d5aeca5c9942995763600b622062Chris Lattner
208c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getNode - Gets or creates the specified node.
209cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
210c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT);
211c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT, SDOperand N);
212c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
213c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    SDOperand N1, SDOperand N2);
214c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
215c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    SDOperand N1, SDOperand N2, SDOperand N3);
216c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
2172d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4);
2182d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
219f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
220f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner                    SDOperand N5);
221f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
222c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                    std::vector<SDOperand> &Children);
2234211e73c4905af413db7524f24414c16a7f69102Chris Lattner  SDOperand getNode(unsigned Opcode, std::vector<MVT::ValueType> &ResultTys,
2244211e73c4905af413db7524f24414c16a7f69102Chris Lattner                    std::vector<SDOperand> &Ops);
225c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
2267cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// getSetCC - Helper function to make it easier to build SetCC's if you just
2277cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  /// have an ISD::CondCode instead of an SDOperand.
2287cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  ///
2297cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  SDOperand getSetCC(MVT::ValueType VT, SDOperand LHS, SDOperand RHS,
2307cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner                     ISD::CondCode Cond) {
2317cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond));
2327cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  }
2339373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
2349373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
2359373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  /// just have an ISD::CondCode instead of an SDOperand.
2369373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  ///
2379373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  SDOperand getSelectCC(SDOperand LHS, SDOperand RHS,
2389373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman                        SDOperand True, SDOperand False, ISD::CondCode Cond) {
2399373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman    MVT::ValueType VT = True.getValueType();
2409373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman    return getNode(ISD::SELECT_CC, VT, LHS, RHS, True, False,getCondCode(Cond));
2419373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman  }
2427cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
2437cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman  /// getBR2Way_CC - Helper function to make it easier to build BRTWOWAY_CC
2447cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman  /// nodes.
2457cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman  ///
2467cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman  SDOperand getBR2Way_CC(SDOperand Chain, SDOperand CCNode, SDOperand LHS,
2477cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman                         SDOperand RHS, SDOperand True, SDOperand False) {
2487cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    std::vector<SDOperand> Ops;
2497cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(Chain);
2507cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(CCNode);
2517cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(LHS);
2527cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(RHS);
2537cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(True);
2547cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    Ops.push_back(False);
2557cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman    return getNode(ISD::BRTWOWAY_CC, MVT::Other, Ops);
2567cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman  }
2577cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman
258c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// getLoad - Loads are not normal binary operators: their result type is not
259c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// determined by their operands, and they produce a value AND a token chain.
260cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
26121074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner  SDOperand getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
26221074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner                    SDOperand SV);
2635fbb5d2459a5410590f285250faa604576308a93Nate Begeman  SDOperand getVecLoad(unsigned Count, MVT::ValueType VT, SDOperand Chain,
2645fbb5d2459a5410590f285250faa604576308a93Nate Begeman                       SDOperand Ptr, SDOperand SV);
2655f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner  SDOperand getExtLoad(unsigned Opcode, MVT::ValueType VT, SDOperand Chain,
2665f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                       SDOperand Ptr, SDOperand SV, MVT::ValueType EVT);
2672d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
2682d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth  // getSrcValue - construct a node to track a Value* through the backend
269691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  SDOperand getSrcValue(const Value* I, int offset = 0);
270cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
2711b95095857b78e12138c22e76c7936611c51355bChris Lattner
2721b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// SelectNodeTo - These are used for target selectors to *mutate* the
2731b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// specified node to have the specified return type, Target opcode, and
2741b95095857b78e12138c22e76c7936611c51355bChris Lattner  /// operands.  Note that target opcodes are stored as
275eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.  The 0th value
276eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  /// of the resultant node is returned.
277eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT);
278eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
279eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1);
280eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
281eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2);
282eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
283eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3);
284eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
285eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
286eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4);
287eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
288eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
289eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4, SDOperand Op5);
290eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
291eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
292eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op4, SDOperand Op5, SDOperand Op6);
293eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
294eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
295eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
296eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
297eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3);
298eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
299eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
300eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3, SDOperand Op4);
301eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
302eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
303eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner                         SDOperand Op3, SDOperand Op4, SDOperand Op5);
304753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
305753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT) {
306753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, VT);
307753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner  }
308056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
309056f9f61d071c6c583951678f2bf543a1316efccChris Lattner                          SDOperand Op1) {
310056f9f61d071c6c583951678f2bf543a1316efccChris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1);
311056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  }
312056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
313056f9f61d071c6c583951678f2bf543a1316efccChris Lattner                          SDOperand Op1, SDOperand Op2) {
314056f9f61d071c6c583951678f2bf543a1316efccChris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2);
315056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  }
3163cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
3173cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2) {
3183cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    std::vector<MVT::ValueType> ResultTys;
3193cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    ResultTys.push_back(VT1);
3203cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    ResultTys.push_back(VT2);
3213cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    std::vector<SDOperand> Ops;
3223cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    Ops.push_back(Op1);
3233cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    Ops.push_back(Op2);
3243cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
3253cd82619a84f97fa14e8f80ddcf8b858b4eaf2d2Chris Lattner  }
326056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
327056f9f61d071c6c583951678f2bf543a1316efccChris Lattner                          SDOperand Op1, SDOperand Op2, SDOperand Op3) {
328056f9f61d071c6c583951678f2bf543a1316efccChris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3);
329056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  }
3305ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
3315ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
3325ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman                          SDOperand Op4) {
3335ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4);
3345ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman  }
3355ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
3365ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
3375ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman                          SDOperand Op4, SDOperand Op5) {
3385ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5);
3395ce0d308e6d7ada28adce0465c14c8197fcc0c8dNate Begeman  }
340420089c47c58f41c188a5f5f282377771d67462bChris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
341420089c47c58f41c188a5f5f282377771d67462bChris Lattner                          std::vector<SDOperand> &Ops) {
342420089c47c58f41c188a5f5f282377771d67462bChris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
343420089c47c58f41c188a5f5f282377771d67462bChris Lattner  }
344e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
345e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner                          MVT::ValueType VT2, std::vector<SDOperand> &Ops) {
346e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    std::vector<MVT::ValueType> ResultTys;
347e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(VT1);
348e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    ResultTys.push_back(VT2);
349e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
350e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner  }
3516542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
3526542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
35326005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// This can cause recursive merging of nodes in the DAG.  Use the first
35426005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// version if 'From' is known to have a single result, use the second
35526005b1b672aebd437edc561d381c5dd19a03ddbChris Lattner  /// if you have two nodes with identical results, use the third otherwise.
3566542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  ///
357fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// These methods all take an optional vector, which (if not null) is
358fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// populated with any nodes that are deleted from the SelectionDAG, due to
359fde3f3061d665babeb78443119a09876098fc35eChris Lattner  /// new equivalences that are discovered.
360fde3f3061d665babeb78443119a09876098fc35eChris Lattner  ///
361fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDOperand From, SDOperand Op,
362fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
363fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
364fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
365fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void ReplaceAllUsesWith(SDNode *From, const std::vector<SDOperand> &To,
366fde3f3061d665babeb78443119a09876098fc35eChris Lattner                          std::vector<SDNode*> *Deleted = 0);
3676542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner
368ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner
369ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  /// DeleteNode - Remove the specified node from the system.  This node must
370ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  /// have no referrers.
371ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner  void DeleteNode(SDNode *N);
372ba8a0e0d7f03b7cac03ff1eaf9f048eb9d32bd46Chris Lattner
373cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  void dump() const;
374d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner
375d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattnerprivate:
3761b95095857b78e12138c22e76c7936611c51355bChris Lattner  void RemoveNodeFromCSEMaps(SDNode *N);
3776542d950609208de3e1cde704c5f89aad864c0d9Chris Lattner  SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
378f0e80cf909b69b5f31b8d027de6ee4b963205f66Chris Lattner  void DestroyDeadNode(SDNode *N);
379fde3f3061d665babeb78443119a09876098fc35eChris Lattner  void DeleteNodeNotInCSEMaps(SDNode *N);
380109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  void setNodeValueTypes(SDNode *N, std::vector<MVT::ValueType> &RetVals);
381109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  void setNodeValueTypes(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2);
382109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
3837cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
38432c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman  /// SimplifySetCC - Try to simplify a setcc built with the specified operands
38532c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman  /// and cc.  If unable to simplify it, return a null SDOperand.
3864cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner  SDOperand SimplifySetCC(MVT::ValueType VT, SDOperand N1,
3874cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner                          SDOperand N2, ISD::CondCode Cond);
388109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
389109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  // List of non-single value types.
390109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner  std::list<std::vector<MVT::ValueType> > VTList;
391109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
3921cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  // Maps to auto-CSE operations.
393ab2eb66f07689dc1698ace2182e77395254ad83dChris Lattner  std::map<std::pair<unsigned, MVT::ValueType>, SDNode *> NullaryOps;
3941cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<unsigned, std::pair<SDOperand, MVT::ValueType> >,
3951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> UnaryOps;
3961cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<unsigned, std::pair<SDOperand, SDOperand> >,
3971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> BinaryOps;
3981cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
399d6a80778e5a5fab339036b2f462d3039efe28a08Chris Lattner  std::map<std::pair<unsigned, MVT::ValueType>, RegisterSDNode*> RegNodes;
4007cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner  std::vector<CondCodeSDNode*> CondCodeNodes;
4011cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
4021cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<SDOperand, std::pair<SDOperand, MVT::ValueType> >,
4031cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner           SDNode *> Loads;
4041cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner
40514229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  std::map<std::pair<const GlobalValue*, int>, SDNode*> GlobalValues;
40614229bb6369c110644c11bc7906b0c1167d3a87aEvan Cheng  std::map<std::pair<const GlobalValue*, int>, SDNode*> TargetGlobalValues;
4071cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
408056f9f61d071c6c583951678f2bf543a1316efccChris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants;
409b29cb29364d3e22f062c695d2d5740dda42d8e8eChris Lattner  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
410afb2dd43de61f4585e75d1f3ab93a9ac4b3b7592Chris Lattner  std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
4115839bf2b3bd22689d9dd0e9de66c2dce71d130aeChris Lattner  std::map<Constant *, SDNode*> ConstantPoolIndices;
4125839bf2b3bd22689d9dd0e9de66c2dce71d130aeChris Lattner  std::map<Constant *, SDNode*> TargetConstantPoolIndices;
4131cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner  std::map<MachineBasicBlock *, SDNode*> BBNodes;
41415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner  std::vector<SDNode*> ValueTypeNodes;
4155f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner  std::map<std::string, SDNode*> ExternalSymbols;
4162a2de66db2093a5bc1fd620d1b6ae7992a552b24Andrew Lenharth  std::map<std::string, SDNode*> TargetExternalSymbols;
41747725d059b259f8a0c145478300c9e9caa006b59Chris Lattner  std::map<std::string, StringSDNode*> StringNodes;
4184211e73c4905af413db7524f24414c16a7f69102Chris Lattner  std::map<std::pair<unsigned,
4196765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner                     std::pair<MVT::ValueType, std::vector<SDOperand> > >,
4206765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner           SDNode*> OneResultNodes;
4216765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner  std::map<std::pair<unsigned,
4224211e73c4905af413db7524f24414c16a7f69102Chris Lattner                     std::pair<std::vector<MVT::ValueType>,
4234211e73c4905af413db7524f24414c16a7f69102Chris Lattner                               std::vector<SDOperand> > >,
4244211e73c4905af413db7524f24414c16a7f69102Chris Lattner           SDNode*> ArbitraryNodes;
425cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner};
426cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
4271080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
4281080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  typedef SelectionDAG::allnodes_iterator nodes_iterator;
4291080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_begin(SelectionDAG *G) {
4301080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_begin();
4311080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
4321080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  static nodes_iterator nodes_end(SelectionDAG *G) {
4331080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    return G->allnodes_end();
4341080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  }
4351080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner};
4361080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
437b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner}  // end namespace llvm
438cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
439cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#endif
440